我有一个单独链接的列表结构和一个本地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);
}
答案 0 :(得分:2)
问题的原因是每个C函数调用的值调用。
在addToList()
的第一次电话会议中,head
点main()
指向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指针放在列表的末尾。
希望这能解决一些错误,