Программа по созданию списка. Почему она работает только для одного головного элемента? - C (СИ)
Формулировка задачи:
#include<stdio.h> #include<malloc.h> #include<string.h> typedef struct sp { char *info; struct sp *next; }sp; char * stroka(); sp *sozdaniespiska(); sp *vivodspiska(sp *head); void cleaning(); int main(){ int k; char a[100]; sp *head; head=NULL; printf("Vvedite kolichestvo strok:\n"); scanf("%d",&k); cleaning(stdin); printf("Vvedite stroki:\n"); while(k--){ scanf("%s",a); head=sozdaniespiska(a,head); } printf("Otvet\n"); vivodspiska(head); return 0; } sp *sozdaniespiska(char a[100], sp *head){ sp *buf,*prev; if(head==NULL){ head=(sp*)malloc(sizeof(sp)); head->info=(char*)malloc(strlen(a)+1); strcpy(head->info,a); head->next=NULL; prev=head; } else{ buf=(sp*)malloc(sizeof(sp)); buf->info=(char*)malloc(strlen(a)+1); strcpy(buf->info,a); buf->next=NULL; prev->next=buf; prev=buf; } return head; } sp *vivodspiska(sp *head){ while(head) { printf("%s\n", head->info); head=head->next; } return 0; } void cleaning(FILE* stream) { int ch = getc(stream); while(ch != EOF && ch != '\n') ch = getc(stream); }
Решение задачи: «Программа по созданию списка. Почему она работает только для одного головного элемента?»
textual
Листинг программы
sp *sozdaniespiska(char a[], sp *head) { sp *buf = (sp*)malloc(sizeof(sp)); buf->info = (char*) malloc(strlen(a) + 1); strcpy(buf->info, a); buf->next = NULL; if (head) { sp* cur = head; for (; cur->next; cur = cur->next) { ; } cur->next = buf; } else { head = buf; } return head; }
Объяснение кода листинга программы
Этот код создает новый узел для списка и добавляет его в конец списка, если список уже существует. Если список пуст, то новый узел становится его головой. Вот разбор кода по шагам:
- Создается новый узел с помощью
malloc
. - Информация для узла копируется из входного массива
a
с помощьюstrcpy
. - Указатель на следующий узел устанавливается в
NULL
, так как новый узел является последним в списке. - Если список уже существует (т.е.
head
не равенNULL
), то:- Создается временная переменная
cur
, которая указывает на голову списка. - В цикле
for
происходит проход по всем узлам списка до тех пор, пока не встретитсяNULL
(т.е. не будет достигнув конца списка). - В конце цикла
cur
будет указывать на последний узел в списке. - Указатель
next
этого узла присваивается указателю на новый узел.
- Создается временная переменная
- Если список пуст (т.е.
head
равенNULL
), то:- Новый узел становится головой списка, т.е.
head
присваивается указателю на новый узел.
- Новый узел становится головой списка, т.е.
- В конце функции возвращается
head
, т.е. возвращается указатель на голову списка. Таким образом, код создает новый узел и добавляет его в конец списка, если список уже существует. Если список пуст, то новый узел становится его головой. Это объясняет, почему код работает только для одного головного элемента - потому что он просто добавляет новый узел в конец списка, не обрабатывая ситуацию, когда в списке уже есть другие узлы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д