Вставка связанного списка узлов C - PullRequest
0 голосов
/ 23 ноября 2018

Я пытаюсь создать связанный список, в котором хранятся имя и возраст учащегося.У меня проблемы со вставкой.

#include <stdio.h>
#include <string.h>
#include <malloc.h>
#include <stdlib.h>

typedef struct node{

  char Name[50];
  int studentAge;
  struct node* next;

}MyNode;

именно так я определил мою структуру, которая содержит требуемые данные и указатель «следующий», который указывает на следующий узел.

Ниже приведена моя функция вставки, поэтому в первом случае, еслиЯ говорю, что если заголовка нет, то есть head = NULL, тогда создайте пространство памяти для головы, используя malloc. После этого я копирую все данные в головной узел и проверяю, что следующий заголовок указывает на ноль.

Во втором состоянии я говорю, есть ли голова, то есть голова!= NULL, затем просмотрите список до конца, используя текущий указатель, а затем скопируйте все данные.

void InsertStudent(char givenName[50], int age, MyNode* head){

    if(head == NULL){
        head = (MyNode*) malloc(sizeof(MyNode));
        strcpy(head->Name,givenName);
        head->studentAge = age;
        head->next = NULL;
    }


    if(head != NULL){
        MyNode* current = head;
            while(current->next != NULL){
                current = current->next;
            }
        current->next = (MyNode*) malloc(sizeof(MyNode));
        strcpy(current->next->Name,givenName);
        current->next->studentAge = age;
        current->next->next = NULL;
    }

}

Теперь я не уверен, есть ли проблема в моей печати или вставке, потому что это нераспечатывать мои узлы, когда я пробую код

void PrintList(MyNode* head){
    MyNode* current = head;

    while(current != NULL){
        printf("Name is %s Age is %d\n",current->Name,current->studentAge);
        current = current->next;
    }

}

это моя основная функция .. есть ли проблема с MyNode * head = NULL;строка кода это разрешено?

  int main()
   {


    MyNode* head = NULL;

    int r = 0;
while(r!=1)
    {
    printf("Data Structures - Linked List\n");
    printf("Choose one Option:\n\n");
    printf("1.Insert Student\n");
    printf("2.Remove Student\n");
    printf("3.Print all student\n");
    printf("4.Exit\n");

        int option=0;
        char givenName[50];
        int givenAge;
        scanf("%d",&option);

        switch(option){

        case 1:
        printf("Enter name of student:     ");
        scanf("%s",givenName);
        printf("\nEnter Age of student:    ");
        scanf("%d",&givenAge);
        InsertStudent(givenName,givenAge,head);
            break;

        case 2:
        printf("Enter name of student:     ");
        scanf("%s",givenName);
        printf("\nEnter Age of student:    ");
        scanf("%d",&givenAge);
        RemoveStudent(givenName,givenAge);
            break;

        case 3:
        PrintList(head);
            break;
        case 4:
        r=1;
            break;
        default:
        r=1;
        printf("\nNot an option\n");
            break;

       }

    }
}

Ответы [ 2 ]

0 голосов
/ 24 ноября 2018

Вы передаете голову по значению;это означает, что строка в InsertStudent:

head = (MyNode*) malloc(sizeof(MyNode))

, которая не обновляет переменную 'head' в main.То, что вы хотите, это передать & head в InsertStudent, но тогда InsertStudent должен иметь дело с MyNode **.Другой вариант - иметь возвращаемую головку InsertStudent, так что ее вызов:

 head = InsertStudent(name, age, head);

В любом случае это не имеет большого значения, некоторые предпочитают последнее, потому что оно выглядит более функциональным .

Внутри InsertStudent вы добавляете первый элемент дважды.Это почти наверняка нежелательно.К тому времени, когда вы доберетесь до линии:

if(head != NULL){

head никогда не будет NULL;если бы это было так, вы бы присвоили его в условии if выше.Вы, вероятно, хотите, чтобы это утверждение было:

else {
0 голосов
/ 24 ноября 2018

Вы не устанавливаете начальное значение указателя головы на первый узел, и, поскольку это никогда не делается, список остается пустым, и вы теряете память, как сито, утекает дождевая вода.

Когда высообщили, что вы хотите использовать синтаксис указатель-указатель, результат должен выглядеть следующим образом.(без проверки ошибок, которую вы, вероятно, должны добавить):

void InsertStudent(char givenName[50], int age, MyNode** head)
{
    while (*head)
        head = &(*head)->next;

    *head = malloc(sizeof **head);
    strcpy((*head)->Name, givenName);
    (*head)->studentAge = age;
    (*head)->next = NULL;
}

Вызывается из вашей основной программы с использованием адреса указателя головы (НЕ путайте это с адресом в указатель головы, который вы изначально устанавливаете в NULL правильно, думайте о последнем значении, которое хранится в указателе, а первое - как место, где указатель головы находится в памяти).

InsertStudent(givenName,givenAge, &head); // NOTE THIS

Я оставляюзадача удаления и очистки списка.

...