数据结构课程设计

1.头文件

#ifndef JC_H_INCLUDED
#define JC_H_INCLUDED

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include<windows.h>
#define  MAXID 10
#define  MAXNAME 20
#define  MAXCOURSE 3
/* 学生数据结构 */
typedef struct node
{
    char id[20];
    char name[15];
    int score[MAXCOURSE];
    int sum;
    node()
    {
        sum=0;
    }
    double average;
    struct node *next;
} Student;
/* 头指针 */
Student *head = NULL;
/*课程名称*/
char ClassName[MAXCOURSE][20]= {"数学","英语","计算机"};

#endif // JC_H_INCLUDED


2.主函数

#include"jc.h"
/* 菜单 */
int Menu()
{
    system("cls");
    fflush(stdin);
    printf("   计算机146-1      傅军超       201458506145   \n");
    printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
    printf("************学生成绩管理系统****************\n");
    printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
    printf("  1-初始化\n");
    printf("  2-输入学生信息\n");
    printf("  3-打印全部学生信息\n");
    printf("  4-查找学号或姓名删除学生信息\n");
    printf("  5-按姓名查找学生信息\n");
    printf("  6-按学号查找学生信息\n");
    printf("  7-计算班级总人数\n");
    printf("  8-插入学生信息到链表中\n");
    printf("  0-退出\n");
    return 0;
}
/*初始化*/
Student *Init()
{
    Student *head;
    head=(Student *)malloc(sizeof(Student));
    head->next=NULL;
    return head;
}
/*检查学号*/
char Check_ID(char *s)
{
    int i;
    if(strlen(s)==0||strlen(s)>MAXID)
        return 0;
    for(i=0; i<strlen(s); i++)
    {
        if (s[i] > '0' && s[i] < '9')
            return 1;
    }
    return 0;
}
/*检查姓名*/
char Check_Name(char *s)
{
    int i;
    if(strlen(s)==0||strlen(s)>MAXNAME)
        return 0;
    for(i=0; i<strlen(s); i++)
    {
        if((s[i] >= 'a' && s[i] < 'z') || (s[i] >= 'A' &&  s[i] <= 'Z'))
            return 1;
    }
    return 0;
}
/*检查分数*/
int Check_Score(int s)
{
    if( s>=0 && s<=100 ) return 1;
    return 0;
}
/*检查学号是否相同*/
char Is_SameID(char *s)
{
    Student *p= head->next;
    while(p!=NULL)
    {
        if(strcmp(s,p->id)==0) return 1;
        p=p->next;
    }
    return 0;
}
/* 输入学生信息 */
void Input_Score(Student *p)
{
    /* 学号 */
    printf("\n请输入学号: ");
    do
    {
        gets(p->id);
        if (!Check_ID(p->id))
        {
            printf("输入不正确!请重新输入学号: ");
        }
        else if (Is_SameID(p->id))
        {

            printf("存在已学号!请重新输入学号: ");
        }
    }
    while (!(Check_ID(p->id) && !Is_SameID(p->id)));
    /* 姓名 */
    printf("请输入姓名: ");
    do
    {
        gets(p->name);
        if (!Check_Name(p->name))
        {
            printf("输入不正确!请重新输入姓名: ");
        }
    }
    while (!Check_Name(p->name));      //输入成绩
    int i;

    for(i=0; i<MAXCOURSE; i++)
    {
        do
        {
            printf("请输入%s成绩:",ClassName[i]);
            scanf("%d", &p->score[i]);
            if(!Check_Score(p->score[i]))
                printf("输入成绩不正确!\n请重新输入%s成绩:",ClassName[i]);
        }
        while(!Check_Score(p->score[i]));
    }
    p->average = -1;
    p->sum = -1;
}
/* 头插法插入节点 */
void Insert_Before()
{
    Student *s =(Student*) malloc(sizeof(Student));
    Input_Score(s);
    s->next = head->next;
    head->next = s;
}
/*输出学生成绩信息*/
void Output_Score(Student *p)
{
    int i;
    printf("\n姓名:%s, 学号:%s \n",p->name,p->id);
    for(i=0; i<MAXCOURSE; i++)
    {
        printf("%s成绩:%d  ",ClassName[i],p->score[i]);
    }
}
/*删除节点q*/
void Del_Node(Student *q)
{
    Student *p=head;
    while(p->next!=q)
    {
        p=p->next;
    }
    p->next=q->next;
    free(q);
}
/*插入学生成绩*/
void Insert_List()
{
    int x;
    printf("输入你要插入的学生数:");
    scanf("%d",&x);
    while(x!=0)
    {
        getchar();
        Student *p =(Student*) malloc(sizeof(Student));
        printf("\n请输入学号: ");
        do
        {
            gets(p->id);

            if (!Check_ID(p->id))
            {
                printf("输入不正确!请重新输入学号: ");
            }
            else if (Is_SameID(p->id))
            {

                printf("存在已学号!请重新输入学号: ");
            }
        }
        while (!(Check_ID(p->id) && !Is_SameID(p->id)));
        /* 姓名 */
        printf("请输入姓名: ");
        do
        {
            gets(p->name);
            if (!Check_Name(p->name))
            {
                printf("输入不正确!请重新输入姓名: ");
            }
        }
        while (!Check_Name(p->name));          //输入成绩
        int i;

        for(i=0; i<MAXCOURSE; i++)
        {
            fflush(stdin);
            printf("请输入%s成绩:",ClassName[i]);
            scanf("%d", &p->score[i]);
            do
            {
                if(!Check_Score(p->score[i]))
                    printf("输入成绩不正确!请重新输入%s成绩:",ClassName[i]);
            }
            while(!Check_Score(p->score[i]));
        }
        p->average = -1;
        p->sum = -1;
        p->next = head->next;
        head->next = p;
        x--;
    }
}
/*按学号查找*/
Student *Search_ID(char *id)
{
    Student *p=head->next;
    while(p!=NULL)
    {
        if(strcmp(p->id,id)==0)break;
        p=p->next;
    }
    return p;
}
/*按姓名查找节点*/
Student *Search_Name(char *name)
{
    Student *p=head->next;
    while(p!=NULL)
    {
        if(strcmp(p->name,name)==0)break;
        p=p->next;
    }
    return p;
}
/*输出链表*/
void Output_List()
{
    Student *p;
    p=head->next;
    while(p!=NULL)
    {
        Output_Score(p);
        p=p->next;
    }
}
/*删除指定学生信息*/
void Del_Student()
{
    Student *p;
    fflush(stdin);
    char str[15];
    char judge[10];
    printf("请输入要删除的学生的 学号或姓名:");
    do
    {
        gets(str);

        if(!(Check_ID(str)||Check_Name(str)))
        {
            printf("输入错误!请重新输入:");
        }

    }
    while(!(Check_ID(str)||Check_Name(str)));      //判断是否为学号还是姓名
    if(str[0]>'0'&&str[0]<'9')
    {
        p=Search_ID(str);
        if(p==NULL)
        {
            printf("此学号不存在!\n");
        }
        else
        {
            Output_Score(p);
            printf("是否要删除此学号!(确认按y,任意键取消):");
            gets(judge);
            if(strcmp(judge,"y")==0)
            {
                Del_Node(p);
                printf("删除成功!");
            }
        }
    }
    else
    {
        p=Search_Name(str);
        if(p==NULL)
        {
            printf("此姓名不存在!\n");
        }
        else
        {
            Output_Score(p);
            printf("是否要删除此姓名!(确认按y,任意键取消):");
            gets(judge);
            if(strcmp(judge,"y")==0)
            {
                Del_Node(p);
                printf("删除成功!");
            }
        }
        fflush(stdin);
    }
}
/* 退出 */
void Quit()
{
    exit(0);
}
/*计算班级总人数*/
int Count_People()
{
    Student *p;
    int people=0;
    p=head->next;
    while(p!=NULL)
    {
        people=people+1;
        p=p->next;
    }
    return people;
}
/*计算班级平均分*/
/*
void Count_Mark()
{
    Student *p;
    int m;
    float avecla=0;
    p=head->next;
    while(p!=NULL)
    {
        avecla=avecla+p->sum;
        p=p->next;
    }
    m=Count_People();
    printf("班级平均分为:%.2f",avecla/m);
}
*/
/*比较成绩大小*/
/*
Student *Descby_English(Student *Newhead,Student *sort)
{
    Student *p,*q;
    p=Newhead;
    while(p!=NULL)
    {
        if(sort->sum > p->sum)         break;
        q=p;
        p=p->next;
    }
    if(p==Newhead)
    {
        sort->next = p;
        return sort;
    }
    else
    {
        q->next = sort;
        sort->next = p;
        return Newhead;
    }
}*/
/*按总分或平均分降序排列*/
/*
void Descend_English()
{
    Student *p,*q,*Newhead;
    int i,j=1,people;
    Newhead = NULL;
    p = head;
    while(p != NULL)
    {
        q = p->next;
        Newhead = Descby_English(Newhead,p);
        p = q;
    }
    if(p == head)
        printf("学生信息库为空!!!\n");
    else
    {
        p = Newhead->next;
        people=Count_People();
        printf("按总分和平均分排序如下:\n");
        while(p!=NULL)
        {
            if(j<=people)
            {
                printf("第%d名 ",j);
                printf("姓名:%s 学号:%s ",p->name,p->id);
                for(i=0; i<=people-1; i++)
                {
                    printf("%s:%d ",ClassName[i],p->score[i]);
                }
                printf("总分:%d 平均分:%.2f ",p->sum,p->average);
            }
            j++;
            printf("\n");
            p=p->next;
        }
    }
}*/
/*按姓名查找学生成绩*/
void *Searchname_Student()
{
    char name[10];
    int i=0;
    Student *p=head->next;
    getchar();
    printf("请输入你要查找的学生姓名:");
    do
    {
        gets(name);
        if(!Check_Name(name))
            printf("输入姓名不正确!重新输入:");
    }
    while(!Check_Name(name));
    while(p!=NULL)
    {
        if(strcmp(p->name,name)==0)
        {
            Output_Score(p);
            i=1;
        }
        p=p->next;
    }
    if(i==0)
    {
        printf("找不到此姓名!");
    }
}
/*按学号查找学生成绩*/
void *SearchID_Student()
{
    char id[10];
    int i=0;
    Student *p=head->next;
    getchar();
    printf("请输入你要查找的学生学号:");
    do
    {
        gets(id);

        if(!Check_ID(id))
            printf("输入学号不正确!重新输入:");
    }
    while(!Check_ID(id));
    while(p!=NULL)
    {
        if(strcmp(p->id,id)==0)
        {
            Output_Score(p);
            i=1;
        }
        p=p->next;
    }
    if(i==0)
    {
        printf("找不到此学号!");
    }
}
/*主函数*/
int  main()
{
    int x,n,people;
    // Student *q;
    Menu();
    while(1)
    {
        printf("\n请输入命令编号: ");
        scanf("%d", &x);
        switch(x)
        {
        case 1:  //初始化
            head = Init();
            printf("初始化成功!!!\n");
            break;
        case 2:  //输入成绩

            getchar();
            while(n!=0)
            {
                Insert_Before();
                //  printf("输入序号:");
                scanf("%d",&n);
                getchar();
            }
            break;
        case 3:  //打印出所有成绩
            Output_List();
            break;
        case 4:
            Del_Student();
            break;
        case 5:  //按姓名查找学生成绩
            Searchname_Student();
            break;
        case 6:  //按学号查找学生成绩
            SearchID_Student();
            break;
        case 7:  //计算班级人数
            people=Count_People();
            printf("班级总人数为:%d  \n",people);
            break;
        case 8:  /*插入学生成绩*/
            Insert_List();
            break;
        case 0: /*结束*/
            Quit();
            break;
        default:
            printf("输入错误!\n\n");
        }
    }
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值