YING_ZHOU 2020-03-06 18:53 采纳率: 0%
浏览 98

C语言链表新手 求大佬解决 链表不循环而且也不出去

void sort(struct people *head)
{
struct people *p1,*p2,*p3;

for( p1=head, p2=p1->next;p2!=NULL;p1=p1->next,p2=p2->next)
    if(strcmp((p1->name),(p1->next->name))>0)
    {
        p3=p1;
        p1=p2;
        p2=p3;
        printf("%s",p1->name);
        printf("%s",p2->name);
    }

}

  • 写回答

1条回答 默认 最新

  • 码农阿豪@新空间 新星创作者: 前端开发技术领域 2024-07-25 18:49
    关注
    让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言
    这段代码中存在一些问题,让我们逐个来看:
    1. 缺少变量声明:在函数内部应该首先声明两个用于循环的指针变量p1和p2,还有一个临时指针变量p3。
    2. 遍历链表条件错误:当前代码中的for循环条件是p2!=NULL,然而当p2等于NULL时,循环体内却尝试访问p1->next(即NULL->next),这会导致空指针异常。正确的条件应该是p2->next!=NULL。
    3. 排序逻辑错误:当前代码中的比较语句只做了简单的交换操作,它没有修改链表中节点的指向关系,也没有考虑到边界情况。应该对节点进行交换而不是指针。 下面是经过修改后的代码示例:
    void sort(struct people *head) {
        struct people *p1, *p2, *p3;
        for (p1 = head; p1 != NULL; p1 = p1->next) {
            for (p2 = p1->next; p2 != NULL; p2 = p2->next) {
                if(strcmp(p1->name, p2->name) > 0) {
                    // 交换两个节点的数据
                    char temp[50]; // 假设name字段最长不超过50个字符
                    strcpy(temp, p1->name);
                    strcpy(p1->name, p2->name);
                    strcpy(p2->name, temp);
                }
            }
        }
    }
    

    请注意,上述代码仅演示了根据姓名排序链表的功能,实际项目中可能需要根据实际需求对函数进行必要的修改。

    评论

报告相同问题?