关于C语言链表的问题

代码导航 毕业设计 1

输入如下十个学生的成绩数据,每个学生信息包括 学号 、姓名 、考试成绩 ,实验成绩。同时计算每个学生的总评成绩( =考试成绩 60% + 实验成绩 40%)并保存至每个结构体的totalmark。输入格式如下: 71250 李霞 95 82 69753 李友友 88 86 12254 东方亮 87 88 61256 张男 73 85 30258 孙杰 25 88 11260 柯以乐 82 76 33262 谢涛 91 85 29263 叶林 80 75 22483 陈翔 80 76 71525 王子 71 88

编写函数实现建立链表:struct student * create( int n), n是学生人数。函数中输入n个学生的信息,同时计算总评成绩,按照总评成绩从高到低的方式形成有序链表。返回链表头指针。

回复

共2条回复 我来回复
  • 毕设驿站
    这个人很懒,什么都没有留下~
    评论
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    
    typedef struct student
    {
        float stunum;        
        char name[20];  
        float examscore;  
        float labscore;
        float totalmark;  
        struct student * next;  
    } stu ;
    
    int len = sizeof(stu);
    
    //定义全局变量.m,t,s[20]用于交换变量 
    int i=0;
    float t=0,m=0;
    char s[20];
    stu *p; 
    
    
    
    
    struct student* sort_s(struct student *head)   //排序
    {
        if(NULL == head)    //若链表为空则不用排序
        {
            return NULL;
        }
        if(NULL == head->next)  //若链表中只有一个数,则不用比较
        {
            printf("min is head\n");
            return head;
        }
        struct student *min_pre = NULL;
        struct student *min = head;
        struct student *tmp = head;
        struct student *new_list = NULL;   
        struct student *tail_sort = NULL;
    
        while(head)
        {
            min = head;
            tmp = head;
            while(tmp->next)
            {
                if(min->totalmark > tmp->next->totalmark)
                {
                    min = tmp->next;
                    min_pre = tmp;
                }
                tmp = tmp->next;
            }
            if(min == head)
            {
                head = head->next;
            }
            else
            {
                min_pre->next = min->next;
                min->next = NULL;
            }
            if(NULL == new_list)    //按照尾插将最小的数组成新的链表
            {
                tail_sort = min;
                new_list = tail_sort;
            }
            else
            {
                tail_sort->next = min;
                tail_sort = min;
            }
        }
        return new_list;
    }
    
    
    stu *create(int n)//n是学生人数
    {  
        stu *head,*p1,*p2;
        printf("依次输入学生 学号 姓名 考试成绩 实验成绩\n");
        for(i=0;i<n;i++)//建立链表 
        {
            p1=(stu *)malloc(len);
            if(i==0)
            {
                head=p2=p1;//开始head p1 p2都指向新节点 
                scanf("%f %s %f %f",&p1->stunum,p1->name,&p1->examscore,&p1->labscore);
                p1->next=NULL;
            }
            else
            {
                p2->next=p1;
                p2=p1;//先将末尾节点指向新节点,在将p2指向新节点 
                scanf("%f %s %f %f",&p1->stunum,p1->name,&p1->examscore,&p1->labscore);
                p1->next=NULL;
            } 
        }
    
    
        p = head;
        for(i=0;i<n && p!=NULL;i++)//计算学生总评成绩 
        {
            p->totalmark=0.6*p->examscore+0.4*p->labscore; 
            p = p->next;
        }
    
        head = sort_s(head);
        return head; //返回头指针 
    }
    
    int main()
    {
        int n;
        stu* ps;
        printf("输入学生人数:\n");
        scanf("%d",&n);//输入学生人数
        p=create(n); //p 赋值链表头指针 
        ps = p; //用ps,否则链表头就丢失了
        for(i=0;i<n && ps!=NULL;i++)
        {
            printf("stunum:%f name:%s examscore:%f labscore:%f totalmark:%f\n",ps->stunum,ps->name,ps->examscore,ps->labscore,ps->totalmark);
            ps = ps->next;
        }
    
        return 0;
    
    0条评论
  • 毕设项目助手
    这个人很懒,什么都没有留下~
    评论

    (1)p1=malloc(len);这么写不对啊,而且 len是宏定义中定义的,宏定义会预编译,预编译的时候根本不知道stu结构体是什么东西,得出的大小不一定正确。 (2)if(i=0)这里,漏写了一个=,应该是 if(i==0) (3)

    scanf("%f %s %f %f",&p1->stunum,&p1->name,&p1->examscore,&p1->labscore);
    

    这里改成

    scanf("%f %s %f %f",&p1->stunum,p1->name,&p1->examscore,&p1->labscore);
    

    (4)0;i<n;i++)//计算学生总评成绩

    {
    p->totalmark=0.6*p->examscore+0.4*p->labscore;
    }
    

    这里,还有main函数中的输出,for循环中的p一直不变,输出的内容都一样,而且没有给p赋值的地方,是一个野指针,程序会崩掉的

    0条评论

发表回复

登录后才能评论