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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.10.2015, 10:03   #1
vova_makr
Пользователь
 
Регистрация: 25.09.2015
Сообщений: 42
По умолчанию На Си нужно вывести на екран двусвязный список

На Си нужно вывести на екран двусвязный список с головы и с хвоста
С головы у меня все норм выводит а от с хвоста зациклываеться:
Код:
void PrintForward(const DoublyLinkedList* list)
{
	for (DoublyLinkedList::Node* node = list->head; node != nullptr; node = node->nextNode)
		printf("%d\n", node->value);
	printf("\n");
}
void PrintBackward(const DoublyLinkedList* list)
{
	for (DoublyLinkedList::Node* node = list->tail; node != nullptr; node = node->prevNode)
		printf("%d\n", node->value);
	printf("\n");
}
vova_makr вне форума Ответить с цитированием
Старый 27.10.2015, 10:12   #2
Bayern_M
Форумчанин
 
Регистрация: 18.03.2015
Сообщений: 114
По умолчанию

Можно узнать значение list->head->prevNode?

Или посмотреть на сам список, если он статический.
Bayern_M вне форума Ответить с цитированием
Старый 27.10.2015, 10:27   #3
vova_makr
Пользователь
 
Регистрация: 25.09.2015
Сообщений: 42
По умолчанию

Цитата:
Сообщение от Bayern_M Посмотреть сообщение
Можно узнать значение list->head->prevNode?

Или посмотреть на сам список, если он статический.
Код:
DoublyLinkedList* CreateDoublyLinkedList()
{
	DoublyLinkedList* list = (DoublyLinkedList*)malloc(sizeof(DoublyLinkedList));
	list->head = nullptr;
	list->tail = nullptr;

	return list;
}
void InsertFirst(DoublyLinkedList* list, int value)
{
	DoublyLinkedList::Node* newNode = (DoublyLinkedList::Node*)malloc(sizeof(DoublyLinkedList));
	newNode->nextNode = list->head;
	newNode->value = value;
	list->head = newNode;

	if (list->tail == nullptr)
		list->tail = newNode;
}
int main(){
DoublyLinkedList* list = CreateDoublyLinkedList();
	InsertFirst(list, 5);
	InsertFirst(list, 4);
	InsertFirst(list, 6);
	InsertFirst(list, 8);
	PrintForward(list);
	PrintBackward(list);

return 0;
}
vova_makr вне форума Ответить с цитированием
Старый 27.10.2015, 10:37   #4
Bayern_M
Форумчанин
 
Регистрация: 18.03.2015
Сообщений: 114
По умолчанию

Где в вашем коде вы работаете с полем prevNode? Из того, что Вы написали, получается список только в одну сторону через указатель на next
Bayern_M вне форума Ответить с цитированием
Старый 27.10.2015, 10:54   #5
vova_makr
Пользователь
 
Регистрация: 25.09.2015
Сообщений: 42
По умолчанию

Цитата:
Сообщение от Bayern_M Посмотреть сообщение
Где в вашем коде вы работаете с полем prevNode? Из того, что Вы написали, получается список только в одну сторону через указатель на next
в InsertFirst ??
я тут с prevNode
Код:
struct DoublyLinkedList
{
	struct Node
	{
		int value;
		Node* nextNode;
		Node* prevNode;
	};
	Node* head;
	Node* tail;
};

Последний раз редактировалось vova_makr; 27.10.2015 в 10:59.
vova_makr вне форума Ответить с цитированием
Старый 27.10.2015, 11:01   #6
Bayern_M
Форумчанин
 
Регистрация: 18.03.2015
Сообщений: 114
По умолчанию

Цитата:
Сообщение от vova_makr Посмотреть сообщение
в InsertFirst ??
В InsertFirst я вижу работу только с полем newNode->nextNode, а newNode->prevNode Вы никак не задаёте.

Как результат, в функции PrintBackward при задании условий цикла node->prevNode у Вас никак не определено.

Цитата:
Сообщение от vova_makr Посмотреть сообщение
в InsertFirst ??
я тут с prevNode
Код:
struct DoublyLinkedList
{
	struct Node
	{
		int value;
		Node* nextNode;
		Node* prevNode;
	};
	Node* head;
	Node* tail;
};
В динамическом списке (ваш случай) Вам нужно хранить только голову и хвост. Т.е. переменная списка будет иметь вид

Код:
struct DoublyLinkedList
{
	struct node *head;
	struct node *tail;
};
Как я уже сказал, в вашей ноде есть поле prevNode, но при создании очередной ноды в функции InsertFirst вы никак его не инициализируете.

Последний раз редактировалось Stilet; 27.10.2015 в 11:15.
Bayern_M вне форума Ответить с цитированием
Старый 27.10.2015, 12:08   #7
vova_makr
Пользователь
 
Регистрация: 25.09.2015
Сообщений: 42
По умолчанию

Цитата:
Сообщение от Bayern_M Посмотреть сообщение
В InsertFirst я вижу работу только с полем newNode->nextNode, а newNode->prevNode Вы никак не задаёте.

Как результат, в функции PrintBackward при задании условий цикла node->prevNode у Вас никак не определено.



В динамическом списке (ваш случай) Вам нужно хранить только голову и хвост. Т.е. переменная списка будет иметь вид

Код:
struct DoublyLinkedList
{
	struct node *head;
	struct node *tail;
};
Как я уже сказал, в вашей ноде есть поле prevNode, но при создании очередной ноды в функции InsertFirst вы никак его не инициализируете.
я понял, переделаю
а эту функцию я правильно сделал?:
Код:
void Clear(DoublyLinkedList* list)
{
	for (DoublyLinkedList::Node* node = list->head; node != nullptr;)
	{
		DoublyLinkedList::Node* nextNode = node->nextNode;
		free(node);
		node = nextNode;
	}
	list->head = nullptr;
	list->tail = nullptr;
}
vova_makr вне форума Ответить с цитированием
Старый 27.10.2015, 12:19   #8
vova_makr
Пользователь
 
Регистрация: 25.09.2015
Сообщений: 42
По умолчанию

Инициализовал:
Код:
void InsertFirst(DoublyLinkedList* list, int value)
{
	DoublyLinkedList::Node* newNode = (DoublyLinkedList::Node*)malloc(sizeof(DoublyLinkedList));
	newNode->nextNode = list->head;
	newNode->value = value;
	newNode->prevNode = nullptr;
	list->head = newNode;

	if (list->tail == nullptr)
		list->tail = newNode;
}
vova_makr вне форума Ответить с цитированием
Старый 27.10.2015, 12:20   #9
Bayern_M
Форумчанин
 
Регистрация: 18.03.2015
Сообщений: 114
По умолчанию

Цитата:
Сообщение от vova_makr Посмотреть сообщение
я понял, переделаю
а эту функцию я правильно сделал?:
Код:
void Clear(DoublyLinkedList* list)
{
	for (DoublyLinkedList::Node* node = list->head; node != nullptr;)
	{
		DoublyLinkedList::Node* nextNode = node->nextNode;
		free(node);
		node = nextNode;
	}
	list->head = nullptr;
	list->tail = nullptr;
}
Здесь очень много ошибок, разбирать которые времени нет - сам на работе сижу пишу Но хотелось бы выделить самое главное Вам на будущее

Так список не обходят. Это нерабочий подход. Односвязный список обходят через while. Например так:

Код:
while (node) {                      
    *действия над нодой*
    node=node->next;         
}

Последний раз редактировалось Bayern_M; 27.10.2015 в 12:27.
Bayern_M вне форума Ответить с цитированием
Старый 27.10.2015, 12:26   #10
Bayern_M
Форумчанин
 
Регистрация: 18.03.2015
Сообщений: 114
По умолчанию

Цитата:
Сообщение от vova_makr Посмотреть сообщение
Инициализовал:
Код:
void InsertFirst(DoublyLinkedList* list, int value)
{
	DoublyLinkedList::Node* newNode = (DoublyLinkedList::Node*)malloc(sizeof(DoublyLinkedList));
	newNode->nextNode = list->head;
	newNode->value = value;
	newNode->prevNode = nullptr;
	list->head = newNode;

	if (list->tail == nullptr)
		list->tail = newNode;
}
Почитайте несколько раз
http://lord-n.narod.ru/download/book..._C/22/2206.htm
Bayern_M вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Двусвязный список b0006 C# (си шарп) 1 14.11.2014 18:09
c++ двусвязный список world12_tk Помощь студентам 1 15.10.2011 12:36
двусвязный список Olezhka Помощь студентам 1 23.03.2011 11:00
Двусвязный список Work Group Паскаль, Turbo Pascal, PascalABC.NET 12 13.07.2010 01:44
Немогу вывести результат на екран dasha novikova Помощь студентам 0 09.03.2010 19:29