Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
0 / 0 / 0
Регистрация: 13.05.2012
Сообщений: 12
1

Двусвязный список из структур

13.10.2012, 12:55. Просмотров 1850. Ответов 5
Метки нет (Все метки)

Ребят, помогите, а то не могу пример откопилировать...
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
27
28
    typedef  struct tag_lib {                   //задается таблица с данными в виде структуры  
        char  name[100];                        //имя сотрудника
        int  years_old;                         //возраст сотрудника
 
    } LIB;
 
    typedef  struct tag_obj {                   //структура с адресами следующих и предыдущих эл.
        LIB lib; 
        LIB *prev, *next; 
 
    } OBJ; 
 
 
OBJ* add_obj(char *name, int years_old) 
{ 
    OBJ* current = (OBJ*)malloc(sizeof(OBJ)); 
    LIB* head = NULL; 
    LIB* tail = NULL; 
    strcpy_s(current->lib.name, name);
    current ->lib.years_old = years_old;  
    current -> prev = tail;  
    current -> next = NULL; 
    if (tail != NULL)  
        tail -> next = current; 
    if (head == NULL) head = current; 
    tail = current;  
    return current;  
}
Пока остановился на:
.cpp(25): error C2039: next: не является членом "tag_lib"
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.10.2012, 12:55
Ответы с готовыми решениями:

Заменить массив структур на односвязный список, и на двусвязный список
Взять текст задания и заменить массив структур на односвязный список, и на двусвязный список ...

Двусвязный список структур
Написал программу,а она не запускается. И ошибок не выдает. Подскажите пожайлуста что не так...

Переделать двусвязный список в двусвязный кольцевой
Здравствуйте, у меня єсть двусвязный список однако он не кольцевой! как это запрограммировать? и...

Сформировать список из 10 работников, используя динамическую структуру данных двусвязный список
спасайте Сформировать список из 10 работников, используя динамическую структуру данных...

5
842 / 773 / 258
Регистрация: 27.07.2012
Сообщений: 2,180
13.10.2012, 13:34 2
C++
1
2
3
4
5
6
7
8
    OBJ* current = (OBJ*)malloc(sizeof(OBJ)); 
 //...
    LIB* tail = NULL; 
//...
    if (tail != NULL)  
        tail -> next = current; 
// ...
    tail = current;
1) tail - указатель на LIB, у стурктуры LIB нет поля next.
2) current - указатель на OBJ. Нельзя указателю на LIB присвоить указатель на OBJ.
Что-то не так у тебя либо в примере, либо в том, как ты его переписал.
0
0 / 0 / 0
Регистрация: 13.05.2012
Сообщений: 12
13.10.2012, 13:43  [ТС] 3
В моей методе с примерами все не так))) Я всякое разное делал это максимально похожее на нормальный код что я смог сделать.

Я наверное начал понимать...
C++
1
2
3
4
5
6
OBJ* add_obj(char *name, int years_old) 
{ 
    OBJ* current = (OBJ*)malloc(sizeof(OBJ)); 
    LIB* head = NULL; 
    LIB* tail = NULL; 
    strcpy_s(current->lib.name, name);
Я впихнул "голову" и "хвост" в эту функцию. Наверное им там не место, но куда тогда их деть?
0
842 / 773 / 258
Регистрация: 27.07.2012
Сообщений: 2,180
13.10.2012, 14:04 4
Во-первых, вот эта штука:
C++
1
OBJ* current = (OBJ*)malloc(sizeof(OBJ));
Не создаёт объектв OBJ, который тебе нужен.
Используй
C++
1
OBJ* current = new OBJ;
Далее, добавляя объект в список, нужно скорректировать указатели на следующий и предыдущий. Куда ты добавляешь элемент: в начало или в конец списка?

Если в начало, то тебе понадобится указатель на элемент, являющийся началом списка перед добавлением, если в конец - являющийся концом. Его тоже нужно передавать в функцию.
0
0 / 0 / 0
Регистрация: 13.05.2012
Сообщений: 12
13.10.2012, 14:25  [ТС] 5
Ну это вроде ясно, но где объявлять указатели на конец и начало? в моем случае head и tail? в typedef struct tag_obj или в самой функции добавления элементов?
0
842 / 773 / 258
Регистрация: 27.07.2012
Сообщений: 2,180
13.10.2012, 16:14 6
Цитата Сообщение от phoenix12297 Посмотреть сообщение
где объявлять указатели на конец и начало? в моем случае head и tail? в typedef struct tag_obj или в самой функции добавления элементов?
в твоём случае передаёшь их в функцию:
C++
1
2
3
4
5
6
7
void add_to_begin(/*тут нужные параметры*/, OBJ * tail)
{
    OBJ * newTail = new OBJ;
    /* тут заполни структуру данными */
    newTail->next = tail;
    tail->prev = newTail;
}
Как-то так. Можно также добавить проверку, что в функцию передали именно "голову" списка: у головы указатель prev должен быть NULL.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.10.2012, 16:14

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Двусвязный список (в конец двусвязного списка добавить другой список)
здравствуйте, подскажите пожалуйста, как в конец двусвязного списка добавить другой список?

Составить двусвязный список на основе класса, объекты которого будут формировать этот список
Составить двусвязный список на основе класса, объекты которого будут формировать этот список. В...

Создать двусвязный список групп факультета, где каждая группа представляет собой односвязный список студентов
Задание: создайте двусвязный список групп факультета. Каждая группа представляет собой односвязный...

Преобразовать односвязный список в двусвязный список
Доброго времени суток! Помогите, пожалуйста, преобразовать программу из односвязного списка в...


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

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

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