struct node{
char name[50];
double grade;
struct node* next;
};
void append(struct node* root){
int n;
printf("Enter the number of students: ");
scanf("%d",&n);
while(n !=0){
struct node* temp;
temp=(struct node*)malloc(sizeof(struct node));
printf("nEnter the name of the student: ");
scanf("%s",&temp->name);
printf("nEnter the grade for the student named %s: ",temp->name);
scanf("%f",&temp->grade);
temp->next=NULL;
if(root==NULL){
root=temp;
}else{
struct node* iterate=root;
while(iterate->next != NULL){
iterate=iterate->next;
}
iterate->next=temp;
}
n--;
}
}
int listLength(struct node* root){
struct node* temp = root;
int counter=0;
while(temp !=NULL){
counter++;
temp=temp->next;
}
return counter;
}
int main()
{
struct node* root = NULL;
append(&root);
//printList(&root);
printf("Node length: %d",listLength(&root));
return 0;
}
这就是我从链表开始时所拥有的。我试图做到这一点,以便我可以使用该函数附加到多个链表。所以我只是在 main 中创建一个不同的根指针,并调用 append 函数作为参数来添加节点。
这似乎有效,但是,它在列表的开头添加了一个额外的空节点。此节点不包含任何数据。例如,如果我在列表中添加 4 个学生,nodeLength 函数将返回 5。
更改以下内容:
void append(struct node* root)
对此:
void append(struct node** root)
这样即使更改终止,也可以使更改持续append()
。
当然,您将不得不使用*root
而不是在该函数的主体内部使用root
。
PS:我投下马洛克的结果吗?不。
struct node{
char name[50];
double grade;
struct node* next;
};
struct node * append(struct node* root){
int n;
printf("Enter the number of students: ");
scanf("%d",&n);
while(n !=0){
struct node* temp;
temp=(struct node*)malloc(sizeof(struct node));
printf("nEnter the name of the student: ");
scanf("%s",&temp->name);
printf("nEnter the grade for the student named %s: ",temp->name);
scanf("%f",&temp->grade);
temp->next=NULL;
if(root==NULL){
root=temp;
}else{
struct node* iterate=root;
while(iterate->next != NULL){
iterate=iterate->next;
}
iterate->next=temp;
root=iterate;
}
n--;
}
return root; }
int nodeLength(struct node* root){
struct node* temp = root;
int counter=0;
while(temp !=NULL){
counter++;
temp=temp->next;
}
return counter;
}
int main()
{
struct node* root = NULL;
root= append(root);
//printList(&root);
printf("Node length: %d",nodeLength(root));
return 0;
}
检查此代码以了解一点。会解释更多。
并且不要强制转换malloc
的返回类型。
如果您正确地将参数更改为 struct node**
,您正在做的事情将正常工作,但是是的,它可以像这样更容易地完成(上面显示的示例(。这是自然的,更直观的,而不是使用双指针。