关于C语言链表的问题

代码小屋 课程设计 1
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define len sizeof(stu)
typedef struct student
{
    float stunum;        
    char name[20];  
      float examscore;  
      float labscore;
      float totalmark;  
    struct student * next;  
} stu ;
//定义全局变量.m,t,s[20]用于交换变量 
int i=0;
float t=0,m=0;
char s[20];
stu *p; 
stu *create(int n)//n是学生人数
{  
    stu *head,*p1,*p2;
    printf("依次输入学生 学号 姓名 考试成绩 实验成绩\n");
    for(i=0;i<n;i++)//建立链表 
    {
        p1=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;
        } 
    }



    for(i=0;i<n;i++)//计算学生总评成绩 
    {
        p->totalmark=0.6*p->examscore+0.4*p->labscore; 
    }

    for(i=0;i<n;i++)//按成绩对学生进行排序
    {
        for(p=head,p=p->next,p1=head;p1;p=p->next,p1=p1->next)
        {
            if(p1->totalmark<p->totalmark)
            {
                m=p->totalmark;p->totalmark=p1->totalmark;p1->totalmark=m;
                t=p->stunum;p->stunum=p1->stunum;p1->stunum=t;
                m=p->examscore;p->examscore=p1->examscore;p1->examscore=m;
                m=p->labscore;p->labscore=p1->labscore;p1->labscore=m;
                strcpy(s,p->name);strcpy(p->name,p1->name);strcpy(p1->name,s);//用到#include<string.h> 
            }
        }
    }  
    return head; //返回头指针 
}

int main()
{
    int n;
    printf("输入学生人数:\n");
    scanf("%d",&n);//输入学生人数
    p=create(n); //p 赋值链表头指针 
    for(i=0;i<n;i++)
    {
        printf("stunum:%f name:%s examscore:%f labscore:%f totalmark:%f\n",p->stunum,p->name,p->examscore,p->labscore,p->totalmark);
    }

    return 0;

}

编译无错误 但不能正常运行

回复

共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条评论
  • 毕设驿站
    这个人很懒,什么都没有留下~
    评论
    #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 ;
    //定义全局变量.m,t,s[20]用于交换变量 
    int i=0;
    float t=0,m=0;
    char s[20];
    stu *p=NULL; 
    stu *create(int n)//n是学生人数
    {  
        stu *head,*p1,*p2;
        printf("依次输入学生 学号 姓名 考试成绩 实验成绩\n");
        for(i=0;i<n;i++)//建立链表 
        {
            p1=(stu*)malloc(sizeof(stu));
            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;
            } 
        }
    
        for(p;p;p=p->next)//计算学生总评成绩 
        {
            p->totalmark=0.6*p->examscore+0.4*p->labscore; 
        }
        for(i=0;i<n;i++)//按成绩对学生进行排序
        {
            for(p=head,p=p->next,p1=head;p1;p=p->next,p1=p1->next)
            {
                if(p1->totalmark<p->totalmark)
                {
                    m=p->totalmark;p->totalmark=p1->totalmark;p1->totalmark=m;
                    t=p->stunum;p->stunum=p1->stunum;p1->stunum=t;
                    m=p->examscore;p->examscore=p1->examscore;p1->examscore=m;
                    m=p->labscore;p->labscore=p1->labscore;p1->labscore=m;
                    strcpy(s,p->name);strcpy(p->name,p1->name);strcpy(p1->name,s);//用到#include<string.h> 
                }
            }
        }  
        return head; //返回头指针 
    }
    
    int main()
    {
        int n;
        printf("输入学生人数:\n");
        scanf("%d",&n);//输入学生人数
        p=create(n); //p 赋值链表头指针 
        for(p;p;p=p->next)
        {
            printf("stunum:%f name:%s examscore:%f labscore:%f totalmark:%f\n",p->stunum,p->name,p->examscore,p->labscore,p->totalmark);
        }
    
        return 0;
    
    }
    
    0条评论

发表回复

登录后才能评论