c-链表按降序排序



大家!我收到了表格中的国家和报名人数的数据列表,我的任务是读入并按降序排序。

在阅读方面没有问题,但正如你可能猜到的那样,我在分类方面有问题。

在产出方面,我只有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);已经打印出排序后的列表。

相关内容

  • 没有找到相关文章