Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.06.2012, 17:29   #1
Dady 1992
Пользователь
 
Регистрация: 22.06.2012
Сообщений: 11
По умолчанию Связные списки

Друзья, помогите исправить код!!! Программа описывет таблицу о книгах.(Название, автор, стоимость). Почему он поддчеркивает head, next, prev?

Код:
typedef struct tag_lib { 
char title[100]; 
char author[100]; 
int value; 
} LIB;

/*Структура, которая описывает связи между строками таблицы, и представляет собой объект данных.
Здесь *prev и *next – указатели на предыдущую и следующую строки соответственно.*/
/////////////////////////////////////////////////////////
typedef struct tag_obj { 
LIB lib; 
typedef struct tag_obj* prev, *next; 
} OBJ;

///////////////////////////////////////////////////////
OBJ* add_obj(char* title, char* author, int value)//функция использует три параметра для ввода данных в структуру LIB.
{                                              
 OBJ* current = (OBJ *)malloc(sizeof(OBJ));//создается новая структура типа OBJ.
 strcpy(current->lib.title, title); //запись информации в структуру LIB
 strcpy(current->lib.author, author); //запись информации в структуру LIB
 current->lib.value = value; //запись информации в структуру LIB
 current->prev = tail;//инициализируются указатель prev добавленного объекта
 //prev указывает на предыдущий объект, т.е. равен указателю tail.
 current->next = NULL;//инициализируются указатель next добавленного объекта 
 //добавление осуществляется в конец списка, то указатель next должен быть равен NULL
 if(tail != NULL) tail->next = current; 
 /*объект, на который указывает указатель tail, становится предпоследним и его 
 указатель next должен указывать на последний объект, т.е. быть равным указателю current.*/
 if(head == NULL) head = current; 
 /*Затем проверяется, является ли добавляемый объект первым (head == NULL), 
 и если это так, то указатель head приравнивается указателю current */
 tail = current;//указатель tail инициализируется на последний объект
 return current;//возвращает указатель на созданный объект
}

///////////////////////////////////////////////////////
OBJ* del_obj(OBJ* current)//функция удаления элемента.
{ //del_obj() в качестве аргумента использует указатель на объект, который следует удалить.
 if(current == head) 
//Сначала выполняется проверка для инициализации указателя head, в том случае, 
//если удаляется первый объект, на который он указывает.
if(current->prev != NULL) head = current->prev; 
 else head = current->next; 
 if(current == tail) //Аналогичная проверка осуществляется для tail.
if(current->next != NULL) tail = current->next; 
 else tail = current->prev; 
 if(current->prev != NULL) 
//проверка: если предыдущий объект относительно текущего существует, 
//то его указатель на следующий объект следует переместить.
current->prev->next = current->next; 
 if(current->next != NULL) 
//Аналогичная проверка выполняется и для следующего объекта относительно удаляемого.
current->next->prev = current->prev; 
 free(current);//удаления объекта из памяти 
return head;//возвращается указатель на первый объект.
}

////////////////////////////////////////////////////
int main() 
{ 
 OBJ *current = NULL; 
 int value; 
 char title[100], author[100]; 
 do 
 { 
 printf("Введите название книги: "); 
 scanf("%s",title); 
 printf("Введите автора: "); 
 scanf("%s",author); 
 printf("Введите стоимость: "); 
 scanf("%d",&value); 
 current = add_obj(title,author,value);//формирует связанный список на основе введенных данных.
 printf("Для выхода введите 'q'"); 
 } while(scanf("%d",&value) == 1); 
 current = head; //указатель current передвигается на первый объект
 while(current != NULL) 
 { 
 printf("Title: %s, author %s, value = %d\n", 
 current->lib.title, current->author.old, current->lib.value); 
 current = current->next; 
 } 
 while(head != NULL) 
 del_obj(head); 
 return 0; 
}
Dady 1992 вне форума Ответить с цитированием
Старый 23.06.2012, 18:36   #2
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

Цитата:
typedef struct tag_obj {
LIB lib;
typedef struct tag_obj* prev, *next;
} OBJ;
убери .
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 23.06.2012, 19:12   #3
Dady 1992
Пользователь
 
Регистрация: 22.06.2012
Сообщений: 11
По умолчанию

Цитата:
Сообщение от pproger Посмотреть сообщение
убери .
Убрал, также всё поддчеркивает и стал на другое ругаться. Подскажите пожалуйста в чём дело?
Dady 1992 вне форума Ответить с цитированием
Старый 23.06.2012, 19:24   #4
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию

Покажи на что ругается!
coNsept вне форума Ответить с цитированием
Старый 23.06.2012, 19:26   #5
Dady 1992
Пользователь
 
Регистрация: 22.06.2012
Сообщений: 11
По умолчанию

такая ошибка: error C2228: выражение слева от ".old" должно представлять класс, структуру или объединение Вот в этой строчке:
Код:
current->lib.title, current->author.old, current->lib.value);
Dady 1992 вне форума Ответить с цитированием
Старый 23.06.2012, 19:30   #6
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию

Добавь поле int old в структуру и английски подучи. Компилятор явно говорит что old не является членом структуры, класса или объединения.

Код:
current->lib.title, current->lib.old, current->lib.value);
Или здесь не имеется ввиду про поле old а просто кто-то допустил ошибку и дописал к author (.old)

то есть, тогда нужно так:
Код:
current->lib.title, current->lib.author, current->lib.value);

Последний раз редактировалось coNsept; 23.06.2012 в 19:35.
coNsept вне форума Ответить с цитированием
Старый 23.06.2012, 19:34   #7
Dady 1992
Пользователь
 
Регистрация: 22.06.2012
Сообщений: 11
По умолчанию

Цитата:
Сообщение от coNsept Посмотреть сообщение
Добавь поле int old в структуру и английски подучи. Компилятор явно говорит что old не является членом структуры, класса или объединения.

Код:
current->lib.title, current->lib.old, current->lib.value);
то есть:
Код:
current->lib.title, current->lib.author, current->lib.value);
Спасибо большое помогло! Обязательно подучу.
Dady 1992 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Связные списки С++ Gedbro Общие вопросы C/C++ 1 06.06.2012 10:59
Связные списки c++ cheef Помощь студентам 5 11.03.2012 22:12
Связные списки MasterSporta Общие вопросы C/C++ 2 19.05.2011 02:30
Связные списки в графах Neitrosha Помощь студентам 0 17.05.2011 20:38
Связные списки Маринка777 Общие вопросы .NET 3 08.06.2010 23:41