数据结构课程设计

来源:互联网 发布:macbook air装windows 编辑:程序博客网 时间:2024/06/13 07:46

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");        }    }}


0 0
原创粉丝点击