数据结构课程设计

来源:互联网 发布:股城模拟炒股软件 编辑:程序博客网 时间:2024/06/13 23:00
  1. /*********************************************************** 
  2. * 版权所有 (C)2016, wangpeng。 
  3. * * 
  4. 文件名称: main.cpp 
  5. * 文件标识: 无 
  6.  
  7. * 其它说明: 无 
  8. * 当前版本: V1.0 
  9. * 作 者: 王鹏
  10. * 完成日期: 20170101 
  11. * * 
  12. **********************************************************/
  13. head.h:
  14. #include<stdio.h>
    #include<string.h>
    #include <malloc.h>
    #include <stdlib.h>
    #include<conio.h>
    #define LEN sizeof(struct student)
    typedef struct student
    {
        long numb;
        int chinese;
        int math;
        int english;
        int totalscore;
        char name[12];
        struct student *next;
    } STU;       
    //声明部
    STU* creat();
    void output(STU *head);
    STU* creatByN(int num);
    STU* findByNumb(STU *head, long num);
    STU* findByNumbEx(STU *head, long num, STU **ppBefore);
    STU* findByName(STU *head, char *name);
    void find(STU *head);
    STU* del(STU *head);
    STU* insert(STU *head); 
    void update(STU *head);
    STU* sort(STU *head);
    void save_info(STU *head);
  15. head.cpp:
    #include"head.h"
    int n;//全局变量
    STU *creat()/*创建链表*/
    {
        STU *head,*pnew,*ptail;
        head=NULL;
        n=0;//初始化
        printf("现进行信息输入号输入0结束\n");
        while(1)
        {
            //断申请新节点
            pnew=(STU *)malloc(LEN);
            printf("号\t姓名\t语文\t数\t英语\n");
            scanf("%ld",&pnew->numb);
            if(pnew->numb==0)
                break;
            scanf("%s",pnew->name);
            scanf("%d%d%d",&pnew->chinese,&pnew->math,&pnew->english);
            pnew->totalscore=0;
            pnew->totalscore=pnew->chinese+pnew->math+pnew->english;
            pnew->next=NULL;//节点连接链表尾部
            n++;
            if(n==1)
            {
                head=pnew;
                ptail=pnew;
            }
            else
            {
                ptail->next=pnew;
                ptail=pnew;
            }//让pnew指向新辟结点,ptail指向链表结点,pnew所指结点连接ptail所指结点面,用"ptail->next=pnew"实现.
        }
        return head;
    }






    void output(STU *head)//输出学生信息
    {
        STU *p;
        printf("共有%d个学生信息:\n",n);
        printf("号\t姓名\t语文\t数\t英语\t总\n");
        for(p=head; p!=NULL; p=p->next)
            printf("%ld\t%s\t%d\t%d\t%d\t%d\n",p->numb,p->name,p->chinese,p->math,p->english,p->totalscore);
    }//输出信息






    struct student *creatByN(int num)//创建学生
    {
        STU *head,*pnew,*ptail;
        int i;
        head=NULL;
        n=0;
        for(i=0; i<num; i++)
        {
            pnew=(STU *)malloc(LEN);
            printf("号\t姓名\t语文\t数\t英语\t总\n");
            scanf("%ld",&pnew->numb);
            scanf("%s",pnew->name);
            scanf("%d%d%d",&pnew->chinese,&pnew->math,&pnew->english);
            pnew->next=NULL;//pnew所指向节点插入链表尾部
            n++;
            if(n==1)
            {
                head=pnew;
                ptail=pnew;
            }
            else
            {
                ptail->next=pnew;
                ptail=pnew;
            }
        }
        return head;
    }




    STU* findByNumb(STU *head, long num)//按学号查找学生,如果找到将学生位置放在presult中
    {
        STU *p,*presult;
        presult=NULL;
        for(p=head; p!=NULL; p=p->next)
            if(p->numb==num)
            {
                presult=p;
                break;
            }
    return presult;
    }




    STU* findByName(STU *head, char *name)//按姓名查找学生,如果找到将学生位置放在presult中
    {
        STU *p,*presult;
        presult=NULL;
        for(p=head; p!=NULL; p=p->next)
            if(strcmp(p->name,name)==0)
            {
                presult=p;
                break;
            }
    return presult;//位置变更返值
    }












    void find(STU *head)
    {
        int num,choice;
        STU *pr;
        char name[12];
        printf("确定查找方式(1:按学号2:按姓名):");
        scanf("%d",&choice);
        if(choice==1)
        {
            printf("输入要查找学号:");
            scanf("%ld",&num);
            pr=findByNumb(head,num);
        }
        else if(choice==2)
        {
            printf("输入要查找姓名:");
            scanf("%s",name);
            pr=findByName(head,name);
        }
        if(pr==NULL)
            printf("未找到该学生\n");//未找到该学生
        else
        {
            printf("该学生信息为:\n");
            printf("学号\t姓名\t语文\t数学\t英语\t总分\n");
            printf("%ld\t%s\t%d\t%d\t%d\n",pr->numb,pr->name,pr->chinese,pr->math,pr->english,pr->totalscore);
        }
    }




    void update(STU *head)//修改学生信息
    {
        int  xinxi;
    int x;
        int num;
        STU *pr;
        printf("输入要查找学号:");
        scanf("%ld",&num);
        pr=findByNumb(head,num);
        if(pr==NULL)
            printf("未找到该学生\n");
        else
        {
            printf("找到该学生:\n");
            printf("学号\t姓名\t语文\t数\t英语\t总\n");
            printf("%ld\t%s\t%d\t%d\t%d\n",pr->numb,pr->name,pr->chinese,pr->math,pr->english);
            printf("请确定如何修改信息\n");
    printf("1.该两项以上信息\n2.修改1项信息\n");
            scanf("%d",&x);
    if(x==1)
            {
    printf("号\t姓名\t语文\t数\t英语\t总\n");
    scanf("%ld%s%d%d%d%d",&pr->numb,&pr->name,&pr->chinese,&pr->math,&pr->english);        
    pr->totalscore=0;
    pr->totalscore=pr->chinese+pr->math+pr->english;
    }
    else
    {
    printf("请输入要修改的信息\n");
    printf("1为学号\n2为姓名\n3为语文成绩\n4为数学成绩\n5为英语成绩\n");
    scanf("%d",&xinxi);
    switch(xinxi)
    {
    case 1:
    scanf("%ld",&pr->numb);
    printf("修改成功\n");
    break;
    case 2:
    scanf("%s",&pr->name);
    printf("修改成功\n");
    break;
    case 3:
    scanf("%d",&pr->chinese);
    pr->totalscore=0;
    pr->totalscore=pr->chinese+pr->math+pr->english;
    printf("修改成功\n");
    break;
    case 4:
    scanf("%d",&pr->math);
    pr->totalscore=0;
    pr->totalscore=pr->chinese+pr->math+pr->english;
    printf("修改成功\n");
    break;
    case 5:
    scanf("%d",&pr->english);
    pr->totalscore=0;
    pr->totalscore=pr->chinese+pr->math+pr->english;
    printf("修改成功\n");
    break;
    }
    }
        }
    }


    STU* findByNumbEx(STU *head, long num, STU *&ppBefore)//查找学生,&ppbefore为引用型
    {
        STU *p,*presult,*pBefore;
        presult=pBefore=NULL;
        for(p=head; p!=NULL; pBefore=p,p=p->next) //记录指针前位置
            if(p->numb==num)
            {
                presult=p;
                break;
            }
    ppBefore=pBefore;//
    return presult;
    }


    STU* del(STU *head)//删除学生
    {
        long num;
        STU *pCur,*pBefore;
    //查找要删除节点用pCur记录该节点
        printf("输入要删除学号:");
        scanf("%ld",&num);
        pCur=findByNumbEx(head,num,pBefore);
    //该节点存进行删除
        if(pCur!=NULL)
        {
            n--;//记录删除节点数
    //根据pCur所指节点位置进行判断:节点或续节点
    //删除节点
            if(pCur==head)
            {
                head=pCur->next;
            }
    //删除续节点
            else
            {
    //获取前向节点指针pBefore

    //利用pBeforepCur完删除
                pBefore->next=pCur->next;
            }
        }
        return head;
    }




    STU* insert(STU *head)//按学号大小插入学生信息,学号小的考前
    {
        STU *pCur,*pnew,*pBefore,*p;
    //申请新节点并赋值
        pnew=(STU *)malloc(LEN);
        printf("学号\t姓名\t语文\t数\t英语\n");
        scanf("%d",&pnew->numb);
        scanf("%s",&pnew->name);
        scanf("%d%d%d",&pnew->chinese,&pnew->math,&pnew->english);
        pnew->totalscore=0;
        pnew->totalscore=pnew->chinese+pnew->math+pnew->english;
        pnew->next=NULL;
        if(head==NULL)//链表空
            head=pnew;
        else //链表不空
        {
    //找位置即获取pCur,pCur记录的为比插入学生学号大的位置
            for(p=head; p!=NULL; pBefore=p,p=p->next)
                if(p->numb > pnew->numb)
                {
                    pCur=p;
                    break;
                }
    //没找pCur则应pnew插入尾节点
    if(p==NULL)
    {
    pBefore->next=pnew;
    }
    //找pCur则应pnew插入pCur前根据pCur位置:结点前间节点前两种情况
    else
    {
    //插入学生的学号最小,讲插入学生放在头指针位置
    if(pCur==head)
    {
    pnew->next=pCur;
    head=pnew;
    }
    //pCur间结点
    else
    {
    pnew->next=pCur;
    pBefore->next=pnew;
    }
    }
        }
        n++;
        return head;
    }




    STU* sort(STU *head)
    {
    int x;
    printf("按总分排序请输入1\n按语文成绩排序请输入2\n");
    scanf("%d",&x);
    if(x=1)

    {
    STU *first; 
    STU *tail; 
    STU *p_min;
    STU *min;
    STU *p; 
    (STU *)malloc(LEN);
    first = NULL;
    while (head != NULL) 
    {
    /*注意:for语句体现选择排序思想*/
    for (p=head,min=head; p->next!=NULL; p=p->next) /*循环遍历链表节点找节点*/
    {
    if (p->next->totalscore < min->totalscore) 
    {
    p_min = p; 
    min = p->next;
    }
    }//通过for循环对比出最小的总分,存入到min中,前驱结点p_min。

    /*当for语句结束要做两件事:一,将第一个最小值min设为头指针,并指向其余的最小值min。二,将最小值min从原链表中取出,并使p_min->next=min->next*/
    /*第一件事*/
    if (first == NULL) //确定有无次链表中的最小值
    {
    first = min; //最小值min设为头指针
    tail = min; /*注意:尾指针让指向节点*/
    }
    else //链表已有最小值
    {
    tail->next = min; //让尾指针的next指向最小值。
    tail = min; //尾插法建立链表
    }
    /*第二件事*/
    if (min == head) /*找节点第节点*/
    {
    head = head->next; /*显让head指向原head->next,即第二节点OK*/
    }
    else /*第节点*/
    {
    p_min->next = min->next; /*前节点next指向前minnext,让min离原链表*/
    }
    }


    if (first != NULL) /*循环结束序链表first*/
    {
    tail->next = NULL; /*单向链表节点next应该指向NULL*/
    }
    head = first;
    output( head );
    return head;

    }
    else//冒泡排序
    {
    STU *HH;
    HH=head;
    while(n>=1)
    {
    while(HH->next!=NULL)
    {
    if(HH->chinese>HH->next->chinese)
    {
    int t;
    t=HH->chinese;
    HH->chinese=HH->next->chinese;
    HH->next->chinese=t;
    }
    HH=HH->next;

    }
    n--;
    HH=head->next;
    }

    }


    }
    //保存
    void save_info(STU *head)
    {
        STU *p;
        FILE *fp;
        char filename[20];
        printf("输入保存文件文件名:");
        scanf("%s",filename);
        if((fp=fopen(filename,"w"))==NULL)
        {
            printf("can not open the file");
            exit(0);
        }
        fprintf(fp,"一共%d个学生:\n",n);
        fprintf(fp,"号\t姓名\t语文\t数\t英语\t总\n");
        for(p=head; p!=NULL; p=p->next)
            fprintf(fp,"%ld\t%s\t%d\t%d\t%d%\t%d\n",p->numb,p->name,p->chinese,p->math,p->english,p->totalscore);
        fclose(fp);
        printf("保存成功\n");
    }
  16. main.cpp:
    #include"head.h"
    int main()
    {
        STU *head;
        int choice;


        for(;;)
        {
            system("cls");/*清屏*/
    printf("\t********************************\t\n");
            printf("\t欢迎使用成绩管理系统\t\n");
            printf("\t1:输入信息\t\n");
            printf("\t2:显示全部信息\t\n");
            printf("\t3:删除\t\n");
            printf("\t4:查找\t\n");
            printf("\t5:插入\t\n");
            printf("\t6:修改\t\n");
            printf("\t7:排序\t\n");
            printf("\t8:保存文件\t\n");
            printf("\t0:退出系统\t\n");
       printf("\t********************************\t\n");
            printf("*请输入数字(0-8)进行功能选择 :");
            scanf("%d",&choice);
            if(choice==0) break;
            switch(choice)
            {
            case 1:
                head=creat();
                break;
            case 2:
                output(head);
                break;
            case 3:
                head=del(head);
                break;
            case 4:
                find(head);
                break;
            case 5:
                head=insert(head);
                break;
            case 6:
                update(head);
                break;
            case 7:
                head=sort(head);
                break;
            case 8:
                save_info(head);
                break;
            }
            printf("按任意键继续....\n");
            getch();/*暂停*/
        }
        printf("欢迎使用再见\n");
        return 0;
    }
0 0
原创粉丝点击