大家!我收到了表格中的国家和报名人数的数据列表,我的任务是读入并按降序排序。
在阅读方面没有问题,但正如你可能猜到的那样,我在分类方面有问题。
在产出方面,我只有2个国家,而不是158个。
这是我的代码
#include<stdlib.h>
#include<stdio.h>
typedef struct _person_count {
char country[80];
long females;
long males;
struct _person_count *link;
} person_count;
void printList(person_count *node) {
if (node != NULL) {
printf("%25s %10d %10d %10d n", node->country, node->females,
node->males, node->males + node->females);
printList(node->link);
}
}
int main() {
FILE *infile;
infile = fopen("file.txt", "r");
if (infile == NULL) {
printf("Problem opening files.");
return 1;
}
person_count *first = NULL;
person_count *curr = NULL;
person_count *prev = NULL;
person_count *a = NULL;
do {
person_count *newNode = malloc(sizeof(person_count));
fscanf(infile, "%s %ld %ld", &newNode->country, &newNode->females,
&newNode->males);
newNode->link = NULL;
if (first == NULL) {
first = newNode;
} else {
prev->link = newNode;
};
curr = first;
if ((newNode->females + newNode->males)
> (first->females + first->males)) {
newNode->link = first;
first = newNode;
} else {
do {
if (curr->link == NULL) {
curr->link = newNode;
printf("an");
break;
}
if ((newNode->females + newNode->males)
< (curr->link->females + curr->link->males)) {
curr = curr->link;
printf("bn");
continue;
} else {
newNode->link = curr->link;
curr->link = newNode;
printf("cn");
break;
}
} while (curr->link->link != NULL);
}
prev = newNode;
} while (!feof(infile));
printList(first);
printf("nnnnewnnn");
printList(curr);
return 0;
}
它返回此输出
China 47803801 52828124 100631925
India 38383177 51078616 89461793
USA 12008749 12423185 24431934
Vietnam 4827551 5111768 9939319
Yemen 466693 988523 1455216
Zambia 183200 225771 408971
new
Yemen 466693 988523 1455216
Zambia 183200 225771 408971
你能帮忙吗?
提前谢谢!
您想要的输出有点不清楚。使用(first
)和(curr
)对printList
的最后两个调用之间除了printf语句之外没有任何内容。如果打印curr
时您的意图不是只有2行,那么您需要将curr
指向感兴趣的起始节点。或者,正如另一个答案中所提到的,您可以将两者都设置为first
,出于我目前无法理解的原因,连续打印两次列表,类似于:
China 47803801 52828124 100631925
India 38383177 51078616 89461793
USA 12008749 12423185 24431934
Vietnam 4827551 5111768 9939319
Yemen 466693 988523 1455216
Zambia 183200 225771 408971
new
China 47803801 52828124 100631925
India 38383177 51078616 89461793
USA 12008749 12423185 24431934
Vietnam 4827551 5111768 9939319
Yemen 466693 988523 1455216
Zambia 183200 225771 408971
你的阅读循环有问题,迟早会咬你一口。您会想了解为什么"while(!feof(file))"总是错误的通过快速更改,您可以使用for循环轻松读取,例如for(;;) {
,然后简单地"在到达数据末尾时中断:"
for (;;) {
person_count *newNode = calloc(1, sizeof(person_count));
if (fscanf(infile, "%s %ld %ld", newNode->country,
&newNode->females, &newNode->males) != 3)
break;
newNode->link = NULL;
...
请提供更多关于printList (first)
之后您希望打印的内容的说明,我很乐意提供进一步的帮助。
您的代码printList(curr);
实际上打印了curr
指向的位置,还打印了它之后的所有下一个元素,但curr
本身并不指向列表的头部。并且printList(first);
已经打印出排序后的列表。