c-读取包含学生姓名和年龄的文件,并按排序顺序显示



当我运行这个程序时,它只打印到'I'的名称,而不是一直打印到'Z'。我尝试先读取文件并将其内容存储到链接列表中,然后按排序顺序显示内容。下面是程序正在读取的文件和程序本身。请帮忙。

文件:

Samir 20

Arup 18

Neha 22

Ashim 19

伊萨克21

程序:

#include <stdio.h>
#include <stdlib.h>
int main()
{
FILE *fp;
struct student
{
char name[20];
int age;
struct student *pre, *next;
};
struct student *s, *f;
s = (struct student *)malloc(sizeof(struct student));
s->pre = NULL;
s->next = NULL;
f = s;
fp = fopen("A.txt", "r");
if(fp == NULL)
{
printf("Not Opened");
exit(0);
}
while(1)
{
if(fscanf(fp, "%s %d", s->name, &s->age) == EOF)
{
s = s->pre;
s->next = NULL;
break;
}
else
{
s->next = (struct student *)malloc(sizeof(struct student));
s->next->pre = s;
s->next->next = NULL;
s = s->next;
}
}
s = f;
char ch = 'A';
while(1)
{
if(ch == 'Z'+1)
break;
while(1)
{
if(f->name[0] == ch)
{
printf("%s %dn", f->name, f->age);
f->next->pre = f->pre;
f->pre->next = f->next;
if(f->next == NULL)
break;
else
f = f->next;
}
if(f->next == NULL)
break;
else
f = f->next;
}
ch = ch +1;
f = s;
}
fclose(fp);
}

问题在于以下几行:

f->next->pre = f->pre;
f->pre->next = f->next;

如果删除这些,则列表打印得很好。但是,只对打印进行排序,而不对列表进行排序。如果您想订购该列表,请参阅:

使用C 对链表进行排序

似乎混合了两个概念:排序和打印。

if(f->name[0] == ch),然后打印它并重新链接列表。我不知道你为什么要重新链接它,我也没有检查你是否正确排序(我觉得不是(。

首先对列表进行排序(例如,实现气泡或使用快速排序(,然后打印它,或者像现在一样打印列表,但删除重新链接(然后它会打印得很好——除了AB可以在AA之前打印,因为你只检查第一个字母(。

最新更新