我正在尝试读取链接列表中的文本文件并成功显示它。但我一直收到对应于(head==NULL)的"list is Empty"消息,而我可以通过在读取函数中使用put(id->…)参数成功读取并打印一次文件,但我无法访问上面提到的显示函数。
struct node
{
char name[50];
int id;
struct node *next;
} *head;
int main()
{
int i,num;
struct node *r;
head=NULL;
readfile(*r);
while (1)
{
printf("nList Operationsn");
printf("============n");
printf("1.Insertn");
printf("2.Displayn");
printf("3.Delete by IDn");
printf("4.Delete by Namen");
printf("5.Exitn");
printf("Enter your choice: ");
if (scanf("%d", &i) <= 0){
printf("Enter only an integern");
exit(0);
} else {
switch(i)
{
case 1:
if(head==NULL)
{
printf("List is Emptyn");
}
else
{
printf("Element in the list are: ");
}
display(r);
break;
case 2:
return 0;
default:
printf("Invalid Choicen");
}
}
}
void readfile(struct node *r)
{
r=head;
char str[50];
int id;
FILE *ifp=fopen("One.txt","r");
while (fgets(str,50,ifp)!=NULL){
r =(struct node *)malloc(sizeof(struct node));
char *token=strtok(str,",");
strcpy(r->name,token);
puts(r->name);
token=strtok(NULL,"n");
r->id=token;
puts(r->id);
r->next=NULL;
r=r->next;
}
}
void display(struct node *r)
{
r = head;
if(r == NULL)
{
return;
}
while(r != NULL)
{
printf("Student %s has id %d.n", r->name,r->id);
r = r->next;
}
printf("n");
}
在您提供的代码中,您从未向head
分配或分配任何内容。我想你需要在下面的某个地方添加代码
if (head == NULL) {
head = r;
}
或
if (head == NULL) {
head = (struct node *)malloc(sizeof(struct node));
// and initialize it with something
}
此外,我建议您创建更通用的函数,如add_node
,如
void add_node( struct node *r ) {
if(head == NULL) {
head = r;
} else {
struct node* n = head;
while(n->next != NULL) { // go to the end of the list
}
r->next = NULL; // to be sure this will be end of list
n->next = r;
}
}
然后在readfile
中读取数据,创建新节点并将其传递给add_node
。