c语言文件读写_学生信息管理系统(C语言\单向链表\文件读写)
生活随笔
收集整理的這篇文章主要介紹了
c语言文件读写_学生信息管理系统(C语言\单向链表\文件读写)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
最近在復習數據結構,早上剛復習完鏈表,就想到了學生信息管理系統這個經典的大作業,然后呢,花了一早上加一中午的功夫給重新實現了一遍,里面可能會有寫的不好的地方,但也代表了我實現的一些想法,在這里我將分享出來。
我是在Ubuntu上用vim寫的,當然了這些代碼window下也可以運行。文章最后有完整代碼。
一 實現功能
1、查看學生信息
2、添加學生信息。
3、刪除學生信息
4、修改學生信息
5、保存學生信息到文件
6、刷新學生信息(從文件中恢復學生信息)
0、退出系統
二 表示學生的數據結構
struct三 實現菜單
void meum() {printf("n ***************************** n");printf(" 學生信息管理系統 n");printf(" ***************************** n");printf(" 系統菜單功能 n");printf(" ***************************** n");printf(" 1.查看學生信息 n");printf(" 2.添加學生信息 n");printf(" 3.刪除學生信息 n");printf(" 4.修改學生信息 n");printf(" 5.保存學生信息 n");printf(" 6.刷新學生信息 n");printf(" 0.退出系統 n"); }四 實現增加學生的功能
void creat_node(LinkList *L) {char name;LinkList *node=NULL;LinkList *temp=L->next; //作為鏈表連接的中間點node=(LinkList *)malloc(sizeof(LinkList)); //分配內存if(node==NULL){printf("分配普通節點內存出錯!");exit(1);}memset(node,0,sizeof(LinkList));printf("n請輸入學生序號:");scanf("%d",&node->data.number);printf("n請輸入學生名:");scanf("%s",node->data.name);printf("n請輸入學生成績:");scanf("%d",&node->data.score);printf("n請輸入學生年齡:");scanf("%d",&node->data.age);L->next=node; node->next=temp; }五 顯示學生信息
void show_student(LinkList *L) {LinkList *p=L->next;int i=0;printf("n ************************** n");printf(" 學生信息 n");printf(" ************************** n");printf(" 序號 姓名 成績 年齡 n");while(p){printf(" %d %s %d %d n",p->data.number,p->data.name,p->data.score,p->data.age);i++; p=p->next;} }六 刪除學生
可以選擇
1、按序號刪除。
2、按姓名刪除。
void delete_student(LinkList *L) {int x=0;int number;char name[10];LinkList *temp,*pre;temp=L->next;while(1){printf("n 請選擇:");printf("n 1.按序號刪除!");printf("n 2.按姓名刪除!");printf("n 請輸入選擇:");scanf("%d",&x);if(x==1 || x==2)break;else printf("n 輸入錯誤,請重新輸入!");}if(x==1) //根據輸入的序號找到學生并刪除{printf("n 請輸入要刪除的學生序號:");scanf("%d",&number);while(temp->data.number!=number && temp->next!=NULL){pre=temp;temp=temp->next;}if(temp->data.number==number){pre->next=temp->next;free(temp);}else{printf("n 沒有所要刪除的學生序號!");}}else if(x==2) //根據輸入的姓名找到學生并刪除{printf("n 請輸入要刪除的學生名字:");scanf("%s",name);while(strcmp(temp->data.name,name)!=0 && temp->next!=NULL){pre=temp;temp=temp->next;}if(strcmp(temp->data.name,name)==0){pre->next=temp->next;free(temp);}else{printf("n 沒有要刪除的學生姓名!");}} }七 修改學生信息
首先找到學生,然后對找到的學生信息進行修改。
可以選擇按序號和按姓名來找學生。
找到學生后,可以選擇修改學生的任意一項信息。
void modify_student(LinkList *L) {int x=0;int number;char name[10];LinkList *temp;temp=L->next;while(1){printf("n 請選擇:");printf("n 1.知道要修改學生的序號!");printf("n 2.知道要修改學生的名字!"); printf("n 請輸入選擇:");scanf("%d",&x);if(x==1 || x==2)break;elseprintf("n 輸入錯誤,請重新輸入!");}if(x==1){printf("n 請輸入要修改學生的序號:");scanf("%d",&number);while(temp->data.number!=number && temp->next!=NULL){temp=temp->next;}if(temp->data.number==number){printf("n 已經找到要修改學生的信息!");}else{printf("n 沒有要修改學生的序號!");}}else if(x==2){printf("n 請輸入要修改學生的名字:");scanf("%s",name);while(strcmp(temp->data.name,name)!=0 && temp->next!=NULL){temp=temp->next;}if(strcmp(temp->data.name,name)==0){printf("n 已經找到要修改學生的信息!");}else{printf("n 沒有要修改學生的姓名!");}}printf("n ************************");printf("n 姓名:%s 序號:%d 成績:%d 年齡:%d",temp->data.name,temp->data.number,temp->data.score,temp->data.age);do{printf("n 請選擇:");printf("n 1.修改序號!");printf("n 2.修改名字!");printf("n 3.修改成績!");printf("n 4.修改年齡!");printf("n 請輸入選擇:");scanf("%d",&x);}while(x<1 || x>4);if(x==1){printf("n 請輸入修改后的序號:");scanf("%d",&temp->data.number);}if(x==2){printf("n 請輸入修改后的名字:");scanf("%s",temp->data.name);}if(x==3){printf("n 請輸入修改后的成績:");scanf("%d",&temp->data.score);}if(x==4){printf("n 請輸入修改后的年齡:");scanf("%d",&temp->data.age);}}八 保存到文件
void save(LinkList *L) {FILE *fp;int i=0;LinkList *temp; temp=L->next;if((fp=fopen("student.txt","a"))==NULL){printf("n 無法打開文件!");exit(1);} while(temp!=NULL){i++;fprintf(fp,"%d %s %d %d n",temp->data.number,temp->data.name,temp->data.score,temp->data.age);printf("n 第%d個已經保存!",i);temp=temp->next;}fclose(fp); }九 從文件中恢復
void refresh(LinkList *L) {FILE *fp;LinkList *node=NULL; LinkList *temp=L->next;node=(LinkList *)malloc(sizeof(LinkList));if(node==NULL){printf("分配普通節點內存出錯!");exit(1);}memset(node,0,sizeof(LinkList)); fp=fopen("student.txt","r");if(fp==NULL){printf("n 無法打開文件!");exit(1);}while(!feof(fp)){fscanf(fp,"%d %s %d %d",&node->data.number,node->data.name,&node->data.score,&node->data.age);L->next=node;node->next=temp;temp=node;node=(LinkList *)malloc(sizeof(LinkList));if(node==NULL){printf("分配普通節點內存出錯!");exit(1);}memset(node,0,sizeof(LinkList));} printf("n 已經成功刷新學生信息!"); }十 主函數
主函數中先創建一個頭節點(不保存學生信息,便于操作空鏈表),然后進入主菜單,功能選擇模塊被我獨立成一個函數,代碼在主函數后面。
void main() { int i;LinkList *L=NULL;L=(LinkList *)malloc(sizeof(LinkList));if(L==NULL){ printf("分配頭節點內存出錯!");exit(1);}memset(L,0,sizeof(LinkList));L->next=NULL;int stop=1;while(1){ meum();choice(&stop,L);if(stop==0)break;printf("n 下一步操作:");printf("n 1.返回主界面");printf("n 2.退出系統");printf("n 請輸入操作:");scanf("%d",&i);if(i==2)break;} } void choice(int *stop,LinkList *L) {int num;printf("nn 請輸入菜單選項:");scanf("%d",&num);switch (num){case 0: *stop=0; break;case 1: show_student(L); break;case 2: creat_node(L); break;case 3: delete_student(L); break;case 4: modify_student(L); break;case 5: save(L); break;case 6: refresh(L); break;default: printf(" 請在0-6中間選擇n");} }十一 優化建議
上面有一些寫法可以進行優化的,但是因為這只是一個小項目沒必要分那么多函數(分了引用次數也十分有限),并且這樣更符合我的思路(一功能一模塊),就沒有進行優化??梢詢灮娜缦?#xff1a;
1、將有復用的代碼段獨立寫成函數,減少代碼函數,例如選擇和分配節點空間那里獨立成函數。
2、將部分較長的函數進行功能分割,便于閱讀。
十二 擴展建議
一、增加排序功能。
二、增加代碼修改后寫回文件時的檢驗是否修改的功能。
三、擴展界面。
十四 全部代碼
#include<stdio.h> #include<stdlib.h> #include<string.h>struct student { char name[10];int score;int number;int age; }; struct LNode { struct student data;struct LNode *next; }; typedef struct LNode LinkList;void meum(); void choice(int *stop,LinkList *L); void creat_node(LinkList *L); void show_student(LinkList *L); void delete_student(LinkList *L); void modify_student(LinkList *L); void save(LinkList *L); void refresh(LinkList *L);void main() { int i;LinkList *L=NULL;L=(LinkList *)malloc(sizeof(LinkList));if(L==NULL){ printf("分配頭節點內存出錯!");exit(1);}memset(L,0,sizeof(LinkList));L->next=NULL;int stop=1;while(1){ meum();choice(&stop,L);if(stop==0)break;printf("n 下一步操作:");printf("n 1.返回主界面");printf("n 2.退出系統");printf("n 請輸入操作:");scanf("%d",&i);if(i==2)break;} }void choice(int *stop,LinkList *L) {int num;printf("nn 請輸入菜單選項:");scanf("%d",&num);switch (num){case 0: *stop=0; break;case 1: show_student(L); break;case 2: creat_node(L); break;case 3: delete_student(L); break;case 4: modify_student(L); break;case 5: save(L); break;case 6: refresh(L); break;default: printf(" 請在0-6中間選擇n");} }void meum() {printf("n ***************************** n");printf(" 學生信息管理系統 n");printf(" ***************************** n");printf(" 系統菜單功能 n");printf(" ***************************** n");printf(" 1.查看學生信息 n");printf(" 2.添加學生信息 n");printf(" 3.刪除學生信息 n");printf(" 4.修改學生信息 n");printf(" 5.保存學生信息 n");printf(" 6.刷新學生信息 n");printf(" 0.退出系統 n"); }void creat_node(LinkList *L) {char name;LinkList *node=NULL;LinkList *temp=L->next; //作為鏈表連接的中間點node=(LinkList *)malloc(sizeof(LinkList)); //分配內存if(node==NULL){printf("分配普通節點內存出錯!");exit(1);}memset(node,0,sizeof(LinkList));printf("n請輸入學生序號:");scanf("%d",&node->data.number);printf("n請輸入學生名:");scanf("%s",node->data.name);printf("n請輸入學生成績:");scanf("%d",&node->data.score);printf("n請輸入學生年齡:");scanf("%d",&node->data.age);L->next=node; node->next=temp; }void show_student(LinkList *L) {LinkList *p=L->next;int i=0;printf("n ************************** n");printf(" 學生信息 n");printf(" ************************** n");printf(" 序號 姓名 成績 年齡 n");while(p){printf(" %d %s %d %d n",p->data.number,p->data.name,p->data.score,p->data.age);i++; p=p->next;} }void delete_student(LinkList *L) {int x=0;int number;char name[10];LinkList *temp,*pre;temp=L->next;while(1){printf("n 請選擇:");printf("n 1.按序號刪除!");printf("n 2.按姓名刪除!");printf("n 請輸入選擇:");scanf("%d",&x);if(x==1 || x==2)break;else printf("n 輸入錯誤,請重新輸入!");}if(x==1) //根據輸入的序號找到學生并刪除{printf("n 請輸入要刪除的學生序號:");scanf("%d",&number);while(temp->data.number!=number && temp->next!=NULL){pre=temp;temp=temp->next;}if(temp->data.number==number){pre->next=temp->next;free(temp);}else{printf("n 沒有所要刪除的學生序號!");}}else if(x==2) //根據輸入的姓名找到學生并刪除{printf("n 請輸入要刪除的學生名字:");scanf("%s",name);while(strcmp(temp->data.name,name)!=0 && temp->next!=NULL){pre=temp;temp=temp->next;}if(strcmp(temp->data.name,name)==0){pre->next=temp->next;free(temp);}else{printf("n 沒有要刪除的學生姓名!");}} }void modify_student(LinkList *L) {int x=0;int number;char name[10];LinkList *temp;temp=L->next;while(1){printf("n 請選擇:");printf("n 1.知道要修改學生的序號!");printf("n 2.知道要修改學生的名字!"); printf("n 請輸入選擇:");scanf("%d",&x);if(x==1 || x==2)break;elseprintf("n 輸入錯誤,請重新輸入!");}if(x==1){printf("n 請輸入要修改學生的序號:");scanf("%d",&number);while(temp->data.number!=number && temp->next!=NULL){temp=temp->next;}if(temp->data.number==number){printf("n 已經找到要修改學生的信息!");}else{printf("n 沒有要修改學生的序號!");}}else if(x==2){printf("n 請輸入要修改學生的名字:");scanf("%s",name);while(strcmp(temp->data.name,name)!=0 && temp->next!=NULL){temp=temp->next;}if(strcmp(temp->data.name,name)==0){printf("n 已經找到要修改學生的信息!");}else{printf("n 沒有要修改學生的姓名!");}}printf("n ************************");printf("n 姓名:%s 序號:%d 成績:%d 年齡:%d",temp->data.name,temp->data.number,temp->data.score,temp->data.age);do{printf("n 請選擇:");printf("n 1.修改序號!");printf("n 2.修改名字!");printf("n 3.修改成績!");printf("n 4.修改年齡!");printf("n 請輸入選擇:");scanf("%d",&x);}while(x<1 || x>4);if(x==1){printf("n 請輸入修改后的序號:");scanf("%d",&temp->data.number);}if(x==2){printf("n 請輸入修改后的名字:");scanf("%s",temp->data.name);}if(x==3){printf("n 請輸入修改后的成績:");scanf("%d",&temp->data.score);}if(x==4){printf("n 請輸入修改后的年齡:");scanf("%d",&temp->data.age);}}void save(LinkList *L) {FILE *fp;int i=0;LinkList *temp; temp=L->next;if((fp=fopen("student.txt","a"))==NULL){printf("n 無法打開文件!");exit(1);} while(temp!=NULL){i++;fprintf(fp,"%d %s %d %d n",temp->data.number,temp->data.name,temp->data.score,temp->data.age);printf("n 第%d個已經保存!",i);temp=temp->next;}fclose(fp); }void refresh(LinkList *L) {FILE *fp;LinkList *node=NULL; LinkList *temp=L->next;node=(LinkList *)malloc(sizeof(LinkList));if(node==NULL){printf("分配普通節點內存出錯!");exit(1);}memset(node,0,sizeof(LinkList)); fp=fopen("student.txt","r");if(fp==NULL){printf("n 無法打開文件!");exit(1);}while(!feof(fp)){fscanf(fp,"%d %s %d %d",&node->data.number,node->data.name,&node->data.score,&node->data.age);L->next=node;node->next=temp;temp=node;node=(LinkList *)malloc(sizeof(LinkList));if(node==NULL){printf("分配普通節點內存出錯!");exit(1);}memset(node,0,sizeof(LinkList));} printf("n 已經成功刷新學生信息!"); }總結
以上是生活随笔為你收集整理的c语言文件读写_学生信息管理系统(C语言\单向链表\文件读写)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java实参将数据传递给形参的两种形式
- 下一篇: php 发送短信 sms,php 调用百