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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.12.2010, 20:00   #1
yandzee
Пользователь
 
Регистрация: 07.12.2010
Сообщений: 13
По умолчанию Не понимаю, как работает односвязный список

Читаю в книге пример:


Код:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct user {
	char name[70];
	char last[70];
	struct user *next;
} user;
int main(int argc, char *argv[])
{
	user *current, *head = NULL, *prev;
	char temp[70];
	
	puts("Введите имя:");
	while((gets(temp)) !=NULL && temp[0] != '\0')
	{
		current = (user *)malloc(sizeof(user));
		if(head == NULL)
			head = current;
		else
			prev->next =current;
		current->next = NULL;
			
		strcpy(current->name, temp);
		puts("Введите фамилию");
		scanf("%s", &current->last);
		while(getchar() != '\n')
			continue;
		printf("Отлично, %s, желаете ли Вы добавить еще одного пользователя? (пустая строка для выхода)\n", current->name);
		prev = current;
		
	}
	current = head;
	while(current != NULL)
	{
		printf("%s %s\n", current->name, current->last);
		current = current->next;
	}
	return 0;
}
В первом цикле while()...
Заполняются имя и фамилия, предыдущая структура становиться текущей, чтобы связный список работал, но тут я не понимаю - когда я вбиваю второй раз данные, prev = current перекрывает предыдущие данные prev, однако список работает, не понимаю как такое может быть...

Последний раз редактировалось ACE Valery; 07.12.2010 в 21:29.
yandzee вне форума Ответить с цитированием
Старый 07.12.2010, 21:30   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Прочтите теорию по спискам! Дли списка важна голова.
p51x вне форума Ответить с цитированием
Старый 07.12.2010, 22:01   #3
ACE Valery
Сама себе режиссер
Старожил
 
Аватар для ACE Valery
 
Регистрация: 27.04.2007
Сообщений: 3,365
По умолчанию

Во-первых, оформляем код тегом [code], а не [php].
Во-вторых называем правильно темы.
В-третьих... prev = current перекрывает предыдущие данные prev, НО это делается в самом конце, когда prev уже свое отслужила.
Вот не умею я объяснять списки, ну да попробуем...
Первая итерация цикла: если список пустой, то ставим вновь созданный элемент в начало списка: head = current; Дальше заполняем имя, фамилию. Потом мы сохраняем адрес вновь добавленного элемента.
Вторая итерация: так как список у нас уже не пустой, переходим к prev->next =current; Тут мы берем адрес предыдущего элемента(то бишь того, который был у нас на первой итерации) и привязываем к нему адрес текущего элемента(то бишь вновь созданного на второй итерации), заполняем текущий элемент данными. prev нам уже не нужен, заносим в него адрес текущего элемента для следующей итерации.
И так далее.
Приведу грубую аналогию:
Код:
int i = 0;
while(i < 5) {
mas[i] = 1;
i = i + 1;
}
Смотрите, здесь у нас меняется значение i (старое значение заменяется новым). Однако, массив работает, потому что данные записываются в сам массив, а i всего лишь указывает, в какое место нужно записать. Так вот в приведенном вами коде prev является как бы этим i.
Надеюсь, я вас не запутала еще больше?
Если я вас напрягаю или раздражаю, вы всегда можете забиться в угол и поплакать
ACE Valery вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Односвязный список pwdan Общие вопросы .NET 3 15.10.2010 14:23
Односвязный список masha17 Общие вопросы C/C++ 1 09.12.2009 12:20
C++. Односвязный список. Уничтожить список Olya90 Помощь студентам 2 10.06.2009 18:52
Односвязный список. С++ Ozza Помощь студентам 1 06.02.2009 02:09