阿赵秃头敲代码 2021-07-26 12:15 采纳率: 100%
浏览 28
已结题

求解,这个链表的冒泡排序出了什么问题吗?仅输出是没问题的,排序后就输出不了了

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define LEN sizeof(struct Student)

struct Student
{
    int num;
    char name[20];
    float score[3];
    float aver;
    struct Student *next;
};
int n;

struct Student *creat()
{
    struct Student *p1,*p2,*head;
    n=0;//统计结点数

    head=NULL;//初始化head(建立空表)
    p1=p2=(struct Student*)malloc(LEN);//p1,p2初始化对齐

    scanf("%d %s %f %f %f",&p1->num,p1->name,&p1->score[0],&p1->score[1],&p1->score[2]);  //输入第一个学生数据
    p1->aver=(p1->score[0]+p1->score[1]+p1->score[2])/3;

    while(p1->num!=0)
    {
        /*
            ①结点链入
            ②指针对齐
            ③创建结点
        */

        n=n+1;//统计结点,同时作为条件

        //下面进行链接操作

        //以下条件判断是否为空时进行不同的链接操作

        if(n==1)head=p1; //头节点链入
            else p2->next=p1;  //普通结点链入

        p2=p1;//指针对齐

        p1=(struct Student*)malloc(LEN);//创建新结点
        scanf("%d %s %f %f %f",&p1->num,p1->name,&p1->score[0],&p1->score[1],&p1->score[2]);  //输入下一个学生数据
        p1->aver=(p1->score[0]+p1->score[1]+p1->score[2])/3;
    }

    p2->next=NULL;//跳出循环后,表明此时p1->num=0,停止链接,创建的新的结点不应该被链接进表中
    return(head);
}

void print(struct Student *head)
{
    struct Student *p;
    p=head;
    if(head!=NULL)//表不为空
        do //直到型循环(表不为空,则一直输出直到表尾)
        {
            printf("%ld %5s %6.1f %6.1f %6.1f %6.1f\n",p->num,p->name,p->score[0],p->score[1],p->score[2],p->aver);
            p=p->next;
        }while(p!=NULL);//未输出表尾表尾
    printf("\n");
}

struct Student *sort(struct Student *head)//排序
{
    if(head=NULL)return head;
    struct Student *p1,*p2,*temp;
    temp=(struct Student*)malloc(LEN);

    for(p1=head;p1->next!=NULL;p1=p1->next)
    {
        for(p2=p1->next;p2->next!=NULL;p2=p2->next)
        {
            if(p1->num>p2->num)
            {
                                //数据域交换
                temp->num=p1->num;strcpy(temp->name,p1->name);temp->score[0]=p1->score[0];temp->score[1]=p1->score[1];temp->score[2]=p1->score[2];temp->aver=p1->aver;
                p1->num=p2->num;strcpy(p1->name,p2->name);p1->score[0]=p2->score[0];p1->score[1]=p2->score[1];p1->score[2]=p2->score[2];p1->aver=p2->aver;
                p2->num=temp->num;strcpy(p2->name,temp->name);p2->score[0]=temp->score[0];p2->score[1]=temp->score[1];p2->score[2]=temp->score[2];p2->aver=temp->aver;
            }
        }
    }

    free(temp);
    return head;

int main()
{
    //创建链表
    struct Student *pt;
    printf("请输入学生数据:\n");
    pt=creat();
    //排序(按学号大小)
    pt=sort(pt);
    printf("\n经排序,输出所有学生数据:\n");
    print(pt);
    return 0;
}

  • 写回答

1条回答 默认 最新

  • qzjhjxj 2021-07-26 12:39
    关注

    第70行: if(head=NULL)return head;这句错误,应改为:

      if(head == NULL)return head;
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 8月3日
  • 已采纳回答 7月26日
  • 创建了问题 7月26日

悬赏问题

  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?
  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮
  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥20 java项目连接sqlserver时报ssl相关错误