当我运行这个程序时,它只打印到'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
之前打印,因为你只检查第一个字母(。