C语言,将一个英文文本中的单词统计频次,并输出频次最高的十个单词,我建立了链表,但是排序的地方貌似有问题

typedef struct words
{
char word[50];

     int     count;

     struct    words *next;

}WORD;

void Frequency(WORD *head)

{
int i;

WORD    *pre;

WORD    *p1;

WORD    *p2;

WORD    *end = NULL;

WORD    *p = head;

while(head->next != end)                  //冒泡排序
{
    p1 = head;

    pre = head;

    p2 = p1->next;

    if(p1->count < p2->count)         
//先判断前两个单词频率
        {
            pre = p2;

            p1->next = p2->next;

            p2->next = p1;
        }
        else
            p1 = p1->next;

        p2 = p1->next;
    while(p1->next != end)       
     //把最小的一个排到最后
    {
        if(p1->count < p2->count)
        {
            pre->next = p2;

            p1->next = p2->next;

            p2->next = p1;

        }
        else
            p1 = p1->next;

        p2 = p1->next;

        pre = pre->next;
    }
    end = p1;                             //一次排序后,最后一个数已经最小,end往前移
}
for(i=0; i<10; i++)                       //输出频率前十的单词 
{
    printf("%s", head->word);
    printf("\n");
    head = head->next;
}

}

第一个p2->next = p1;后加head = p2,因为修改了头结点。否则下一次while循环的head就不对了

望采纳

  • 首先,在第三个 while 循环中,你使用了 p1 和 p2 两个指针来遍历链表,但是并没有初始化这两个指针。因此,当你第一次进入 while 循环时,p1 和 p2 指向的位置是不确定的。

  • 其次,在第三个 while 循环中,你使用的是 p1->next != end 这个条件,而不是 p2->next != end。这意味着当 p1 到达链表的最后一个元素时,while 循环依然会继续执行,导致 p2 指向了一个不存在的元素,从而可能引发错误。

你可以将 p1 和 p2 初始化为 head,并在 while 循环中使用 p2->next != end 这个条件。