zoukankan      html  css  js  c++  java
  • C程序范例(2)——学生管理系统”链表“实现

    1.对于学生管理系统,能够实现的方法有许多,但是今天我们用链表的方法来实现。虽然初学者很可能看不懂,但是不要紧,这是要在整体的系统的学习完C语言之后,我才编写出的程序。所以大家不必要担心。在这里与大家分享我的学生管理系统的链表的实现过程。

    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #include<conio.h>
    struct student 
    {
        char bianhao[16];
        char name[16];
        struct student *next;
    };
    struct student *creat()//创建链表
    {
        struct student *head,*p,*end;
        head=p=end=(struct student*)malloc(sizeof(struct student));
        printf("请输入学生的编号:
    ");
        scanf("%s",p->bianhao);
        while(strcmp(p->bianhao,"0")!=0)
        {
            end=p;
            printf("请输入学生的姓名
    ");
            scanf("%s",p->name);
            p=(struct student *)malloc(sizeof(struct student));
            end->next=p;
            printf("请输入学生的编号
    ");
            scanf("%s",p->bianhao);
        }
        end->next=NULL;
    }
    void save(struct student *head)//将链表保存为文件形式
    {   
        FILE *fp;
        struct student *p;
        char filename[20];
        int ch;
        printf("请输入要保存的文件名
    ");
        scanf("%s",filename);
        if(fp=fopen(filename,"r")!=NULL)
        {
            printf("该文件已经存在,是否覆盖?
    ");
            printf("1-覆盖,2-不覆盖
    ");
            scanf("%d",&ch);
            if(ch!=1)
            {
                printf("请重新输入要保存的文件名
    ");
                scanf("%s",filename);
            }
        }
        if(fp=fopen(filename,"w")==NULL)
        {
            printf("创建文件失败
    ");
        }
        p=head;
        while(p!=NULL)
        {
            fprintf(fp,"%s
    ",p->bianhao);
            fprintf(fp,"%s
    ",p->name);
            p=p->next;
        }
        fputs("over",fp);
        printf("文件保存成功
    ");
        fclose(fp);
    }
    void output(struct student *head)//输出链表
    {
        struct student *p;
        p=head;
        if(p==NULL)
        {
            printf("没有创建任何记录
    ");
        }
        while(p!=NULL)
        {
            printf("%s",p->bianhao);
            printf("%s",p->name);
            p=p->next;
        }
    }
    struct student *openfile()//打开文件,即新创建连表读取链表文件
    {
        struct student *head,*p,*f;
        FILE *fp;
        char filename[20];
        int ch;
        printf("请输入想要打开的文件名
    ");
        scanf("%s",filename);
        if(fp=fopen(filename,"r")==NULL)
        {
            printf("打开文件失败
    ");
            printf("1-请重新输入文件名
    2-退出");
            scanf("%d",&ch);
            if(ch==1)
                scanf("%s",filename);
            else if(ch==2)
                return NULL;
        }
        head=p=f=(struct student *)malloc(sizeof(struct student));
        fscanf(fp,"%s%s",p->bianhao,p->name);
        while(!feof(fp))
        {
            p=(struct student *)malloc(sizeof(struct student));
            f->next=p;//用以节点的链接,是f节点的下一个是p节点,从而就将p,与f联系起来了
            fscanf(fp,"%s%s",p->bianhao,p->name);
            if(strcmp(p->bianhao,"over")==0)
            {
                f->next=NULL;
                printf("文件打开成功
    ");
            }
            f=p;
        }
    }
    void sort_hao(struct student *head)//按照标号排序
    {
        struct student *p,*f,*t;
        char ch[100];
        int i;
        p=f=t=head;
        if(head==NULL)
        {
            printf("没有打开任何文件
    ");
        }
        for(p=head;p->next!=NULL;p=p->next)
        {
            for(t=head;f=t->next;t=t->next,f=f->next)
            {
                if(strcmp(t->bianhao,f->bianhao)>0)
                {
                    strcpy(ch,t->bianhao);
                    strcpy(t->bianhao,f->bianhao);
                    strcpy(f->bianhao,ch);
    
                    strcpy(ch,t->name);
                    strcpy(t->name,f->name);
                    strcpy(f->name,ch);
                }
            }
        }
        printf("排序完成
    ");
    }
    void sort_name(struct student *head)//按照姓名排序
    {
        struct student *p,*f,*t;
        char ch[100];
        int i;
        p=f=head=t;
        if(head=NULL)
        {
            printf("文件未能打开
    ");
        }
        for(p=head;p->next!=NULL;p=p->next)
        {
            for(t=head;f=t->next!=NULL;t=t->next,f=f->next)
            {
                if(strcmp(t->name,f->name)>0)
                {
                    strcpy(ch,t->bianhao);
                    strcpy(t->bianhao,f->bianhao);
                    strcpy(f->bianhao,ch);
    
                    strcpy(ch,t->name);
                    strcpy(t->name,f->name);
                    strcpy(f->name,ch);
                }
            }
        }
        printf("完成排序
    ");
    }
    void search(struct student *head)//查询
    {
        struct student *p;
        char str[20];
        int i,j=0;
        p=head;
        if(head==NULL)
        {
            printf("没有打开任何文件
    ");
        }
        printf("1-按照编号查询
    2-按照姓名查询
    ");
        scanf("%d",&i);
        if(i=1)
        {
            printf("请输入学生的编号
    ");
        }
        else
        {
            printf("请输入学生的姓名
    ");
        }
        scanf("%s",str);
        while(p!=NULL)
        {
            if(i==1)
            {
                if(strcmp(p->bianhao,str)==0)
                {
                    printf("编号:%s
    姓名:%s
    ",p->bianhao,p->name);
                    j=1;
                    break;
                }
            }
            if(i==2)
            {
                if(strcmp(p->name,str)==0)
                {
                    printf("编号:%s
    姓名:%s
    ",p->name,p->name);
                    j=1;
                }
            }
            p=p->next;
        }
        if(j==0)
        {
            printf("查找完毕,没有找到任何结果
    ");
        }
    }
    struct student *add(struct student *head)//添加学生的信息
    {
        struct student *p,*e,*f,*h;
        if(head==NULL)
        {
            printf("打开文件失败
    ");
        }
        h=e=f=head;
        p=(struct student *)malloc(sizeof(struct student));//新添加节点,即新添加记录
        printf("编号:
    ");
        scanf("%s",p->bianhao);
        printf("姓名:
    ");
        scanf("%s",p->name);
        if(strcmp(f->bianhao,p->bianhao)>0)
        {
            p->next=f;
            h=p;
            printf("添加成功
    ");
        }
        if(f->next=NULL)
        {
            f->next=p;
            p->next=NULL;
            printf("添加成功
    ");
        }
        while(f->next!=NULL)
        {
            if(f->next==NULL)
            {
                f->next=p;
                p->next=NULL;
                printf("添加成功
    ");
            }
        }
    }
    struct student *delete_mem(struct student *head)//删除个人信息
    {
        struct student *p,*e;
        char str[20];
        if(head==NULL)
        {
            printf("未能打开任何文件
    ");
        }
        p=e=head;
        printf("请输入要删除的编号
    ");
        scanf("%s",str);
        if(strcmp(p->bianhao,str)==0)
        {
            head=head->next;
            printf("删除成功
    ");
        }
        p=p->next;
        while(p!=NULL)
        {
            if(strcmp(p->bianhao,str)==0)
            {
                if(p->next!=NULL)
                    e->next=p->next;
                if(p->next==NULL)
                    e->next=NULL;
                printf("删除成功
    ");
            }
            p=p->next;
            e=e->next;
        }
        printf("搜索完毕,未能找到结果
    ");
    }
    struct student *change(struct student *head)//修改学生的信息
    {
        struct student *p;
        char str[20];
        if(head==NULL)
        {
            printf("未能打开任何文件
    ");
        }
        p=head;
        printf("请输入要修改的学生编号
    ");
        scanf("%s",p->bianhao);
        while(p!=NULL)
        {
            if(strcmp(p->bianhao,str)==0)
            {
                printf("编号:%s
    姓名:%s
    ",p->bianhao,p->name);
                printf("请按照提示操作
    ");
                printf("编号
    ");
                scanf("%s",p->bianhao);
                printf("姓名
    ");
                scanf("%s",p->name);
            }
            p=p->next;
        }
        printf("未能找到记录
    ");
    }
    void mima()//密码的加密
    {
        FILE *fp;
        char mima1[20],mima2[20];
        int i=0;
        if(fp=fopen("mima","r")==NULL)
        {
            printf("密码尚未创建
    ");
            do
            {
                printf("请输入密码
    ");
                scanf("%s",mima1);
                printf("请在此输入密码
    ");
                scanf("%s",mima2);
                if(strcmp(mima1,mima2)!=0)
                {
                    printf("两次输入的密码不同,请重新输入
    ");
                    i=1;
                }
                else
                    break;
            }while(i);
            fp=fopen("mima","w");
            fprintf(fp,"%s",mima1);
            printf("密码试制成功
    ");
            fclose(fp);
        }
        else
            printf("密码以创建
    ");
    }
    void delete_doc()//文件的删除操作
    {
        FILE *fp;
        char mima1[20],mima2[20],filename[20];
        printf("请输入初始密码
    ");
        scanf("%s",mima1);
        fp=fopen("mima1","r");
        fscanf(fp,"%s",mima2);
        if(strcmp(mima1,mima2)==0)
        {
            printf("请输入要删除的文件名
    ");
            scanf("%s",filename);
            if(remove(filename)==0)//remove函数的应用?
            {
                printf("删除成功
    ");
            }
            else
            {
                printf("删除失败");
            }
        }
        else
            printf("密码错误
    ");
    }
    void output_use()
    {
        printf("使用方法如下
    ");
        printf("1-编辑个人信息之后需要保存,否则再次启动时会覆盖
    ");
        printf("2-保存信息后,若要在原文件中添加,则需要先打开文件功能,然后再添加记录,然后再保存
    ");
        printf("3-除了新建文件之外,进行其他功能,先打开文件才能继续
    ");
        printf("4-编辑个人信息时,以学号0作为结束,故学生学号是没有为0的
    ");
        printf("5-由于本系统的缺陷,故在保存前需要保存一个学生的信息
    ");
    }
    void output_view()//功能表
    {
        printf("==========================
    ");
        printf("0-使用说明
    ");
        printf("1-编辑学生的信息
    ");
        printf("2-保存学生的信息
    ");
        printf("3-显示学生的信息
    ");
        printf("4-打开记录
    ");
        printf("5-将记录排序
    ");
        printf("6-查询记录
    ");
        printf("7-添加记录
    ");
        printf("8-删除记录
    ");
        printf("9-修改记录
    ");
        printf("a-设置密码
    ");
        printf("b-删除文件
    ");
        printf("==========================
    ");
    }
    void main()//主函数
    {
        struct student *head=NULL;
        char ch;
        int i,j=0;
        printf("欢迎使用本系统,按回车键进入系统
    ");
        getchar();
        system("cls");
        do
        {
            output_view();
            printf("请选择相应的操作
    ");
            scanf("%c",&ch);
            switch(ch)
            {
            case '0':output_use();break;
            case '1':head=creat();break;
            case '2':save(head);break;
            case '3':output(head);break;
            case '4':head=openfile();break;
            case '5':system("cls");
                printf("1-按照编号排序
    ");
                printf("2-按照姓名排序
    ");
                scanf("%d",&i);
                switch(i)
                {
                case 1:sort_hao(head);break;
                case 2:sort_name(head);break;
                }
                break;
            case '6':search(head);break;
            case '7':head=add(head);break;
            case '8':head=delete_mem(head);break;
            case '9':head=change(head);break;
            case 'a':mima();break;
            case 'b':delete_doc();break;
            }
            printf("按回车键返回
    ");
            getchar();
            system("cls");
            j=1;
        }while(j);
    }

    2.希望与大家共同努力,共同上进。

    长风破浪会有时,直挂云帆济沧海!

  • 相关阅读:
    Python基础第四天
    Python基础第三天
    禁用站点asp运行
    Javaee中文乱码解决方法
    企业研发流程演进之路
    【项目实践】手把手教你自建高性能对象存储服务器
    我们到底为什么要用 IoC 和 AOP
    【项目实践】商业计算怎样才能保证精度不丢失
    人人都可以教张小龙做产品
    【项目实践】依赖注入用得好,设计模式随便搞
  • 原文地址:https://www.cnblogs.com/yjds/p/5887996.html
Copyright © 2011-2022 走看看