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

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

#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;
    
    
    已采纳该答案
    打赏 评论

相关推荐 更多相似问题