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

时间:2015-03-02 00:08:53

标签: c struct singly-linked-list

我有一个单独链接的列表结构和一个本地Node在我的addToList()函数的main中声明,但每次执行addToList()时都会运行案例(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);

  }

3 个答案:

答案 0 :(得分:2)

问题的原因是每个C函数调用的值调用。 在addToList()的第一次电话会议中,headmain()指向NULL

addToList()内,您将参数 head更改为指向新分配的内存区域。很遗憾,在addToList()返回时,参数 head的范围不再存在。因此,主head变量在addToList()调用之前具有完全相同的值。

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

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);
}

答案 1 :(得分:0)

head参数将在函数内初始化,你必须将指针传递给Node指针:

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

然后:

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

马诺斯的解释。

答案 2 :(得分:-1)

我在代码中看到一些小问题。

首先,在传入头部指针时,我会使用不同的名称。编译器可能会让人感到困惑。另外,当你在addToList中传入一个节点指针时,你需要取消引用它,所以改为传入Node **,并在方法中初始化一个指针。

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

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

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

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

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

希望这能解决一些错误,