将节点添加到单链表无法正常工作

Adding node to singly linked list not working properly

我有一个单向链表结构和一个本地 Node 在 main 中用我的 addToList() 函数声明,但每次 addToList() 执行它都会运行 case (head == NULL) .即使我已经在列表中添加了值。我确定我的代码中有一个小错误,只是找不到它。

typedef struct node{
  char* name;
  int groupSize;
  int status;
  struct node* next;
}Node;

void addToList(char* name, Node* head, int groupSize, int status){

if(head == NULL){
    head =(Node*)malloc(sizeof(Node));
    head->name = (char*) malloc(sizeof(char)*30);
    strcpy(head->name, name);
    head->groupSize = groupSize;
    head->status = status;
    head->next = NULL;
    printf("Name is %s\n\n", head->name);
}

else {
    printf("entered else\n");
    Node *tmp = head;
    if(tmp->next!=NULL){
        tmp = tmp->next;
    }
    tmp->next  = (Node*) malloc(sizeof(Node));
    tmp->next->name = (char*) malloc(sizeof(char)*30);
    strcpy(tmp->next->name, name);
    tmp->next->groupSize = groupSize;
    tmp->next->status = status;
    tmp->next->next = NULL;
  }
}

int main(){
  Node* head = NULL;

  //TESTNG SECTION

  addToList("Julio", head, 5, 7);

  addToList("Francisco", head, 5, 7);

  addToList("Jorge", head, 5, 7);

  }

head参数会在函数内部初始化,你必须传递一个指向Node指针的指针:

void addToList(char* name, Node** head, int groupSize, int status);

然后:

*head =(Node*)malloc(sizeof(Node));

马诺斯的解释。

问题的原因是每个 C 函数调用的按值调用。 在第一次调用 addToList() 时,main()head 指向 NULL.

addToList() 中,您更改 参数 head 以指向新分配的内存区域。不幸的是,到 addToList() return 时, 参数 head 的范围已不复存在。因此,main 中的 head 变量在 addToList() 调用之前具有完全相同的值。

这个问题的解决方案是对头部使用双指针,或者 return 并在每次调用时分配列表的头部。因为之前的回答涵盖了一种解决方案,我将提供另一种解决方案。

Node* addToList(char* name, Node* head, int groupSize, int status){

    if(head == NULL){
        head =(Node*)malloc(sizeof(Node));
        head->name = (char*) malloc(sizeof(char)*30);
        strcpy(head->name, name);
        head->groupSize = groupSize;
        head->status = status;
        head->next = NULL;
        printf("Name is %s\n\n", head->name);
    }

    else {
        printf("entered else\n");
        Node *tmp = head;
        if(tmp->next!=NULL){
            tmp = tmp->next;
        }
        tmp->next  = (Node*) malloc(sizeof(Node));
        tmp->next->name = (char*) malloc(sizeof(char)*30);
        strcpy(tmp->next->name, name);
        tmp->next->groupSize = groupSize;
        tmp->next->status = status;
        tmp->next->next = NULL;
     }  
     return head;
 }

int main(){
  Node* head = NULL;

  //TESTNG SECTION

  head = addToList("Julio", head, 5, 7);

  head = addToList("Francisco", head, 5, 7);

  head = addToList("Jorge", head, 5, 7);
}

我发现您的代码存在一些小问题。

首先,我会在传入头指针时使用不同的名称。这可能会使编译器混淆查找位置。另外,当你在addToList中传入一个节点指针时,你需要解引用它,所以改为传入Node**,并在方法中初始化一个指针。

其次,在您的 addToList 方法中,您有以下条件:

if(tmp->next!=NULL){
    tmp = tmp->next;
}

这仅在您的列表中有 2 个元素时有效。相反,让它成为一个 while 循环,如下所示:

while(tmp->next!=NULL){
    tmp = tmp->next;
}

这会正确地将 tmp 指针放在列表的末尾。

希望这会修复一些错误,