【发布时间】:2019-04-26 10:09:11
【问题描述】:
我正在尝试创建一个存储学生姓名和年龄的链接列表。 我在插入时遇到问题。
#include <stdio.h>
#include <string.h>
#include <malloc.h>
#include <stdlib.h>
typedef struct node{
char Name[50];
int studentAge;
struct node* next;
}MyNode;
这就是我定义包含所需数据的结构和指向下一个节点的指针'next'的方式。
下面是我的插入函数 所以在第一个if条件中我说如果没有头即头= NULL然后使用malloc为头创建内存空间..之后我将所有数据复制到头节点并确保头的下一个指向空。
在第二种情况下,我是说是否有头部,即头部! = 空 然后使用当前指针遍历列表到末尾,然后将所有数据复制进去。
void InsertStudent(char givenName[50], int age, MyNode* head){
if(head == NULL){
head = (MyNode*) malloc(sizeof(MyNode));
strcpy(head->Name,givenName);
head->studentAge = age;
head->next = NULL;
}
if(head != NULL){
MyNode* current = head;
while(current->next != NULL){
current = current->next;
}
current->next = (MyNode*) malloc(sizeof(MyNode));
strcpy(current->next->Name,givenName);
current->next->studentAge = age;
current->next->next = NULL;
}
}
现在我不确定我的打印或插入是否有问题,因为当我尝试代码时它不会打印我的节点
void PrintList(MyNode* head){
MyNode* current = head;
while(current != NULL){
printf("Name is %s Age is %d\n",current->Name,current->studentAge);
current = current->next;
}
}
这是我的主要功能.. MyNode* head = NULL; 有问题吗?代码行允许吗?
int main()
{
MyNode* head = NULL;
int r = 0;
while(r!=1)
{
printf("Data Structures - Linked List\n");
printf("Choose one Option:\n\n");
printf("1.Insert Student\n");
printf("2.Remove Student\n");
printf("3.Print all student\n");
printf("4.Exit\n");
int option=0;
char givenName[50];
int givenAge;
scanf("%d",&option);
switch(option){
case 1:
printf("Enter name of student: ");
scanf("%s",givenName);
printf("\nEnter Age of student: ");
scanf("%d",&givenAge);
InsertStudent(givenName,givenAge,head);
break;
case 2:
printf("Enter name of student: ");
scanf("%s",givenName);
printf("\nEnter Age of student: ");
scanf("%d",&givenAge);
RemoveStudent(givenName,givenAge);
break;
case 3:
PrintList(head);
break;
case 4:
r=1;
break;
default:
r=1;
printf("\nNot an option\n");
break;
}
}
}
【问题讨论】:
-
head = (MyNode*) malloc(sizeof(MyNode))inInsertStudent对于该函数的调用者来说意味着 nothing。head指针按值传递。像这样分配给它只会修改一个局部变量;调用者的指针保持不变。要么利用函数的其他未使用的返回值来传达可能更新的头指针,要么通过 address 传递头指针(因此是指向指针的指针)并更改 @987654329 中的代码@ 因此。 SO上至少有一千个这个问题的重复。我会努力追捕一个。 -
找到一个here。第一个和第二个答案实际上演示了我上面描述的两种方法。
-
据我所见,您是否试图建议将 void Insert(..) 更改为 MyNode* insert(...) 并返回新节点...或者第二种方法是使用 void (双指针)......这就是你的意思吗?我想用双指针,因为这似乎更难,但我真的不知道该怎么做..
-
我发布的评论,连同我链接的答案和先前的问题,不可能更好地描述需要做什么。链接问题中的第二个答案精确地显示了如何使用指针到指针的语法来做到这一点。
-
谢谢。我现在修复它。我刚看到你的第二个帖子,所以我不知道你链接了一个例子
标签: c printing linked-list insertion