主用C语言链表和指针来写一个简单成绩管理系统

C语言链表和指针敲成绩管理系统

  1. 写一个成绩管理系统有很多种方法,但我觉得主用链表和指针来写比较好,输入的学生可以不用考虑溢出,对于链表和指针小白来说也不错的学习链表和指针的考虑。

  2. 成绩管理系统的功能有:
    (1).录入学生信息;
    (2).输出学生信息;
    (3).计算学生总成绩;
    (4).按总成绩排序学生信息;
    (5).按学号排序学生信息;
    (6).查询学生信息;
    (7).删除学生信息;
    (8).插入学生信息

  3. 正经人不说那么多废话,上代码

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

struct stu  //定义学生信息结构体
{
    int num;
    char name[20];
    int math;
    int chinese;
    int english;
    int physic;
    int history;
    int zongfen;
    struct stu *next;
};

int main()
{
    struct stu *creat(struct stu *head);   //创建表头,录入学生信息函数
    struct stu *zongf(struct stu *head);   //计算学生总成绩函数
    struct stu *paixu1(struct stu *head);  //排名函数
    struct stu *paixu2(struct stu *head);  //排学号函数
    struct stu *dele(struct stu *head);    //删除学生信息函数
    struct stu *insert(struct stu *head);  //插入学生信息函数
    void search(struct stu *head);         //查找学生信息函数
    void print1(struct stu *head);         //打印学生各科成绩函数
    void print2(struct stu *head);         //打印学生总成绩函数
    struct stu *head=NULL;
    struct std *zscore=NULL;
    struct stu *paix;
    printf("          欢 迎 使 用 本 成 绩 管 理 系 统\n");
    printf("              菜                 单\n");
    printf("                1.输入学生信息\n");
    printf("                2.输出学生信息\n");
    printf("                3.计算所有学生总成绩并输出(必须先执行操作1)\n");
    printf("                4.将所有学生总成绩排名(必须先进行操作1和操作3)\n");
    printf("                5.按学号输出学生总成绩\n");
    printf("                6.查询学生成绩\n");
    printf("                7.删除学生成绩\n");
    printf("                8.插入学生成绩\n");
    printf("                9.退出\n");
    int cz=1;
    char name[20];
    while(cz!=0)
    {
        printf("            请 选 择 您 要 进 行  的 操 作\n");
        scanf("%d",&cz);
        switch(cz)
        {
        case 1:
            head=creat(head);
            break;
        case 2:
            print1(head);
            break;
        case 3:
            head=zongf(head);
            print2(head);
            break;
        case 4:
            head=paixu1(head);
            print2(head);
            break;
        case 5:
            head=paixu2(head);
            print2(head);
            break;
        case 6:
            search(head);
            break;
        case 7:
            head=dele(head);
            break;
        case 8:
            head=insert(head);
            break;
        case 9:
            goto A;  //跳出循环,结束程序
        }
    }
A:
    printf("谢谢使用!");
    return 0;
}

//创建链表输入学生成绩函数
#if(1)
struct stu *creat(struct stu *head)
{
    struct stu *q,*p;
    int ch=1;
    while(ch!=0)
    {
        q=(struct stu *)malloc(sizeof(struct stu));
        printf("请输入学生的学号 姓名  (成绩)数学 语文 英语 物理 历史(输入0结束):\n");
        scanf("%d%s%d%d%d%d%d",&q->num,q->name,&q->math,&q->chinese,
                                &q->english,&q->physic,&q->history);
        ch=q->num;
        if(ch!=0)
        {
            q->next=NULL;
            if(head==NULL)
            {
                head=q;
            } else
            {
                p->next=q;
            }
            p=q;
        }
    }
    return head;
}
#endif


//计算学生总成绩函数

#if(1)
struct stu *zongf(struct stu *head)
{
    struct stu *q=head;
    while (q!=NULL)
    {
        q->zongfen=q->math+q->chinese+q->english+q->physic+q->history;
        q=q->next;
    }
    return head;
}

#endif


#if(1)
struct stu *paixu2(struct stu *head)
{
    struct stu *q,*p,*p1;
    char a[20];
    int xh,zscore;
    q=head;
    while(q!=NULL)
    {
        p=q->next;
        while(p!=NULL)
        {
            if(q->num > p->num)
            {
                //交换学号
                xh=q->num;
                q->num=p->num;
                p->num=xh;

                //交换姓名
                strcpy(a,q->name);
                strcpy(q->name,p->name);
                strcpy(p->name,a);

                //交换总成绩
                zscore=q->zongfen;
                q->zongfen=p->zongfen;
                p->zongfen=zscore;

            }
            p=p->next;
        }
        q=q->next;
    }
    return head;
}
#endif

#if(1)
struct stu *paixu1(struct stu *head)
{
    struct stu *q,*p,*p1;
    char a[20];
    int xh,zscore;
    q=head;
    while(q!=NULL)
    {
        p=q->next;
        while(p!=NULL)
        {
            if(q->zongfen < p->zongfen)
            {
                //交换学号
                xh=q->num;
                q->num=p->num;
                p->num=xh;

                //交换姓名
                strcpy(a,q->name);
                strcpy(q->name,p->name);
                strcpy(p->name,a);

                //交换总成绩
                zscore=q->zongfen;
                q->zongfen=p->zongfen;
                p->zongfen=zscore;

            }
            p=p->next;
        }
        q=q->next;
    }
    return head;
}

#endif

//查找学生成绩函数
#if(1)
void search(struct stu *head)
{
    struct stu *p;
    char name[20];
    int a;
    B:
        printf("请输入您要查找的学生姓名:\n");
        scanf("%s",&name);
        p=head;
        while(p!=NULL && strcmp(p->name,name)!=0)
        {
            p=p->next;
        }

        if(p)
        {
            printf("学号\t姓名\t(成绩)数学\t语文\t英语\t物理\t历史\n");
            printf("%d\t%s\t\t%d\t%d\t%d\t%d\t%d\n",p->num,p->name,p->math,
                   p->chinese,p->english,p->physic,p->history);
        } else
        {
            printf("没有%s同学的信息!\n",name);
        }
        printf("查找成功!\n");
        printf("是否继续查找:(yes(1)/no(0))\n");
        scanf("%d",&a);
        while(a)
        {
            if(a==1)
            {
                 goto B; //跳回此函数开头,继续输入名字查找
            } else if(a==0)
            {
                 printf("关闭查找功能!\n");
            }else
            {
                 printf("输入错误,请重新输入:\n");
                 scanf("%d",&a);
            }
         }
}
#endif


//打印学生各科成绩函数
#if(1)
void print1(struct stu *head)
{
    struct stu *p=head;
    printf("学号\t\t姓名\t\t语文\t数学\t英语\t物理\t化学\n");
    while(p!=NULL)
    {
        printf("%d\t%10s\t\t%d\t%d\t%d\t%d\t%d\n",p->num,p->name,p->math,
               p->chinese,p->english,p->physic,p->history);
        p=p->next;
    }
}
#endif


//打印学生总成绩函数
#if(1)
void print2(struct stu *head)
{
    struct stu *p=head;
    printf("学号\t姓名\t总成绩\n");
    while(p!=NULL)
    {
        printf("%d\t%s\t%d\n",p->num,p->name,p->zongfen);
        p=p->next;
    }
}
#endif

#if(1)
struct stu *dele(struct stu *head)
{
    struct stu *q,*p;
    char name[20];
    int a;
    q=head; 
C:
    printf("请输入您要删除的学生姓名:\n");
    scanf("%s",&name);
    while(q!=NULL && strcmp(q->name,name)!=0)
    {
        p=q;
        q=q->next;
    }
    if(q==NULL)
    {
        printf("没有%s同学的成绩信息!\n",name);
    } else if(q==head)
    {
        head=p->next;
    } else
    {
        p->next=q->next;
    }
    printf("删除成功!\n");
    printf("是否继续删除:(yes(1)/no(0)\n");
    scanf("%d",&a);
    while(a)
    {
        if(a==1)
        {
            goto C; //跳回此函数开头,继续删除
        }else if(a==0)
        {
            printf("关闭删除功能!\n");
        }else
        {
            printf("输入错误,请重新输入:\n");
            scanf("%d",&a);
        }
    }
    free(q);
    return head;
}

#endif

#if(1)

struct stu *insert(struct stu *head)
{
    struct stu *q,*p,*p1;
    int a;
D:
    q=(struct stu *)malloc(sizeof(struct stu));
    printf("请输入要插入的学生成绩信息:(按学号大小插入)\n");
    printf("请输入学生的学号 姓名  (成绩)数学 语文 英语 物理 历史(输入0结束):\n");
    scanf("%d%s%d%d%d%d%d",&q->num,q->name,&q->math,&q->chinese,
                            &q->english,&q->physic,&q->history);
    if(head==NULL)
    {
        q->next=NULL;
        head=q;
        return head;
    }
    if(head->num > q->num)
    {
        q->next=head;
        head=q;
        return head;
    }
    p=head;
    p1=head->next;
    while(p1!=NULL && p1->num < q->num)
    {
        p=p1;
        p1=p1->next;
    }
    q->next=p1;
    p->next=q;
    printf("插入成功!\n");
    printf("是否继续插入:(yes(1)/no(0))\n");
    scanf("%d",&a);
    while(a)
    {
        if(a==1)
       {
           goto D;
       }else if(a==0)
       {
          printf("关闭插入功能!");
       }else
       {
          printf("输入错误,请重新输入:\n");
          scanf("%d",&a);
       }
    }
     return head;
}

#endif

  1. 小白一遍看不懂多看几遍就会了,简单易懂,以此来练习链表和指针也是不错的选择。
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

咳咳?

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值