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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.06.2009, 01:16   #1
zx11
 
Регистрация: 11.06.2009
Сообщений: 8
По умолчанию Создание связного списка на Си

Приведите пожалуйста пример кода для создания связного списка в цикле, ввод новых элементов с клавиатуры производится. Что-то типа:

Код:
for(i=0;i<10;i++)
	{
		printf("элемент списка: ");
		gets(item);
		ptr=PNODE(malloc(sizeof(NODE)));
		ptr->next=*curr;
		strcpy(ptr->data,item);
		*curr=ptr;
	}
Только дело в том, что у меня получается список наоборот заполняется, а как сделать чтобы он по порядку заполнялся?

Заранее спасибо.

Последний раз редактировалось Sazary; 11.06.2009 в 01:19.
zx11 вне форума Ответить с цитированием
Старый 11.06.2009, 01:27   #2
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Пример:
Код:
#include <stdio.h>
#include <string.h>
#include <conio.h>

struct Node
{
 char data[30];
 Node *next;
};

int main()
{
Node *start;    // это будет указатель на начало списка
char str[30];
Node *spis = new Node;    // создаем список

strcpy(spis->data,"0");   // инициализируем его данными
spis->next = NULL;        // следующий элемент - NULL
start = spis;               // запоминаем начало

for(int i=1; i<10; i++)   // добавим 9 элементов
 {
  spis->next = new Node;   // создаем элемент (и сразу устанавливаем ссылку на него из текущего)
  printf("element: ");
  gets(str);     
  strcpy(spis->next->data,str);  // добавляем данные
  spis->next->next = NULL;   // следующий элемент - NULL
  spis = spis->next;     // делаем новый элемент текущим
 }

// выводим
printf("\n\n");
spis = start;
while(spis)
 {
  printf("%s\n",spis->data);
  spis = spis->next;
 } 

// удаляем
Node *tmp;
spis = start;
while(spis)
 {
  tmp = spis;
  spis = spis->next;
  delete tmp;
 } 
 
getch();
return 0;
}
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]

Последний раз редактировалось Sazary; 11.06.2009 в 01:49. Причина: добавил комменты
Sazary вне форума Ответить с цитированием
Старый 11.06.2009, 01:42   #3
zx11
 
Регистрация: 11.06.2009
Сообщений: 8
По умолчанию

Спасибо за пример, только не могу до конца разобраться. Вы не могли бы прокомментировать некоторые участки кода.
Код:
Node *start;

Node *spis = new Node;

strcpy(spis->data,"0");
spis->next = NULL;
start = spis;

strcpy(spis->next->data,str);
spis->next->next = NULL;
spis = spis->next;
zx11 вне форума Ответить с цитированием
Старый 11.06.2009, 01:49   #4
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Сначала создаем список и запоминаем его начало (в start)
Потом добавляем 9 элементов.

В общем, добавил комменты в листинг.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 11.06.2009, 02:10   #5
zx11
 
Регистрация: 11.06.2009
Сообщений: 8
По умолчанию

Дело в том что мне надо использовать следующую структуру

Код:
typedef struct node 
{
    char data[10];
    struct node *next;
}NODE, *PNODE;
Как я понимаю NODE - это структура, а *PNODE - указатель на неё? Соответственно я могу объявить Node *start; как PNODE start? Или я не прав и что-то не так понимаю?

А так же необходимо использовать выделение памяти типа ptr=PNODE(malloc(sizeof(NODE)));

Последний раз редактировалось zx11; 11.06.2009 в 02:21.
zx11 вне форума Ответить с цитированием
Старый 11.06.2009, 02:20   #6
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Цитата:
Сообщение от zx11
Как я понимаю NODE - это структура, а *PNODE - указатель на неё? Соответственно я могу объявить Node *start; как PNODE start? Или я не прав и что-то не так понимаю?
Да, все верно.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 11.06.2009, 02:30   #7
zx11
 
Регистрация: 11.06.2009
Сообщений: 8
По умолчанию

В ходе рассуждений пришёл к следующему:

Код:
typedef struct node 
{
	char data[MAXL];
    struct node *next;
}NODE, *PNODE;

void creatlist(PNODE *top);
void printlist(PNODE top);
void deletelem(PNODE top);

void main(void) {

	PNODE top;
	creatlist(&top);
	printf("\nInitial list:\n");
	printlist(top);
	deletelem(top);
	printf("Resultive list:\n");
	printlist(top);
}


void creatlist(PNODE *top) {

	char item[MAXL];
	int i;
	PNODE ptr = new NODE;    
	strcpy(ptr->data,"0");   
	ptr->next = NULL;        
	*top = ptr; 
	for(i=0;i<MAX;i++)
	{
		ptr->next = new NODE;
		printf("element: ");
		gets(item);
		ptr=PNODE(malloc(sizeof(NODE)));
		strcpy(ptr->data,item);
		ptr->next->next = NULL;
		ptr=ptr->next;
	}
}
Но после ввода первого элемента программа закрывается с ошибкой, не могу понять как именно надо делать.
zx11 вне форума Ответить с цитированием
Старый 11.06.2009, 02:37   #8
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Что-то странное вы делаете.
Во-первых, не используйте и new и malloc одновременно. Или то, или другое.
Далее. После ввода элемента вы выделяете память:
Код:
gets(item);
ptr=PNODE(malloc(sizeof(NODE)));
под элемент, под который она уже выделена
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 11.06.2009, 02:50   #9
zx11
 
Регистрация: 11.06.2009
Сообщений: 8
По умолчанию

Большое спасибо за помощь, разобрался во всём, написал, работает=)

Последний раз редактировалось zx11; 11.06.2009 в 02:53.
zx11 вне форума Ответить с цитированием
Старый 17.03.2014, 00:54   #10
HappyDaun
Новичок
Джуниор
 
Регистрация: 17.03.2014
Сообщений: 1
По умолчанию

А также спасибо и от меня))(Давно я искал (рабочий код списка, для разбора))
HappyDaun вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание списка как зделать??? DEZuv Microsoft Office Access 0 04.04.2009 12:02
Создание списка из нескольких ячеек DragonTM Microsoft Office Excel 6 30.10.2008 15:46
создание списка библиографических источников(office2007) bonza Microsoft Office Word 2 15.09.2008 11:27
Создание списка изображений mikhea Помощь студентам 1 01.06.2007 20:41
создание списка zetrix Microsoft Office Excel 0 31.10.2006 08:05