zoukankan      html  css  js  c++  java
  • 【C】用文件和链表实现学生信息管理

    主要思想,main函数开始的时候从文件中读取数据,然后把数据做成一个链表存放到内存。然后开始通过菜单选项进行想要的操作(增加信息,修改信息,删除信息·····)。最后要推出程序的时候删除存放数据的文件,然后在创建一个文件把操作后的数据依次写入文件中。(练手程序,没什么技术含量!)

      1 #include<stdio.h>
      2 #include<stdlib.h>
      3 
      4 struct stu
      5 {
      6     int num;
      7     char name[20];
      8 };
      9 typedef struct stul
     10 {
     11     struct stu stuinfo;
     12     struct stul *next;
     13 }stul;
     14 
     15 int menu();        //菜单
     16 stul *create();        //创建链表
     17 void openfile(stul *h);     //初始化文件中的学生信息
     18 void append(stul *h);        //添加学生信息
     19 void out(stul *h);        //输出学生信息
     20 void savetofile(stul *h);        //把链表中的信息放入文件中
     21 void search(stul *h);        //根据学号查询信息
     22 void modify(stul *h);        //修改学生信息
     23 void delete(stul *h);        //删除学生信息
     24 
     25 int main(void)
     26 {
     27     stul *h;
     28     h=create();
     29     openfile(h);
     30     while(1)
     31     {
     32         switch(menu())
     33         {
     34             case 1:append(h); break;
     35             case 2:search(h); break;
     36             case 3:modify(h); break;
     37             case 4:delete(h); break;
     38             case 5:out(h); break;
     39             case 6:savetofile(h); exit(0); break;
     40         }
     41     }
     42 }
     43 
     44 void delete(stul *h)        //删除学生信息
     45 {
     46     stul *p,*l;
     47     int num;
     48     char ch;
     49     p=h;
     50     l=p->next;
     51     printf("请输入需要删除的学生学号:");
     52     while(scanf("%d",&num)!=1)
     53     {
     54         while(ch=getchar()!='\n');
     55         printf("请输入需要删除的学生学号(001 002 003):");
     56     }
     57     while(l!=NULL)
     58     {
     59         if(l->stuinfo.num==num)
     60         {
     61             p->next=p->next->next;
     62             free(l);
     63             break;
     64         }
     65         l=l->next;
     66         p=p->next;
     67     }
     68 }
     69 
     70 void modify(stul *h)            //修改学生信息
     71 {
     72     stul *p;
     73     int num;
     74     char ch;
     75     p=h->next;
     76     while(p!=NULL)
     77     {
     78         printf("请输入需要修改学生信息的学号:");
     79         while(scanf("%d",&num)!=1)
     80         {
     81             while(ch=getchar()!='\n');
     82             printf("请输入需要修改学生信息的学号(001 002 003):");
     83         }
     84         if(p->stuinfo.num==num)
     85         {
     86             printf("请输入需要修改的姓名:");
     87             scanf("%s",&p->stuinfo.name);
     88             break;
     89         }
     90         else
     91             p=p->next;
     92     }
     93 }
     94 
     95 
     96 void search(stul *h)            //根据学号查询信息
     97 {
     98     stul *p;
     99     int num;
    100     char ch;
    101     p=h->next;
    102     printf("请输入需要查询的学号:");
    103     while(scanf("%d",&num)!=1)
    104     {
    105         while(ch=getchar()!='\n');
    106         fprintf(stdout,"请输入需要查询的学号(001 002 003)");
    107     }
    108     while(p!=NULL)
    109     {
    110         if(p->stuinfo.num==num)
    111         {
    112             printf("学号:%d; 姓名:%s\n",p->stuinfo.num,p->stuinfo.name);
    113             break;
    114         }
    115         else
    116             p=p->next;
    117     }
    118 }
    119 
    120 void savetofile(stul *h)        //把链表中的信息放入文件中
    121 {
    122     FILE *fp;
    123     stul *p;
    124     struct stu stuinfo;
    125     remove("stuinfo.txt");
    126     fp=fopen("stuinfo.txt","wb");
    127     p=h->next;
    128     while(p!=NULL)
    129     {
    130         fwrite(&p->stuinfo,sizeof(stuinfo),1,fp);
    131         p=p->next;
    132     }
    133 }
    134 
    135 void out(stul *h)    //输出学生信息
    136 {
    137     stul *p;
    138     p=h;
    139     p=p->next;
    140     while(p!=NULL)
    141     {
    142         printf("学号:%d;姓名:%s;\n",p->stuinfo.num,p->stuinfo.name);
    143         p=p->next;
    144     }
    145 }
    146 
    147 stul *create()        //创建链表
    148 {
    149     stul *p;
    150     p=(stul *)malloc(sizeof(stul));
    151     p->next=NULL;
    152     return p;
    153 }
    154 
    155 void openfile(stul *h)            //把文件中的内容做成一个链表
    156 {
    157     FILE *fp;
    158     struct stu stuinfo;
    159     stul *p,*l;
    160     p=h;
    161     if((fp=fopen("stuinfo.txt","rb"))==NULL)
    162         fprintf(stdout,"sorry cound not open stuinfo.txt file");
    163     else
    164     {        
    165         while(fread(&stuinfo,sizeof(stuinfo),1,fp)==1)
    166         {
    167             l=create();
    168             l->stuinfo=stuinfo;
    169             p->next=l;
    170             p=l;
    171         }
    172     }
    173 }
    174 
    175 void append(stul *h)        //添加学生信息
    176 {
    177     stul *p,*l;
    178    struct stu stuinfo;
    179     int num;
    180     char name[20];
    181     char ch,y;
    182     p=h;
    183     while(p->next!=NULL)
    184         p=p->next;
    185     do
    186     {
    187         puts("请输入学号(001 002 003):");
    188         while(scanf("%d",&num)!=1)
    189         {
    190             while(ch=getchar()!='\n');
    191             fprintf(stdout,"请输入学号(001 002 003):");
    192         }
    193         printf("\n请输入姓名:");
    194         scanf("%s",stuinfo.name);
    195         l=create();
    196         stuinfo.num=num;
    197         //stuinfo.name=name;
    198         l->stuinfo=stuinfo;
    199         p->next=l;
    200         p=l;
    201         getchar();
    202         fprintf(stdout,"是否继续添加?(y/n)");
    203         y=getchar();
    204     }
    205     while(y=='y'||y=='Y');                                                            
    206 }
    207 
    208 int menu()        //菜单
    209 {
    210     int num;
    211     char ch;
    212     puts("please choose the following chooses!");
    213     puts("\t1.append student`s info.");
    214     puts("\t2.search student's info from name.");
    215     puts("\t3.modify student's info.");
    216     puts("\t4.delete student's info.");    
    217     puts("\t5.out student's info.");
    218     puts("\t6.exit.");
    219     while(scanf("%d",&num) != 1 || num>6 || num<1)            //获取整数
    220     {
    221         while(ch=getchar()!='\n');
    222         printf("please input your choose as 1 2 ...5 6\n");
    223         
    224     }
    225     return num;
    226 }

    比较有用的检测输入算法:

    1 while(scanf("%d",&num)!=1)
    2 {
    3     while(ch=getchar()!='\n');
    4     fprintf(stdout,"请输入需要查询的学号(001 002 003)");
    5 }

    有两个循环来接收输入的一个int型的变量。第一个循环是判断接收的数据是否是一个整型,如果不是继续接收;第二个循环是接收错误的数据,知道下一个换行符是停止接收!

  • 相关阅读:
    8.11 hdu 多校第五场补题
    8.10 trie树模板
    8.6 edu25 ,577#div2 CF补题(二分 ,dp 与 贪心
    8.4 POJ 3237 (树链剖分+线段树
    8.4 poj 2763 Housewife Wind (树链剖分边权处理
    8.4 树链剖分
    8.3 树链剖分
    2019 hdu 第四场补题 (2
    2019 hdu 第四场补题 (1 ,签到题
    51NOD 1137 矩阵乘法
  • 原文地址:https://www.cnblogs.com/ngnetboy/p/2792186.html
Copyright © 2011-2022 走看看