将节点添加到单链表无法正常工作
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 指针放在列表的末尾。
希望这会修复一些错误,
我有一个单向链表结构和一个本地 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 指针放在列表的末尾。
希望这会修复一些错误,