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 这个条件。