基本原理:利用鏈表和文件讀寫實現具有永久存儲數據的系統
文件命名:StudentSystem.cpp
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<windows.h>
//創建結構體
struct students
{
int id;
char name[60];
char address[60];
};
//創建鏈表
struct node
{
struct students data;
struct node *next;
};
struct node *create_students();
void print_students(struct node *h);
void sort_students(struct node *h);
void modify_students(struct node *h);
void delete_students(struct node *h);
void menu();
main(){
struct node *h=NULL;
system("mode con cols=100 lines=30");
int x,i=1;
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_BLUE|FOREGROUND_INTENSITY);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_GREEN|FOREGROUND_RED|FOREGROUND_INTENSITY);
do{
menu();
printf(" 請輸入您的選擇:");
scanf("%d",&x);
switch (x)
{
case 1:h=create_students();break;
case 2:print_students(h);break;
case 3:sort_students(h);break;
case 4:modify_students(h);break;
case 5:delete_students(h);break;
case 6:printf("歡迎下次訪問,再見!!!\n");exit(0);break;
}
}while(x!=5);
return 0;
}
//菜單
void menu(){
printf("\n\n\n **************************************學生學籍信息管理系統************************************** \n\n");
printf(" * * \n\n");
printf(" * * \n\n");
printf(" * 1--- 學生學籍信息錄入 --- * \n\n");
printf(" * 2--- 查看學生信息 --- * \n\n");
printf(" * 3--- 學生學籍排序 --- * \n\n");
printf(" * 4--- 修改學生信息 --- * \n\n");
printf(" * 5--- 刪除學生信息 --- * \n\n");
printf(" * 6--- 退出系統 --- * \n\n\n\n");
printf(" ************************************************************************************************ \n\n\n\n");
}
//一、輸入學生學籍信息
struct node *create_students()
{
FILE *fp;
int x,m=1;
char nam[60],a[60];
struct node *h,*p,*q,*n;
system("cls");
printf("\n\n\n\n\n\n\n\n\n\n\n\n");
printf(" 請輸入第%d位學生id(輸入-1結束):",m);
scanf("%d",&x);
getchar();
if(x!=-1)
{
printf(" 姓名:");
gets(nam);
printf(" 地址:");
gets(a);
}
if(x!=-1)
{
h=(struct node*)malloc(sizeof(struct node));
h->data.id=x;
strcpy(h->data.name,nam);
strcpy(h->data.address,a);
h->next=NULL;
p=h;
n=p;
}
while(x!=-1)
{
m++;
printf(" 請輸入第%d位學生id(輸入-1結束):",m);
scanf("%d",&x);
getchar();
if(x!=-1)
{
printf(" 姓名:");
gets(nam);
printf(" 地址:");
gets(a);
}
if(x!=-1)
{
q=(struct node*)malloc(sizeof(struct node));
q->data.id=x;
strcpy(q->data.name,nam);
strcpy(q->data.address,a);
q->next=NULL;
p->next=q;
p=p->next;
}
}
//printf("========打印r鏈表=========\n");
//printf("測試%d\n",n->data.id);
//while(n!=NULL){
// printf("%d %s %s\n",n->data.id,n->data.name,n->data.address);
// n=n->next;
//}
//printf("========打印r鏈表結束=========\n");
//存檔
//n=n->next;
fp=fopen("book.txt","a");
if(fp==NULL)
{
printf("文件打開失敗\n");
exit(1);
}
//fprintf(fp,"\n");
while(n!=NULL)
{
fprintf(fp,"%-20d %-20s %-20s\n",n->data.id,n->data.name,n->data.address);
n=n->next;
}
fclose(fp);
return h;
}
//二、輸出所有學生信息
void print_students(struct node *h)
{
h=(struct node*)malloc(sizeof(struct node));
FILE *fp;
struct node *p,*q,*r;
system("cls");
p=h;
int id,i=1,j=1,ok;//統計人數 j,k用排序
char name_stu[60],address_stu[60];
fp=fopen("book.txt","r");
if(fp==NULL)
{
printf("文件打開失敗");
}else{
printf("文件打開成功\n");
while(fscanf(fp," %d %s %s",&id,name_stu,address_stu)!=EOF)
{
//printf("\n");
//printf("---第%d次循環\n",i);
//i++;
q=(struct node*)malloc(sizeof(struct node));
//printf("內存申請成功\n");
strcpy(q->data.name,name_stu);
//printf("%s ",q->data.name);
strcpy(q->data.address,address_stu);
//printf("%s ",q->data.address);
q->data.id=id;
//printf("%d\n",q->data.id);
//printf("------------------------\n");
q->next=NULL;
p->next=q;
p=p->next;
//p->next=q;
//p=q;
}
}
//p->next=NULL;
fclose(fp);
r=h;
r=r->next;
printf("序號 學號 姓名 地址\n");
while(r!=NULL){
printf("%d:",j);
j++;
printf(" %d %s %s\n",r->data.id,r->data.name,r->data.address);
r=r->next;
}
printf("輸入1查看結束:");
scanf("%d",&ok);
if(ok==1)
{
system("cls");
menu();
}
}
//三、排序功能 思路:讀取--修改--保存
void sort_students(struct node *h)
{
system("cls");
//1.讀取
h=(struct node*)malloc(sizeof(struct node));
FILE *fp;
struct node *p,*q,*r,*n;
p=h;
//q=h;
int id,i=0,sort,j,k,x;//x用於排序暫時存儲
char name_stu[60],address_stu[60],s_name[60],s_address[60];
fp=fopen("book.txt","r");
if(fp==NULL)
{
printf("文件打開失敗");
}else{
//printf("文件打開成功\n");
while(fscanf(fp," %d %s %s",&id,name_stu,address_stu)!=EOF)
{
//printf("\n");
//printf("---第%d次循環\n",i);
i++;
q=(struct node*)malloc(sizeof(struct node));
//printf("內存申請成功\n");
strcpy(q->data.name,name_stu);
//printf("%s ",q->data.name);
strcpy(q->data.address,address_stu);
//printf("%s ",q->data.address);
q->data.id=id;
//printf("%d\n",q->data.id);
//printf("------------------------\n");
q->next=NULL;
p->next=q;
p=p->next;
}
}
fclose(fp);
//2.修改----->>實現排序
r=h; //r爲主鏈表
r=r->next;
n=r;
q=r->next;
printf("%d",r->data.id);
printf("%d",q->data.id);
//printf("總長度爲:%d\n",i);
while(true)
{
printf("\n\n\n\n\n\n\n\n\n\n\n\n");
printf(" 從小到大排序請按1,從大到小排序請按0:");
scanf("%d",&sort);
if(sort==0 || sort==1){
break;
}else{
printf("您的輸入有誤");
}
}
//printf("判斷成功\n");
//printf("333%d\n",r->data.id);
//printf("333%d\n",q->data.id);
//從小到大排序
if(sort==1){
//printf("-----從小到大排序-----\n");
for(j=0;j<i-1;j++)
//while(r!=NULL)
{
//printf("=========%d==\n",r->data.id);
for(k=j+1;k<i;k++)
//while(q!=NULL)
{
//printf("--%d-\n",q->data.id);
if((r->data.id)>(q->data.id))
{
x=r->data.id;
strcpy(s_name,r->data.name);
strcpy(s_address,r->data.address);
r->data.id=q->data.id;
strcpy(r->data.name,q->data.name);
strcpy(r->data.address,q->data.address);
q->data.id=x;
strcpy(q->data.name,s_name);
strcpy(q->data.address,s_address);
}
q=q->next;
}
r=r->next;
q=r->next;
}
printf("排序成功\n");
}
//從大到小排序
if(sort==0){
printf("-----從大到小排序-----\n");
for(j=0;j<i-1;j++)
//while(r!=NULL)
{
//printf("=========%d==\n",r->data.id);
for(k=j+1;k<i;k++)
//while(q!=NULL)
{
//printf("--%d-\n",q->data.id);
if((r->data.id)<(q->data.id))
{
//x=r->data.id;
//r->data.id=q->data.id;
//q->data.id=x;
x=r->data.id;
strcpy(s_name,r->data.name);
strcpy(s_address,r->data.address);
r->data.id=q->data.id;
strcpy(r->data.name,q->data.name);
strcpy(r->data.address,q->data.address);
q->data.id=x;
strcpy(q->data.name,s_name);
strcpy(q->data.address,s_address);
}
q=q->next;
}
r=r->next;
q=r->next;
}
printf("排序成功\n");
}
//printf("========打印r鏈表=========\n");
//n=r;
//printf("測試%d\n",n->data.id);
//while(n!=NULL){
// printf("%d %s %s\n",n->data.id,n->data.name,n->data.address);
// n=n->next;
//}
//printf("========打印r鏈表結束=========\n");
//排序存檔
//FILE *fp;
fp=fopen("book.txt","w");
if(fp==NULL)
{
printf("文件打開失敗\n");
exit(1);
}
//fprintf(fp,"\n");
while(n!=NULL)
{
fprintf(fp,"%-20d %-20s %-20s\n",n->data.id,n->data.name,n->data.address);
n=n->next;
}
fclose(fp);
}
//四、===========修改學生信息======
void modify_students(struct node *h)
{
system("cls");
//變量
int searchId,x,NewId;// x:選項 searchId:按學號搜 n:新學號
char NewName[60],NewAddress[60];
//1.讀取文件,並將內容重新放到結構體p中
int id;
char name_stu[60],address_stu[60],s_name[60],s_address[60];
h=(struct node*)malloc(sizeof(struct node));
FILE *fp;
struct node *p,*q,*r,*n;
p=h;
r=p;
n=p;
fp=fopen("book.txt","r");
if(fp==NULL)
{
printf("文件打開失敗");
}else{
//printf("文件打開成功\n");
while(fscanf(fp," %d %s %s",&id,name_stu,address_stu)!=EOF)
{
q=(struct node*)malloc(sizeof(struct node));
strcpy(q->data.name,name_stu);
strcpy(q->data.address,address_stu);
q->data.id=id;
q->next=NULL;
p->next=q;
p=p->next;
}
}
fclose(fp);
//printf("結束\n\n");
//2.找到對應學生
printf("\n\n\n\n\n\n\n\n\n\n\n\n");
printf(" 請輸入您所要修改學生的ID:");
scanf("%d",&searchId);
printf("您將選擇ID爲%d的學生!!!\n",searchId);
r=r->next;
while(r!=NULL)
{
if(searchId==r->data.id){
//初始化變量
NewId=r->data.id;
strcpy(NewName,r->data.name);
strcpy(NewAddress,r->data.address);
printf(">>>>>>>>>>>>%s\n",r->data.name);
printf(">>>>>>>>>>>>%s\n",r->data.address);
while(true)
{
printf(" 請輸入您要改的項目(1:學號、2:姓名、3:地址、-1:確認修改):");
scanf("%d",&x);
getchar();
//獲取新學號
if(x==1){
printf(" 請輸入新學號:");
scanf("%d",&NewId);
getchar();
printf("\n+++++++++%d\n",NewId);
}
//獲取新姓名
if(x==2){
printf(" 請輸入新姓名:");
gets(NewName);
printf("\n+++++++++%s\n",NewName);
}
//獲取新地址
if(x==3){
printf("請輸入新地址:");
gets(NewAddress);
printf("\n+++++++++%s\n",NewAddress);
}
//確認修改
if(x==-1){
break;
}
}
//確認修改信息
r->data.id=NewId;
strcpy(r->data.name,NewName);
strcpy(r->data.address,NewAddress);
printf("修改成功!!!\n新學號爲:%d 新姓名爲:%s 新地址爲:%s\n",r->data.id,r->data.name,r->data.address);
break;
}
r=r->next;
}
//存檔
n=n->next;
fp=fopen("book.txt","w");
if(fp==NULL)
{
printf("文件打開失敗\n");
exit(1);
}
//fprintf(fp,"\n");
while(n!=NULL)
{
fprintf(fp,"%-20d %-20s %-20s\n",n->data.id,n->data.name,n->data.address);
n=n->next;
}
fclose(fp);
}
//五、刪除指定學生信息
void delete_students(struct node *h)
{
system("cls");
//變量
int searchId;// x:選項 searchId:按學號搜
//1.讀取文件,並將內容重新放到結構體p中
int id;
char name_stu[60],address_stu[60],s_name[60],s_address[60];
h=(struct node*)malloc(sizeof(struct node));
FILE *fp;
struct node *p,*q,*r,*m,*n,*k;//m:用來切割節點保存前一個節點
p=h;
r=p;//查詢指針
m=p;//
n=r;//存數據指針
fp=fopen("book.txt","r");
if(fp==NULL)
{
printf("文件打開失敗");
}else{
//printf("文件打開成功\n");
while(fscanf(fp," %d %s %s",&id,name_stu,address_stu)!=EOF)
{
q=(struct node*)malloc(sizeof(struct node));
strcpy(q->data.name,name_stu);
strcpy(q->data.address,address_stu);
q->data.id=id;
q->next=NULL;
p->next=q;
p=p->next;
}
}
fclose(fp);
//2.找到對應學生
printf("\n\n\n\n\n\n\n\n\n\n\n\n");
printf(" 請輸入您所要刪除學生的學生號");
scanf("%d",&searchId);
getchar();
//printf("您將選擇ID爲%d的學生!!!\n",searchId);
//r=r->next;
//m=r->next;
while(r->next!=NULL)
{
//printf("%d ",r->data.id);
//printf("%d \n",m->data.id);
k=r;
r=r->next;
if(searchId==r->data.id)
{
//printf("YYYYYYYYYYYYYYYYYYY");
k->next=r->next;
free(r);
r=k->next;
break;
}
}
printf(" 刪除成功\n");
//輸出r鏈表 測試是否修改成功 爲存檔做準備
//n=n->next;
//printf("========打印r鏈表=========\n");
//printf("測試%d\n",n->data.id);
//while(n!=NULL){
// printf("%d %s %s\n",n->data.id,n->data.name,n->data.address);
// n=n->next;
//}
//printf("========打印r鏈表結束=========\n");
//存檔
n=n->next;
fp=fopen("book.txt","w");
if(fp==NULL)
{
printf("文件打開失敗\n");
exit(1);
}
//fprintf(fp,"\n");
while(n!=NULL)
{
fprintf(fp,"%-20d %-20s %-20s\n",n->data.id,n->data.name,n->data.address);
n=n->next;
}
fclose(fp);
main();
//==扣扣羣聊172842597==
}