Добавить созданный пользователем узел в конец связанного списка в C - PullRequest
0 голосов
/ 06 мая 2018

Я думаю, что я испорчу что-то простое, чего не вижу, но то, что должно произойти, - это опция меню для добавления нового узла. Основная программа создает новый узел, передает его в функцию, которая добавляет его в конец связанного списка. Ниже приведены фрагменты кода, которые должны помочь объяснить, что я сделал.

Объявление узла:

typedef struct Node {
    char fname[51];
    char lname[51];
    int idnum;
    float scores[5];
    float average;

    struct Node *next;
} Node;

Создание нового узла и назначенные пользователем значения:

 case 'A':
     entry = (Node*)malloc(sizeof(Node));
     printf("Enter the name of the record you would like to append\nFirst:");
     scanf("%50s", &(*entry).fname);
     printf("\nLast:\n");
     scanf(" %50s", &(*entry).lname);
     printf("Enter the ID of the record you would like to append\n");
     scanf("%d", &(*entry).idnum);
     printf("Enter the scores of the record you would like to append\n");
     for(j=0;j<5;j++) {
         scanf("%f", &(*entry).scores[j]);
     }
     head = addend(head,entry);
     printrecords(head,disp);
break;

Добавить узел в конец связанного списка:

Node* addend(Node* head, Node* entry) {
    if(head == NULL) {
            return NULL;
    }

    Node *cursor = head;
    while(cursor->next != NULL) {
            cursor = cursor->next;
    }
    cursor->next = entry;

    return head;

}

Любая помощь очень ценится.


РЕШИТЬ:

не уверен, почему я создавал новый узел, когда прошел узел, который я хотел назначить ему. Код обновлен, чтобы отразить это. Также, как указал @jose_Fonte, этот код рискованно использовать в формальной обстановке, так как ссылка на заголовок может быть потеряна.

1 Ответ

0 голосов
/ 06 мая 2018

Вы не должны добавлять элемент в конец одного связанного списка. Это разрушает всю идею O (1) сложности операций добавления / удаления, на которых основана эта структура. Он предназначен для роста с лицевой стороны или после элемента, на который вы держите указатель вашего узла. Поэтому я написал бы метод add_after, принимающий два параметра: указатель на узел после того, как он вставит новый узел, и указатель на новый узел. Вы можете сохранить указатель на новый узел и использовать его последовательно, чтобы увеличить связанный список с его обратной стороны.

...