Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
maSt
5 / 5 / 1
Регистрация: 28.02.2010
Сообщений: 166
#1

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

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

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

я создаю структуру такого типа
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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.12.2012, 12:16
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Массив структур, непонимание деталей (C++):

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

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

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

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

Ввести массив структур; рассортировать массив в алфавитном порядке - C++
Пришел из армии восстановился в универе и тут сразу курсавай. Помогите Исходные данные(описание структуры): Информация об...

Как передать массив структур в функцию в качестве параметра, чтобы изменения в функции меняли исходный массив? - C++
Допустим есть структура struct Base { int a; int b; int c; }; В основном методе main() объявим массив...

5
palva
3087 / 2221 / 375
Регистрация: 08.06.2007
Сообщений: 8,106
Записей в блоге: 4
23.12.2012, 12:58 #2
Вы присваиваете NULL не элементам структуры, а тому указателю, который вернула вам операция new. При этом память выделенную под массив вы сразу же потеряли.
Дальше непонятно, какой тип у elem. Если это указатель на структуру, то прибавление к нему целого числа сдвинет указатель не на целое число структур, а на целое число байтов. Так что скорее всего после этой операции указатель будет указывать не на начало очередной структуры, а в ее середину.
0
maSt
5 / 5 / 1
Регистрация: 28.02.2010
Сообщений: 166
23.12.2012, 13:23  [ТС] #3
спасибо за ответы, а как тогда выбирать в какаю именно структур из массива я буду записывать?
0
palva
3087 / 2221 / 375
Регистрация: 08.06.2007
Сообщений: 8,106
Записей в блоге: 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
maSt
5 / 5 / 1
Регистрация: 28.02.2010
Сообщений: 166
23.12.2012, 14:20  [ТС] #5
Но мне все еще не понятно , как сохранить начало каждой из структур записанных в массиве.
Я пытаюсь сделать такой же массив для сохранения в нем начал, но он вообще не принимает данные значения.
0
palva
3087 / 2221 / 375
Регистрация: 08.06.2007
Сообщений: 8,106
Записей в блоге: 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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.12.2012, 14:54
Привет! Вот еще темы с ответами:

Непонимание условия задачи - C++
Помогите пожалуйста понять, почему тест не принимает задачу? Всё правильно выводит. Возможно не так нужно вводить значения? И ещё вопрос:...

Использование классов. (или непонимание написания:) - C++
Объявить класс «натуральное число» и определить его методы. Определить число, полученное из заданного натурального числа n, путем...

Массив структур - C++
Задание само вот такое 1. Сформировать динамический массив из элементов структурного типа. Структурный тип определен в варианте. ...

Массив структур - C++
С помощью массива структур описать каталог компьютерных игр, предусмотрев следующие характеристики: название, производитель, год издания,...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru