С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
5 / 5 / 3
Регистрация: 28.02.2010
Сообщений: 166
1

Массив структур, непонимание деталей

23.12.2012, 12:16. Показов 451. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем добрый день.
Есть несколько маленьких вопросов по массивам структур. И извините за странные названия переменных.

я создаю структуру такого типа
C++
1
2
3
4
5
6
7
class Lancuch
{
public:
    char cos;
    Lancuch * nastepny;
};
Lancuch * poczatek = NULL;

в main создаю свой массив структур и пытаюсь создать массив в котором буду хранить начало каждого списка
C++
1
2
Lancuch * elem= new Lancuch[n]; // массив структур
    Lancuch * poczatek= new Lancuch[n] = NULL; //сюда хочу записывать начало каждого элемента из массива
И тут сразу же первый вопрос
C++
1
Lancuch * poczatek= new Lancuch[n] = NULL;
Нормально ли так "нуллить" каждый элемент массива?


Дальше пытаюсь добавлять данные к выбранному элементу массива.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
        int numer;
    char p;
    cin >> numer;
    cin >> p;
    if (poczatek==NULL)
    {
        (elem+numer)->cos=p;
        poczatek=(elem+numer); // для того чтобы все работало по задумке,
        elem->nastepny=NULL;   //тут должно быть (poczatek+numer)=(elem+numer);
    }                                        //но именно так не работает и выкидывает ошибку
    else
    {
        (elem+numer)->nastepny = new Lancuch;
        elem= (elem+numer)->nastepny;   // так же как и тут, мне кажется что для того чтобы работало нужно
        (elem+numer)->cos=p;                // написать (elem+numer)= (elem+numer)->nastepny;
        (elem+numer)->nastepny=NULL;
 
    }
В двух местах которые я прокомментировал выдает ошибку, я просто не могу понять из-за чего. Подскажите что нужно исправить и из-за чего не работает?

и последний вопрос. Может лучше тогда просто в структуру добавить
C++
1
Lancuch * poczatek;
просто чтобы каждый элемент тогда сохранял в себе указатель на первый?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.12.2012, 12:16
Ответы с готовыми решениями:

Структуры.Обработка массивов структур.Создать массив структур из 10-ти элементов
Создать массив структур из 10-ти элементов: <Номер договора><Фамилия клиента><стоимость...

Блочная сортировка структур (Отсортировать массив структур по фамилии)
Подскажите алгоритм блочной сортировки структур на языке С++. Мне нужно отсортировать массив...

Динамический массив структур в другом массиве структур
Можно ли реализовать динамический (или статический) массив структур в другом массиве структур?...

Массив структур, сохранение начала каждой из структур
Я создал такую структуру class Lancuch { public: char cos; Lancuch * nastepny; }; Lancuch...

5
4255 / 2951 / 688
Регистрация: 08.06.2007
Сообщений: 9,858
Записей в блоге: 4
23.12.2012, 12:58 2
Вы присваиваете NULL не элементам структуры, а тому указателю, который вернула вам операция new. При этом память выделенную под массив вы сразу же потеряли.
Дальше непонятно, какой тип у elem. Если это указатель на структуру, то прибавление к нему целого числа сдвинет указатель не на целое число структур, а на целое число байтов. Так что скорее всего после этой операции указатель будет указывать не на начало очередной структуры, а в ее середину.
0
5 / 5 / 3
Регистрация: 28.02.2010
Сообщений: 166
23.12.2012, 13:23  [ТС] 3
спасибо за ответы, а как тогда выбирать в какаю именно структур из массива я буду записывать?
0
4255 / 2951 / 688
Регистрация: 08.06.2007
Сообщений: 9,858
Записей в блоге: 4
23.12.2012, 13:54 4
Извините, был неправ. Сдвиг действительно происходит не по байтам, а по элементам массива. Если же отвечать на ваш вопрос, то лучше использовать синтаксис массива. Инициализировать каждую структуру можно прописав в нее конструктор по умолчанию.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
using namespace std;
class Lancuch
{
public:
    char cos;
    Lancuch * nastepny;
    Lancuch() {this->cos='w'; this->nastepny=NULL;}
};
Lancuch * poczatek = NULL;
int main(void)
{
    poczatek = new Lancuch[10];
    int i=5;
    poczatek[i].cos='t';
    char c=(poczatek+i)->cos;
    cout << c << endl; // t
    delete poczatek;
    return 0;
}
1
5 / 5 / 3
Регистрация: 28.02.2010
Сообщений: 166
23.12.2012, 14:20  [ТС] 5
Но мне все еще не понятно , как сохранить начало каждой из структур записанных в массиве.
Я пытаюсь сделать такой же массив для сохранения в нем начал, но он вообще не принимает данные значения.
0
4255 / 2951 / 688
Регистрация: 08.06.2007
Сообщений: 9,858
Записей в блоге: 4
23.12.2012, 14:54 6
Указатель на структуру указывает на ее начало. То есть нам надо завести массив указателей и присвоить им указатели. Примерно так.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <iostream>
using namespace std;
class Lancuch
{
public:
    char cos;
    Lancuch * nastepny;
    Lancuch() {this->cos='w'; this->nastepny=NULL;}
};
Lancuch * poczatek = NULL;
Lancuch ** begin_poczatek;
int main(void)
{
    int n=10;
    int i;
    poczatek = new Lancuch[n];
    begin_poczatek= new Lancuch* [n];
    for (i=0; i<n; i++) begin_poczatek[i] = &poczatek[i];
    i=5;
    poczatek[i].cos='t';
    char c=begin_poczatek[i]->cos;
    cout << c << endl; // t
    delete begin_poczatek;
    delete poczatek;
    return 0;
}
0
23.12.2012, 14:54
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.12.2012, 14:54
Помогаю со студенческими работами здесь

Как объявить динамический массив структур, и как выглядит обращение к полям структур по указателю?
Ребята подскажите как объявить динамический массив структур, и как выглядит обращение к полям...

Массив структур в массиве структур
Всем добрый день. Делаю менюшку для управления и терзаю Arduino IDE слегка подвис со следующей...

Составить массив структур состоящий из имени и цены,по введенному имени изменить цену,вывести обновленный массив структур
составить массив структур состоящий из имени и цены,по введенному имени изменить цену,вывести...

Из партии в 100 деталей, содержащей 5 % брака, берут для проверки 5 деталей
2. Из партии в 100 деталей, содержащей 5 % брака, берут для проверки 5 деталей. Партия...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru