插入节点链接列表C

时间:2018-11-23 20:42:10

标签: c printing linked-list insertion

我正在尝试创建一个链接列表,其中存储了学生的姓名和年龄。 我在插入时遇到麻烦。

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

typedef struct node{

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

}MyNode;

这就是我定义包含所需数据的结构和指向下一个节点的指针“下一个”的方式。

下面是我的插入函数 所以在第一个if条件中,我要说的是如果没有头,即head = NULL,则使用malloc为头创建内存空间。在此之后,我将所有数据复制到头节点,并确保头的下一个指向空。

在第二种情况下,我是说是否有头,即头! =空 然后使用当前指针将列表遍历到最后,然后复制所有数据。

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 :(得分:0)

您没有设置指向第一个节点的头部指针的初始值,并且由于从未做过,因此列表仍然为空,并且您的内存像筛子一样漏水。

在进行交流时,您想使用指针对指针语法,结果应如下所示。 (没有错误检查,您可能应该考虑添加):

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

我离开了删除和列表清理的任务。

答案 1 :(得分:0)

您正在按价值传递;这意味着InsertStudent中的行:

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

不会更新main中的变量“ head”。 您想要的是将&head传递给InsertStudent,但是InsertStudent必须处理MyNode **。另一个选项是具有InsertStudent返回头,因此其调用为:

 head = InsertStudent(name, age, head);

这两种方法都没有太大关系,有些人更喜欢后者,因为它看起来更具功能性。

在InsertStudent内部,将第一个元素添加两次。这几乎肯定是不需要的。在您到达该行时:

if(head != NULL){

head永远不会为NULL;如果是的话,您将在上面的if语句中为其分配。您可能希望此语句为:

else {