X-ming 发表于 2020-5-21 13:54

用C语言实现简单的学生数据库管理系

##    用C语言实现简单的学生数据库管理系

**项目概述**
        用C语言的结构体、指针、文件操作以及块的读写实现链式学生数据库存储,可以完成数据库的增、删、改、查以及数据根据学号有序排列功能等。
       
****实现流程****
函数声明

```
#include<stdio.h>
#define path "F:\\桌面\\student.dat"
struct student{
        char name;
        int num;
        int age;
        char sex;
        struct student *next;
};
voidmain_window();
void look_student(struct student *head);
void add_student(struct student *head);
void del_student(struct student *head);
void update_student(struct student *head);
void check_order(struct student *head);
void wirte_data(struct student *head);
void read_data(struct student *head);
struct student *create_student(int num);
struct student *new_data();
```

1. 主界面实现
                ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200521133027386.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxOTYxODgx,size_16,color_FFFFFF,t_70)
如图该系统就五个命令,增删改查以及系统退出命令。
```
voidmain_window(){
        printf("*********************欢迎进入学生管理系统**********************\n");
        printf("操作命令:\n");
        printf("添加学生信息:1\n删除学生信息:2\n查找学生信息:3\n更新学生信息:4\n退出系统:0\n");
}
```
2. 实现命令循环接收,每次接收命令前先读取数据文件,然后执行命令写入数据文件


```
void main(){
        struct student *head=NULL;
        head=malloc(sizeof(struct student ));
        head->next=NULL;
        main_window();
        while(1){
                read_data(head);
                check_order(head);       
                wirte_data(head);
        }
}
```

```
void check_order(struct student *head){
        int order;
        printf("请输入命令:");
        scanf("%d",&order);
        if(order==0){
                printf("您已经成功退出系统!谢谢使用!\n");
                exit();
        }
        if(order==1){
                printf("请开始添加学生\n");
                add_student(head);
                return;
        }
       
        if(order==2){
                del_student(head);
                return;
        }
       
        if(order==3){
                look_student(head);
                return;
        }
        if(order==4){
                update_student(head);
                return;
        }
        printf("您输入的命令有误!请重新输入:\n");       
}
```

3、实现增删查改功能

```
void add_student(struct student *head){//排序插入
        struct student *p1=NULL,*p2=NULL;
        int num;
        printf("请输入学号:");
        p2=head->next;
        scanf("%d",&num);
        //char name;
        if(p2==NULL){
                p1=create_student(num);
                p1->next=NULL;
                head->next=p1;
                printf("学生:%d添加成功!\n",num);
                return;
        }
       
        while(p2){
                if(p2->num==num){
                        printf("该学号已经有学生!\n");
                        return;
                }
                if(((head->next)->num)>num&&p2==head->next){
                        p1=create_student(num);
                        p1->next=head->next;
                        head->next=p1;
                        printf("学生:%d添加成功!\n",num);
                        return;
                }
                if((p2->next!=NULL)&&(p2->num<num)&&((p2->next)->num>num)){
                        p1=create_student(num);
                        p1->next=p2->next;
                        p2->next=p1;
                        printf("学生:%d添加成功!\n",num);
                        return;
                }
                if(p2->next==NULL){
                        p1=create_student(num);
                        p1->next=NULL;
                        p2->next=p1;
                        printf("学生:%d添加成功!\n",num);
                        return;
                }
                p2=p2->next;
        }
                               
}
void del_student(struct student *head){
        struct student *p1=NULL,*p2=NULL;
        int num;
        p2=head->next;
        if(p2==NULL){
                printf("数据库中没有学生!\n");
                return;
        }
        printf("请输入要删除学生的学号:");
        scanf("%d",&num);
        //char name;
       
        while(p2){
                if(((head->next)->num)==num){//删除头数据
                        p1=head->next;
                        head->next=p1->next;
                        free(p1);
                        printf("学生:%d删除成功!\n",num);
                        return;
                }
                if((p2->next!=NULL)&&((p2->next)->next!=NULL)&&(p2->next)->num==num){//删除中间数据
                        p1=p2->next;
                        p2->next=p1->next;
                        free(p1);
                        printf("学生:%d删除成功!\n",num);
                        return;
                }
                if((p2->next!=NULL&&(p2->next)->next==NULL&&(p2->next)->num==num)){//删除尾数据
                        p1=p2->next;
                        p2->next=NULL;
                        free(p1);
                        printf("学生:%d删除成功!\n",num);
                        return;
                }
                else{
                        printf("数据库中没有你要删除的学生!\n");
                        return;
                }
                p2=p2->next;
        }
       
}

struct student *create_student(int num){
        struct student *p;
        p=malloc(sizeof(struct student));
        printf("请输入姓名:");
        scanf("%s",p->name);    //遇坑
        p->num=num;
        printf("请输入性别:");//遇坑
        scanf("%s",p->sex);
        printf("请输入年龄:");
        scanf("%d",&p->age);
        return p;
}
void look_student(struct student *head){
        struct student *p1;
        p1=head->next;
        if(p1==NULL){
                printf("抱歉,数据库没有学生信息!\n");
                return;
        }
        printf("***********学生信息*************");
        printf("\n*姓名*\t*学号*\t*性别*\t*年龄*\n");
        printf("******************************\n");
       
        do{
                printf("%s\t%d\t%s\t%d\n",p1->name,p1->num,p1->sex,p1->age);
                p1=p1->next;
        }while(p1);
        printf("******************************\n");
}
void update_student(struct student *head){
        struct student *p1=NULL,*p2=NULL;
        int num;
        p2=head->next;
        if(p2==NULL){
                printf("数据库中没有学生!\n");
                return;
        }
        printf("请输入要更新信息学生的学号:");
        scanf("%d",&num);
        while(p2){
                if(p2->num==num){
                        printf("请输入修改姓名:");
                        scanf("%s",p2->name);    //遇坑
                        printf("请输入修改性别:");//遇坑
                        scanf("%s",p2->sex);
                        printf("请输入修改年龄:");
                        scanf("%d",&p2->age);
                        printf("学生:%d的信息修改成功!\n",num);
                        return;
                }
                p2=p2->next;
        }
        printf("没有该学生!\n");
}
```

4. 实现学生数据的从文件读与写


```
void wirte_data(struct student *head){//写数据入文件
        struct student *p=NULL;
        FILE *fp;
        fp=fopen(path,"w");
        p=head->next;
        while(p){
                fwrite(p,sizeof(struct student),1,fp);
                p=p->next;
        }
       
        fclose(fp);
}

void read_data(struct student *head){//从文件中读出数据到有序链表
        FILE *fp;
        struct student *p=NULL,*q=NULL;
        p=head;
        fp=fopen(path,"r");
        q=new_data();
        while(fread(q,sizeof(struct student),1,fp)==1){
                p->next=q;
                p=p->next;
                q=new_data();
        }
        fclose(fp);
}
```
成果图
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200521134606731.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxOTYxODgx,size_16,color_FFFFFF,t_70)
项目源码:
链接:https://pan.baidu.com/s/17TX0eDXVuXkphCDg_GpcpQ
提取码:nqpr

注意:如果没有student.dat这个文件可能会报错,可以手动创建

mikey白嫖怪 发表于 2020-5-21 15:17

还可以的啊,不错不错

X-ming 发表于 2020-5-21 21:28

angel8327 发表于 2020-5-21 20:02
这个链表我现在不知道还能不能写出来...

这只是简单的单向顺序链表,如果你C语言学过了,数据结构也上了,应该没问题,即使没上数据结构你应该看我的结构体也能有收获,我建议你尝试把数据结构里面算法都练练,研究研究。数据结构是任何一门语言的基础,通用的,真的值得推荐,我现在也是返回去重学数据结构,有助于编程的规范与高效

smileat2000 发表于 2020-5-21 14:00

Oh my god

丙戌年 发表于 2020-5-21 14:10

前排膜拜一下大佬

conanfan 发表于 2020-5-21 14:21

C语言指针,储存结构学到一团糟。楼主C语言学的不错,加油

天界来的人 发表于 2020-5-21 14:27

前排膜拜

晚空 发表于 2020-5-21 14:46

我大一的期末作业也是学生数据管理,我写的一团糟{:1_925:}

wushaominkk 发表于 2020-5-21 15:22

请整理排版,谢谢!

处女-大龙猫 发表于 2020-5-21 15:34

可以尝试打个包,

theo14 发表于 2020-5-21 16:03

想起了当年学生时代写过类似的作业
页: [1] 2 3
查看完整版本: 用C语言实现简单的学生数据库管理系