Программа по созданию списка. Почему она работает только для одного головного элемента? - 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;
}

Объяснение кода листинга программы

Этот код создает новый узел для списка и добавляет его в конец списка, если список уже существует. Если список пуст, то новый узел становится его головой. Вот разбор кода по шагам:

  1. Создается новый узел с помощью malloc.
  2. Информация для узла копируется из входного массива a с помощью strcpy.
  3. Указатель на следующий узел устанавливается в NULL, так как новый узел является последним в списке.
  4. Если список уже существует (т.е. head не равен NULL), то:
    • Создается временная переменная cur, которая указывает на голову списка.
    • В цикле for происходит проход по всем узлам списка до тех пор, пока не встретится NULL (т.е. не будет достигнув конца списка).
    • В конце цикла cur будет указывать на последний узел в списке.
    • Указатель next этого узла присваивается указателю на новый узел.
  5. Если список пуст (т.е. head равен NULL), то:
    • Новый узел становится головой списка, т.е. head присваивается указателю на новый узел.
  6. В конце функции возвращается head, т.е. возвращается указатель на голову списка. Таким образом, код создает новый узел и добавляет его в конец списка, если список уже существует. Если список пуст, то новый узел становится его головой. Это объясняет, почему код работает только для одного головного элемента - потому что он просто добавляет новый узел в конец списка, не обрабатывая ситуацию, когда в списке уже есть другие узлы.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 4 из 5
Похожие ответы