学生成绩表链表操作

  1. 根据下面提供的结构,参照教材“9.5 单链表”中所给出的单链表几种基本操作的代码,完成实现“学生成绩信息”相关的几种功能函数。【此题目为本实验的核心内容】
    有一学生成绩表,输入信息包括学号、姓名、3门课程成绩。结构定义如图1所示(可以自行添加别名):

(图1 学生成绩表的结构体定义)
要求实现:
3.1 单链表的创建
函数声明: void CreateStuList( struct stud *head ) ;
说明:创建“学生成绩信息”的单链表,并在创建时完成一些学生结点的构建和链接。
特别说明一下:
在主菜单中,需要嵌入个人信息(如下图所示);
所有的截屏均需要包含个人信息。

输入输出示例,如图2所示:

(图2 创建链表并初始化链表结点)
label at end of compound statement
3.2 单链表的遍历
函数声明: void PrintStuList( struct stud *head ) ;
说明:顺序输出显示单链表中所有结点的信息,每个结点信息占一行。

3.3 单链表的结点插入
函数声明: void StuListInsert( struct stud *head) ;
说明:
(1)若单链表中已存在相同学号的结点,则返回“error!”提示。
(2)在已经有序的“学生成绩信息”单链表中添加新结点,结点插入后,保持链表的有序性。
(3)待插入结点的信息在本函数中接收。
提示:需要从几个方面讨论和考虑问题。输入输出示例,如下面几个图所示:
【情况1】若待添加结点与单链表中已存在学号有重复的,则反馈提示信息,链表中结构不变。如图3所示:

(图3 待添加的结点与链表中信息重复)

【情况2】对链表添加结点。提醒注意,在链表中添加和在链表尾添加,是需要分别对待处理的。如图4和图5所示:

(图4 待添加的结点不在链表尾)

(图5 待添加的结点在链表尾)

3.4 单链表的使用
函数: main()
说明:在理解了单链表各种基本操作的基础上,尝试把这些操作组合到一起,共同实现单链表的应用。对于之前定义的基本操作,在主函数中分别调用,实现单链表的应用。

[拓展]3.5 单链表的结点删除
函数声明: void StuListDelete( struct stud *head )
说明:(1)删除指定学号的链表结点。
(2)若单链表中未找到该学号的结点,则返回“error!”提示。
(3)若找到该学号的结点,则删除该结点。
提示:需要从几个方面讨论和考虑问题。输入输出示例,如下面几个图所示:
【情况1】若链表中确实存在待删除结点,则删除它。提醒注意,结点处于在链表中和链表尾,是需要分别对待处理的。如图6和图7所示:

(图6 待删除的结点在链表尾)

(图7 待删除的结点不在链表尾)
【情况2】若链表中不存在待删除结点,则需要反馈提示信息。如图8所示:

#include <stdlib.h>
#include<string.h>
typedef struct node
{
    char id[13];
    char name[21];
    int score1,score2,score3;
    int sum;
    struct stud *next;
} Lnode,*LinkList;
int m=sizeof(Lnode);
void CreateStuList(head);
void PrintStuList(head);
void StuListDelete(head);
void ListDelete(LinkList head);
void freelist(LinkList head);
void Statistics(LinkList head);
int main()
{
    struct node *head;
    int i;
    head=(LinkList)malloc(m);
    printf("==================================\n");
    printf("  **欢迎进入学生信息管理系统***  \n");
    printf("           1:创建链表            \n");
    printf("           2:插入元素            \n");
    printf("           3:删除元素            \n");
    printf("           4:显示元素            \n");
    printf("           5.统计                \n");
    printf("           0:退出系统            \n");
    printf("==================================\n");

    while(1)
    {
        printf("请输入菜单项:");
        scanf("%d",&i);
        switch(i)
        {
        case 1:

            CreateStuList(head);
            printf("\n新创建的链表中学生信息为:\n");
            PrintStuList(head);
            break;


        case 2:

            printf("当前链表中学生信息为:\n");
            PrintStuList(head);
            StuListInsert(head);
            printf("链表修改后的学生信息:\n");
            PrintStuList(head);
            break;

        case 3:
            printf("当前链表中学生信息为:\n");
            PrintStuList(head);
            ListDelete(head);
            printf("链表修改后的学生信息为:\n");
            PrintStuList(head);
            break;

        case 4:

            PrintStuList(head);
            break;
        case 5:
            Statistics(head);
            break;
        case 0:
            exit(0);
        }
    }
    freeList(head);
}
void CreateStuList(LinkList head)
{
    LinkList s,rear;
    head->next=NULL;
    rear=head;
    int a,b,c;
    char e[13];
    char r[21];
    char w[13]="#";
    printf("输入若干整数,输入#表示输入结束\n");
    scanf("%s",e);
    while(e[0]!='#')
    {
        getchar();
        scanf("%s",r);
        scanf("%d",&a);
        scanf("%d",&b);
        scanf("%d",&c);
        if(e[0]!='#')
        {
            s=(LinkList)malloc(m);//尾插法
            strcpy(s->id,e);
            strcpy(s->name,r);
            s->score1=a;
            s->score2=b;
            s->score3=c;
            s->sum=a+b+c;
            s->next=head->next;
            rear->next=s;
            rear=s;
            rear->next=NULL;
            scanf("%s",e);
        }
    }


}
void PrintStuList(LinkList head)
{
    LinkList p;
    int sum;
    p=head->next;
    while(p)
    {
        printf("%s\t%s\t%d\t%d\t%d\t%d\n",p->id,p->name,p->score1,p->score2,p->score3,p->sum);
        p=p->next;
    }
}
void StuListInsert(LinkList head)
{

    LinkList q;
    Lnode e;
    printf("请输入待添加学生的信息:\n");
    scanf("%s %s %d %d %d",e.id,e.name,&e.score1,&e.score2,&e.score3);
    printf("\n");
    e.sum=e.score1+e.score2+e.score3;
    LinkList p;
    p=head->next;
    int flag;
    while(p)
    {
        if(strcmp(e.id,p->id)==0)
        {
            flag=1;//有相同的学生
            break;
        }
        if (strcmp(e.id,p->id) < 0)//表头插入
        {
            flag=2;
            break;
        }
        if(p->next==NULL)
        {   flag=3;//从表未插入
            break;
        }


        q=p->next;
        if(strcmp(e.id,p->id)>0&&strcmp(e.id,q->id)<0)//表中插
        {
            LinkList s;
            s=(LinkList)malloc(m);
            strcpy(s->id,e.id);
            strcpy(s->name,e.name);
            s->score1=e.score1;
            s->score2=e.score2;
            s->score3=e.score3;
            s->sum=e.score1+e.score2+e.score3;
            s->next=p->next;
            p->next=s;
            break;
        }


        p=p->next;
    }
    if (flag==1)
    {
        printf("学号已有无法添加!\n");
        printf("\n");
    }
    if (flag==2)
    {
        LinkList s;
        s=(LinkList)malloc(m);
        strcpy(s->id,e.id);
        strcpy(s->name,e.name);
        s->score1=e.score1;
        s->score2=e.score2;
        s->score3=e.score3;
        s->sum=e.score1+e.score2+e.score3;
        s->next=head->next;
        head->next=s;
    }
    if(flag==3)
    {
        LinkList s;
        s=(LinkList)malloc(m);
        strcpy(s->id,e.id);
        strcpy(s->name,e.name);
        s->score1=e.score1;
        s->score2=e.score2;
        s->score3=e.score3;
        s->sum=e.score1+e.score2+e.score3;
        s->next=p->next;
        p->next=s;
    }


}


void ListDelete(LinkList head)
{
    LinkList p,s;
    p=head->next;//p为s的上个链表
    s=head;
    printf("请输入待删除学生的学号信息:\n");
    int d=0;
    char a[20];
    scanf("%s",a);
    while(p)
    {
        if(strcmp(a,p->id)==0)//学号对比
        {
            printf("待删除学生信息为:\n");
            printf("%s %s %d %d %d\n",p->id,p->name,p->score1,p->score2,p->score3,p->sum);
            d=1;
            break;
        }
        p=p->next;
        s=s->next;
    }
    if(d==0)
    {
        printf("ListDelete error\n");
    }
    else
    {
        s->next=p->next;//删除
        free(p);
    }

}
void Statistics(LinkList head)
{
    LinkList p;
    p=head->next;
    int sum,d=0;
    printf("成绩不及格的信息统计结果为\n");
    while(p)
    {
        if(p->score1<60||p->score2<60||p->score3<60)
         {printf("%s %s %d %d %d\n",p->id,p->name,p->score1,p->score2,p->score3,p->sum);
         d=1;
         }
        p=p->next;
    }
    if(d==0)
    {
        printf("无不及格学生\n");
    }

}
void freelist(LinkList head)
{
    LinkList cur,next;
    cur=head->next;
    head->next=NULL;
    while(cur)
    {
        next=cur->next;
        free(cur);
        cur=next;
    }

}
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1、已知一个链表中存储了若干名生的信息,每名生的信息包括学号、英语成绩、数成绩、计算机成绩。 现编写一个函数search(),要求对输入的无序学号进行排序,然后采用折半查找方法查找输入学号,并输出该生各科成绩。 2、设计一个生类(CStudent),它具有私有数据成员是:学号姓名、数、外语和计算机课程成绩。要求能实现三门课总成绩和平均成绩,并能设置和显示信息 (类声明和成员函数定义分离)。设计一个友元函数,按照成绩从高到低的顺序输出姓名学号成绩信息。 3、实现雇员管理,类Employee需存储雇员的姓名。这种信息对于所有雇员(包括Employee的派生类的雇员)是很普遍的。现在假设从雇员类Employee派生出了小时工类HourlyWorker、计件工类PieceWorker、老板类Boss和销售员类CommissionWorker。小时工每周工作40小时,超过40小时部分的报酬是平时的1.5倍;计件工是按生产的工作件数计算报酬的,每件的报酬是固定的,假设他只生成一种类型的工件,因而类PieceWorker的private数据成员是生产的工件数量和每件的报酬;老板每周有固定的薪水;销售员每周有小部分固定的基本工资加上其每周销售额的固定百分比。设计和规划该类体系,并分别产生每个基类及派生类对象,并显示该员工的工资。 4、约瑟夫生死者游戏 每30个旅客同乘一条船,因为严重超载,加上风高浪大,危险万分;因此船长告诉乘客,只有将全船一半的旅客投入海中,其余人才能幸免遇难。无奈,大家只得同意这种办法,并议定30个人围成一圈,由第一个人数起,依次报数,数到第9人,便把他投入大海中,然后再从他的下一个人数起,数到第9人,再将他扔进大海中,如此循环地进行,直到剩下15个乘客为止。问哪些位置是将是被扔下大海的位置。 5、求二叉树上结点的路径 要求在采用链式存储结构存储的二叉树上,以bt指向根结点,p指向任一给定的结点,编程实现求出从根节点到给定结点之间的路径。 6、图的操作 (1)写出将一个无向图的邻接矩阵转换成邻接的算法 (2)设计一个算法,判断无向图G是否连通。若连通则返回1; 返回0。 7、内部排序算法的性能分析 要求:(1)对冒泡排序、直接排序、简单选择排序、快速排序、希尔排序、堆排序算法进行比较; (2)待排序长不小于100,中数据随机产生,至少用5组不同数据作比较,比较指标有:关键字参加比较次数和关键字的移动次数(关键字交换记为3次移动); (3)输出各种算法的排序结果和比较结果。 8.2、通讯录管理系统 编程实现通讯录管理系统,要求该系统能够完成通讯信息的建立、查询、插入、删除等基本功能。程序运行后至少给出下面7个菜单项的选择并分别实现其功能: 0、 通讯录的建立 1、通讯录信息输出 2、 通讯者结点信息的删除 3、通讯者结点信息的查询 4、 通讯者结点信息的插入 5、通讯录信息更改 6、 退出通讯录管理系统 设计的任务要求,通讯录中每个生的基本信息包括姓名、地址、电话等基本信息,采用链表存储结构。(复习c语言结构体和链表知识)

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值