用文件和链表实现学生信息管理

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

void delete(stul *h);        //删除学生信息


int main(void)
{
    stul *h;
    h=create();
    openfile(h);
    while(1)
    {
        switch(menu())
        {
            case 1:append(h); break;
            case 2:search(h); break;
            case 3:modify(h); break;
            case 4:delete(h); break;
            case 5:out(h); break;
            case 6:savetofile(h); exit(0); break;
        }
    }
}


void delete(stul *h)        //删除学生信息
{
    stul *p,*l;
    int num;
    char ch;
    p=h;
    l=p->next;
    printf("请输入需要删除的学生学号:");
    while(scanf("%d",&num)!=1)
    {
        while(ch=getchar()!='\n');
        printf("请输入需要删除的学生学号(001 002 003):");
    }
    while(l!=NULL)
    {
        if(l->stuinfo.num==num)
        {
            p->next=p->next->next;
            free(l);
            break;
        }
        l=l->next;
        p=p->next;
    }
}


void modify(stul *h)            //修改学生信息
{
    stul *p;
    int num;
    char ch;
    p=h->next;
    while(p!=NULL)
    {
        printf("请输入需要修改学生信息的学号:");
        while(scanf("%d",&num)!=1)
        {
            while(ch=getchar()!='\n');
            printf("请输入需要修改学生信息的学号(001 002 003):");
        }
        if(p->stuinfo.num==num)
        {
            printf("请输入需要修改的姓名:");
            scanf("%s",&p->stuinfo.name);
            break;
        }
        else
            p=p->next;
    }
}




void search(stul *h)            //根据学号查询信息
{
    stul *p;
    int num;
    char ch;
    p=h->next;
    printf("请输入需要查询的学号:");
    while(scanf("%d",&num)!=1)
    {
        while(ch=getchar()!='\n');
        fprintf(stdout,"请输入需要查询的学号(001 002 003)");
    }
    while(p!=NULL)
    {
        if(p->stuinfo.num==num)
        {
            printf("学号:%d; 姓名:%s\n",p->stuinfo.num,p->stuinfo.name);
            break;
        }
        else
            p=p->next;
    }
}

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

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

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




void savetofile(stul *h)        //把链表中的信息放入文件中
{
    FILE *fp;
    stul *p;
    struct stu stuinfo;
    remove("stuinfo.txt");
    fp=fopen("stuinfo.txt","wb");
    p=h->next;
    while(p!=NULL)
    {
        fwrite(&p->stuinfo,sizeof(stuinfo),1,fp);
        p=p->next;
    }
}


void out(stul *h)    //输出学生信息
{
    stul *p;
    p=h;
    p=p->next;
    while(p!=NULL)
    {
        printf("学号:%d;姓名:%s;\n",p->stuinfo.num,p->stuinfo.name);
        p=p->next;
    }
}


stul *create()        //创建链表
{
    stul *p;
    p=(stul *)malloc(sizeof(stul));
    p->next=NULL;
    return p;
}


void openfile(stul *h)            //把文件中的内容做成一个链表
{
    FILE *fp;
    struct stu stuinfo;
    stul *p,*l;
    p=h;
    if((fp=fopen("stuinfo.txt","rb"))==NULL)
        fprintf(stdout,"sorry cound not open stuinfo.txt file");
    else
    {        
        while(fread(&stuinfo,sizeof(stuinfo),1,fp)==1)
        {
            l=create();
            l->stuinfo=stuinfo;
            p->next=l;
            p=l;
        }
    }
}


void append(stul *h)        //添加学生信息
{
    stul *p,*l;
   struct stu stuinfo;
    int num;
    char name[20];
    char ch,y;
    p=h;
    while(p->next!=NULL)
        p=p->next;
    do
    {
        puts("请输入学号(001 002 003):");
        while(scanf("%d",&num)!=1)
        {
            while(ch=getchar()!='\n');
            fprintf(stdout,"请输入学号(001 002 003):");
        }
        printf("\n请输入姓名:");
        scanf("%s",stuinfo.name);
        l=create();
        stuinfo.num=num;
        //stuinfo.name=name;
        l->stuinfo=stuinfo;
        p->next=l;
        p=l;
        getchar();
        fprintf(stdout,"是否继续添加?(y/n)");
        y=getchar();
    }
    while(y=='y'||y=='Y');                                                            
}


int menu()        //菜单
{
    int num;
    char ch;
    puts("please choose the following chooses!");
    puts("\t1.append student`s info.");
    puts("\t2.search student's info from name.");
    puts("\t3.modify student's info.");
    puts("\t4.delete student's info.");    
    puts("\t5.out student's info.");
    puts("\t6.exit.");
    while(scanf("%d",&num) != 1 || num>6 || num<1)            //获取整数
    {
        while(ch=getchar()!='\n');
        printf("please input your choose as 1 2 ...5 6\n");
        
    }
    return num;
}
  • 11
    点赞
  • 69
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值