C語言實(shí)現(xiàn)學(xué)生信息管理系統(tǒng)(文件操作)
本文實(shí)例為大家分享了C語言實(shí)現(xiàn)學(xué)生信息管理系統(tǒng)的具體代碼,供大家參考,具體內(nèi)容如下
前言:與上篇文章相比,增加了文件操作,可將任意時(shí)期的的學(xué)生數(shù)據(jù)存儲(chǔ)再文件中,菜單也隨之改動(dòng),增加了文件操作一欄,是否存儲(chǔ)到相應(yīng)文件中由使用者決定
新增函數(shù)——文件操作;
//學(xué)生數(shù)據(jù)文件儲(chǔ)存? //儲(chǔ)存任意時(shí)期的學(xué)生數(shù)據(jù)? void Store_List(Link head) { ?? ?//文件操作? ?? ?ofstream ofs; ?? ?ofs.open("Std_Information.txt",ios::out); ?? ? ?? ?if(head==NULL) ?? ?{ ?? ??? ?printf("學(xué)生為空\n"); ?? ??? ?return;? ?? ?} ?? ?else ?? ?{ ?? ??? ?Link p=head->next; ?? ??? ?while(p) ?? ??? ?{ ?? ??? ??? ?ofs<< "姓名:"<<p->data.studentName<<" ? ?學(xué)號(hào):"<<p->data.studentNo<<" ?成績:"<<p->data.score<<endl;? ?? ??? ??? ?p=p->next; ?? ??? ?} ?? ??? ? ?? ?} }
1.頭文件和預(yù)處理
#include <stdio.h> #include<string.h> #include<malloc.h> #include<stdlib.h> #include<stdbool.h> #include<iostream> #include<fstream>//文件操作所需頭文件? using namespace std; #define NO_LENGTH ?20 #define NAME_LENGTH 11 /* 定義學(xué)生結(jié)構(gòu)體的數(shù)據(jù)結(jié)構(gòu) */ typedef struct Student{ ?? ?char studentNo[NO_LENGTH]; ?? ?char studentName[NAME_LENGTH]; ?? ?int score; }st; /* 定義每條記錄或節(jié)點(diǎn)的數(shù)據(jù)結(jié)構(gòu) */ typedef struct node { ?? ?struct Student data; //數(shù)據(jù)域 ?? ?struct node *next; //指針域 }Node,*Link; ?//Node為node類型的別名,Link為node類型的指針別名
2.定義學(xué)生結(jié)構(gòu)體的數(shù)據(jù)結(jié)構(gòu)
typedef struct Student{ ?? ?char studentNo[NO_LENGTH]; ?? ?char studentName[NAME_LENGTH]; ?? ?int score; }st;
3.定義每條記錄或節(jié)點(diǎn)的數(shù)據(jù)結(jié)構(gòu)
/* 定義每條記錄或節(jié)點(diǎn)的數(shù)據(jù)結(jié)構(gòu) */ typedef struct node { ?? ?struct Student data; //數(shù)據(jù)域 ?? ?struct node *next; //指針域 }Node,*Link; ?//Node為node類型的別名,Link為node類型的指針別名
4.函數(shù)接口代碼.
1.定義提示菜單
//定義提示菜單 void myMenu(){ ?? ?printf("*****************************菜單*****************************\n");? ?? ?printf("***********************1 增加學(xué)生記錄*************************\n");? ?? ?printf("***********************2 刪除學(xué)生記錄*************************\n");? ?? ?printf("***********************3 查找學(xué)生記錄*************************\n");? ?? ?printf("***********************4 修改學(xué)生記錄*************************\n");? ?? ?printf("***********************5 統(tǒng)計(jì)學(xué)生人數(shù) ************************\n");? ?? ?printf("***********************6 顯示學(xué)生記錄*************************\n");? ?? ?printf("***********************7 信息文件打印*************************\n"); ?? ?printf("***********************8 退出系統(tǒng) ****************************\n");? ?? ? }
2.增加學(xué)生記錄
void inputStudent(Link l){ ?? ? printf("請輸入學(xué)生學(xué)號(hào):"); ?? ? scanf("%s",l->data.studentNo); ?? ? printf("請輸入學(xué)生的姓名:"); ?? ? scanf("%s",l->data.studentName); ?? ?printf("請輸入學(xué)生的成績:"); ?? ? scanf("%s",&(l->data.score)); ?? ? //每個(gè)新創(chuàng)建的節(jié)點(diǎn)的next域都初始化為NULL ?? ? l->next = NULL; ?? ? system("cls"); }
3.輸入學(xué)號(hào)接口·
void inputStudentNo(char s[],char no[]){ ?? ?printf("請輸入要%s的學(xué)生學(xué)號(hào):",s); ?? ?scanf("%s",no); }
4.遍歷表中學(xué)生
//遍歷表中學(xué)生? void displayNode(Link head){ ?? ?if(head==NULL) ?? ?{ ?? ??? ?printf("學(xué)生為空\n"); ?? ??? ?return;? ?? ?} ?? ?else ?? ?{ ?? ??? ?Link p=head->next; ?? ??? ?while(p) ?? ??? ?{ ?? ??? ??? ?cout<<"姓名:"<<p->data.studentName<<" ? ?學(xué)號(hào)"<<p->data.studentNo<<" ?成績:"<<p->data.score<<endl;? ?? ??? ??? ?p=p->next; ?? ??? ?} ?? ??? ? ?? ?} ? ?// 填寫代碼,根據(jù)傳入的鏈表head頭指針,掃描鏈表顯示所有節(jié)點(diǎn)的信息 ? ?system("pause"); ? ?system("cls"); }
5.增加學(xué)生記錄
/* 增加學(xué)生記錄 */ bool addNode(Link head){ ?? ? Link p,q; ? //p,q兩個(gè)節(jié)點(diǎn)一前一后 ?? ? Link node; ?//node指針指向新創(chuàng)建的節(jié)點(diǎn) ?? ? node=(Link)malloc(sizeof(Node)); ?? ? inputStudent(node); ?? ? q = head; ?? ? p = head->next; ?//q指向head后面的第一個(gè)有效節(jié)點(diǎn) ?? ? if(head->next==NULL) ?? ??? ? //鏈表為空時(shí) ?? ??? ?head->next = node; ?? ? else { ?? ??? ? //循環(huán)訪問鏈表中的所有節(jié)點(diǎn) ?? ??? ?while(p != NULL){ ?? ??? ??? ?if (node->data.studentNo < p->data.studentNo){ ?? ??? ??? ??? ?//如果node節(jié)點(diǎn)的學(xué)號(hào)比p節(jié)點(diǎn)的學(xué)號(hào)小,則插在p的前面,完成插入后,提前退出子程序 ?? ??? ??? ??? ?q->next = node; ?? ??? ??? ??? ?node->next = p; ?? ??? ??? ??? ?return true; ?? ??? ??? ?} ?? ??? ??? ?else{ ?? ??? ??? ??? ?//如果node節(jié)點(diǎn)的學(xué)號(hào)比p節(jié)點(diǎn)的學(xué)號(hào)大,繼續(xù)向后移動(dòng)指針(依然保持pq一前一后) ?? ??? ??? ??? ?q = p; ?? ??? ??? ??? ?p = p->next; ?? ??? ??? ?} ?? ??? ?} ?? ??? ?//如果沒能提前退出循環(huán),則說明之前沒有插入,那么當(dāng)前node節(jié)點(diǎn)的學(xué)號(hào)是最大值,此時(shí)插在鏈表的最后面 ?? ??? ?q->next = node; ?? ?} ?? ? return true; ?? ? system("pause"); ? ?system("cls"); }
6.刪除學(xué)生信息
//刪除學(xué)生信息 bool deleteNode(Link head){ ? ? // 按照給定的學(xué)號(hào)刪除學(xué)生記錄,如果刪除成功返回true,如果沒找到學(xué)號(hào)返回false ? ? //輸入要處理的學(xué)號(hào) ? ? ?? ?char no[NO_LENGTH]; ?? ?inputStudentNo("刪除",no); ?? ??? ?Link p=head->next; ?? ?Link q=head; ?? ?while(p) ?? ?{ ?? ??? ?if(strcmp(p->data.studentNo,no)==0) ?? ??? ?{ ?? ??? ??? ?cout<<"成功刪除該學(xué)生"<<endl;? ?? ??? ??? ?q->next=p->next; ?? ??? ??? ?free(p); ?? ??? ??? ?system("pause"); ? ??? ??? ??? ?system("cls"); ?? ??? ??? ?return true; ?? ??? ?} ?? ??? ?else ?? ??? ?{ ?? ??? ??? ?q=p; ?? ??? ??? ?p=p->next; ?? ??? ?} ?? ?} ?? ?cout<<"未找到該學(xué)生"<<endl;? ?? ??? ?system("pause"); ? ??? ??? ?system("cls"); ?? ?return false; }
7.查找學(xué)生信息
//查找學(xué)生信息? bool queryNode(Link head){ ? ? // 按照給定的學(xué)號(hào)查詢學(xué)生記錄,如果查找成功返回true,如果沒找到學(xué)號(hào)返回false ? ? //輸入要處理的學(xué)號(hào) ?? ?char no[NO_LENGTH]; ?? ?inputStudentNo("查找",no); ?? ??? ?Link p=head->next; ?? ?while(p) ?? ?{ ?? ??? ?if(strcmp(p->data.studentNo,no)==0) ?? ??? ?{ ?? ??? ??? ? ? ??? ??? ??? ?system("cls"); ? ??? ??? ??? ?cout<<"姓名:"<<p->data.studentName<<" ? ?學(xué)號(hào):"<<p->data.studentNo<<" ?成績:"<<p->data.score<<endl;? ?? ??? ??? ?return true; ?? ??? ?} ?? ??? ?else ?? ??? ?{ ?? ??? ??? ?p=p->next; ?? ??? ?} ?? ?} ?? ?cout<<"未找到該學(xué)生"<<endl;? ? ?system("cls"); ?? ?return false; }
8.修改學(xué)生信息
//修改學(xué)生信息? bool modifyNode(Link head){ ? ? // 按照給定的學(xué)號(hào)找到學(xué)生記錄節(jié)點(diǎn),如果修改成功返回true,如果沒找到學(xué)號(hào)返回false ?? ? ? ? //輸入要處理的學(xué)號(hào) ?? ?char no[NO_LENGTH]; ?? ?inputStudentNo("修改",no); ?? ?Link p=head->next; ?? ?while(p) ?? ?{ ?? ??? ?if(strcmp(p->data.studentNo,no)==0) ?? ??? ?{ ?? ??? ??? ?cout<<"請輸入修改后的姓名"<<endl;? ?? ??? ??? ?cin>>p->data.studentName; ?? ??? ??? ?cout<<"請輸入修改后的學(xué)號(hào)"<<endl;? ?? ??? ??? ?cin>>p->data.studentNo; ?? ??? ??? ?cout<<"請輸入修改后的成績"<<endl;? ?? ??? ??? ?cin>>p->data.score; ?? ??? ??? ?system("cls"); ?? ??? ??? ?return true; ?? ??? ?} ?? ??? ?else ?? ??? ?{ ?? ??? ??? ?p=p->next; ?? ??? ?} ?? ?} ?? ?cout<<"未找到該學(xué)生,請重新輸入學(xué)號(hào)"<<endl;? ?? ?system("cls"); ?? ?return false; }
9.統(tǒng)計(jì)學(xué)生人數(shù)
//統(tǒng)計(jì)學(xué)生人數(shù) int countNode(Link head){ ?? ?//統(tǒng)計(jì)學(xué)生人數(shù),掃描鏈表統(tǒng)計(jì)節(jié)點(diǎn)個(gè)數(shù),返回節(jié)點(diǎn)數(shù) ?? ?Link p; ?? ?int count = 0; ?? ?p = head->next; ?? ?while(p) ?? ?{ ?? ??? ?p=p->next; ?? ??? ?count++; ?? ?} ?? ?//填充代碼 ?? ?system("cls"); ?? ?return count; }
10.清空鏈表
//清空鏈表? void clearLink(Link head){ ?? ?Link q,p; ?? ?p=head->next; ?? ?q=head; ?? ?while(p) ?? ?{ ?? ??? ?q->next=p->next; ?? ??? ?free(p); ?? ??? ?p=q->next; ?? ?} ? ? ? ? //遍歷鏈表,用free語句刪除鏈表中用malloc建立起的所有的節(jié)點(diǎn) }
11.文件操作
//學(xué)生數(shù)據(jù)文件儲(chǔ)存? //儲(chǔ)存任意時(shí)期的學(xué)生數(shù)據(jù)? void Store_List(Link head) { ?? ?//文件操作? ?? ?ofstream ofs; ?? ?ofs.open("Std_Information.txt",ios::out); ?? ? ?? ?if(head==NULL) ?? ?{ ?? ??? ?printf("學(xué)生為空\n"); ?? ??? ?return;? ?? ?} ?? ?else ?? ?{ ?? ??? ?Link p=head->next; ?? ??? ?while(p) ?? ??? ?{ ?? ??? ??? ?ofs<< "姓名:"<<p->data.studentName<<" ? ?學(xué)號(hào):"<<p->data.studentNo<<" ?成績:"<<p->data.score<<endl;? ?? ??? ??? ?p=p->next; ?? ??? ?} ?? ??? ? ?? ?} }
5.main函數(shù)
int main() { ?? ?int select; ? ? ?? ?int count; ?? ?Link head; ?// 定義鏈表 ?? ?//建立head頭結(jié)點(diǎn),在這個(gè)程序中head指向頭結(jié)點(diǎn),頭結(jié)點(diǎn)data部分沒有內(nèi)容,其后續(xù)節(jié)點(diǎn)才有真正的數(shù)據(jù) ?? ?head = (Link)malloc(sizeof(Node)); ?? ?head->next = NULL; ?? ?while(1) ?? ?{ ?? ??? ?myMenu(); ?? ??? ?printf("\n請輸入你的選擇(0-7):"); ?//顯示提示信息 ?? ??? ?scanf("%d",&select); ?? ??? ?switch(select) ?? ??? ?{ ?? ??? ?case 1: ?? ??? ??? ?//增加學(xué)生記錄 ?? ??? ??? ?if(addNode(head)) ?? ??? ??? ??? ?printf("成功插入一個(gè)學(xué)生記錄。\n\n"); ?? ??? ??? ?break; ?? ??? ?case 2: ?? ??? ??? ?//刪除學(xué)生記錄 ?? ??? ??? ?if(deleteNode(head)) ?? ??? ??? ??? ?printf("成功刪除一個(gè)學(xué)生記錄。\n\n"); ?? ??? ??? ?else ?? ??? ??? ??? ?printf("沒有找到要?jiǎng)h除的學(xué)生節(jié)點(diǎn)。\n\n"); ?? ??? ??? ?break; ?? ??? ?case 3: ?? ??? ??? ?//查詢學(xué)生記錄 ?? ??? ??? ?if(queryNode(head)) ?? ??? ??? ??? ?printf("成功找到學(xué)生記錄。\n\n"); ?? ??? ??? ?else ?? ??? ??? ??? ?printf("沒有找到要查詢的學(xué)生節(jié)點(diǎn)。\n\n"); ?? ??? ??? ?break; ?? ??? ?case 4: ?? ??? ??? ?//修改學(xué)生記錄 ?? ??? ??? ?if(modifyNode(head)) ?? ??? ??? ??? ?printf("成功修改一個(gè)學(xué)生記錄。\n\n"); ?? ??? ??? ?else ?? ??? ??? ??? ?printf("沒有找到要修改的學(xué)生節(jié)點(diǎn)。\n\n"); ?? ??? ??? ?break; ?? ??? ?case 5: ?? ??? ??? ?//統(tǒng)計(jì)學(xué)生人數(shù) ?? ??? ??? ?count = countNode(head); ?? ??? ??? ?printf("學(xué)生人數(shù)為:%d\n\n",count); ?? ??? ??? ?break; ?? ??? ?case 6: ?? ??? ??? ?//顯示學(xué)生記錄 ?? ??? ??? ?displayNode(head); ?? ??? ??? ?break; ?? ??? ?case 7: ?? ??? ??? ?//退出前清除鏈表中的所有結(jié)點(diǎn) ? ? ? ? ? ? clearLink(head); ?? ??? ??? ?return 0; ?? ??? ?default: ?? ??? ??? ?printf("輸入不正確,應(yīng)該輸入0-7之間的數(shù)。\n\n"); ?? ??? ??? ?system("cls");? ?? ??? ??? ?break; ?? ??? ?} ?? ?} ?? ?return 0; }
6.學(xué)生信息管理系統(tǒng)總源碼(可直接復(fù)制運(yùn)行)
#include <stdio.h> #include<string.h> #include<malloc.h> #include<stdlib.h> #include<stdbool.h> #include<iostream> #include<fstream>//文件操作所需頭文件? using namespace std; #define NO_LENGTH ?20 #define NAME_LENGTH 11 /* 定義學(xué)生結(jié)構(gòu)體的數(shù)據(jù)結(jié)構(gòu) */ typedef struct Student{ ?? ?char studentNo[NO_LENGTH]; ?? ?char studentName[NAME_LENGTH]; ?? ?int score; }st; /* 定義每條記錄或節(jié)點(diǎn)的數(shù)據(jù)結(jié)構(gòu) */ typedef struct node { ?? ?struct Student data; //數(shù)據(jù)域 ?? ?struct node *next; //指針域 }Node,*Link; ?//Node為node類型的別名,Link為node類型的指針別名 //定義提示菜單 void myMenu(){ ?? ?printf("*****************************菜單*****************************\n");? ?? ?printf("***********************1 增加學(xué)生記錄*************************\n");? ?? ?printf("***********************2 刪除學(xué)生記錄*************************\n");? ?? ?printf("***********************3 查找學(xué)生記錄*************************\n");? ?? ?printf("***********************4 修改學(xué)生記錄*************************\n");? ?? ?printf("***********************5 統(tǒng)計(jì)學(xué)生人數(shù) ************************\n");? ?? ?printf("***********************6 顯示學(xué)生記錄*************************\n");? ?? ?printf("***********************7 信息文件打印*************************\n"); ?? ?printf("***********************8 退出系統(tǒng) ****************************\n");? ?? ? } void inputStudent(Link l){ ?? ? printf("請輸入學(xué)生學(xué)號(hào):"); ?? ? scanf("%s",l->data.studentNo); ?? ? printf("請輸入學(xué)生的姓名:"); ?? ? scanf("%s",l->data.studentName); ?? ?printf("請輸入學(xué)生的成績:"); ?? ? scanf("%d",&(l->data.score)); ?? ? //每個(gè)新創(chuàng)建的節(jié)點(diǎn)的next域都初始化為NULL ?? ? l->next = NULL; ?? ? system("cls"); } void inputStudentNo(char s[],char no[]){ ?? ?printf("請輸入要%s的學(xué)生學(xué)號(hào):",s); ?? ?scanf("%s",no); } //遍歷表中學(xué)生? void displayNode(Link head){ ?? ?if(head==NULL) ?? ?{ ?? ??? ?printf("學(xué)生為空\n"); ?? ??? ?return;? ?? ?} ?? ?else ?? ?{ ?? ??? ?Link p=head->next; ?? ??? ?while(p) ?? ??? ?{ ?? ??? ??? ?cout<<"姓名:"<<p->data.studentName<<" ? ?學(xué)號(hào)"<<p->data.studentNo<<" ?成績:"<<p->data.score<<endl;? ?? ??? ??? ?//ofs<< "姓名:"<<p->data.studentName<<" ? ?學(xué)號(hào)"<<p->data.studentNo<<" ?成績:"<<p->data.score<<endl;? ?? ??? ??? ?p=p->next; ?? ??? ?} ?? ??? ? ?? ?} ? ?// 填寫代碼,根據(jù)傳入的鏈表head頭指針,掃描鏈表顯示所有節(jié)點(diǎn)的信息 ? ?system("pause"); ? ?system("cls"); } /* 增加學(xué)生記錄 */ bool addNode(Link head){ ?? ? Link p,q; ? //p,q兩個(gè)節(jié)點(diǎn)一前一后 ?? ? Link node; ?//node指針指向新創(chuàng)建的節(jié)點(diǎn) ?? ? node=(Link)malloc(sizeof(Node)); ?? ? inputStudent(node); ?? ? q = head; ?? ? p = head->next; ?//q指向head后面的第一個(gè)有效節(jié)點(diǎn) ?? ? if(head->next==NULL) ?? ??? ? //鏈表為空時(shí) ?? ??? ?head->next = node; ?? ? else { ?? ??? ? //循環(huán)訪問鏈表中的所有節(jié)點(diǎn) ?? ??? ?while(p != NULL){ ?? ??? ??? ?if (node->data.studentNo < p->data.studentNo){ ?? ??? ??? ??? ?//如果node節(jié)點(diǎn)的學(xué)號(hào)比p節(jié)點(diǎn)的學(xué)號(hào)小,則插在p的前面,完成插入后,提前退出子程序 ?? ??? ??? ??? ?q->next = node; ?? ??? ??? ??? ?node->next = p; ?? ??? ??? ??? ?return true; ?? ??? ??? ?} ?? ??? ??? ?else{ ?? ??? ??? ??? ?//如果node節(jié)點(diǎn)的學(xué)號(hào)比p節(jié)點(diǎn)的學(xué)號(hào)大,繼續(xù)向后移動(dòng)指針(依然保持pq一前一后) ?? ??? ??? ??? ?q = p; ?? ??? ??? ??? ?p = p->next; ?? ??? ??? ?} ?? ??? ?} ?? ??? ?//如果沒能提前退出循環(huán),則說明之前沒有插入,那么當(dāng)前node節(jié)點(diǎn)的學(xué)號(hào)是最大值,此時(shí)插在鏈表的最后面 ?? ??? ?q->next = node; ?? ?} ?? ? return true; ?? ? system("pause"); ? ?system("cls"); } bool deleteNode(Link head){ ? ? // 按照給定的學(xué)號(hào)刪除學(xué)生記錄,如果刪除成功返回true,如果沒找到學(xué)號(hào)返回false ? ? //輸入要處理的學(xué)號(hào) ? ? ?? ?char no[NO_LENGTH]; ?? ?inputStudentNo("刪除",no); ?? ??? ?Link p=head->next; ?? ?Link q=head; ?? ?while(p) ?? ?{ ?? ??? ?if(strcmp(p->data.studentNo,no)==0) ?? ??? ?{ ?? ??? ??? ?cout<<"成功刪除該學(xué)生"<<endl;? ?? ??? ??? ?q->next=p->next; ?? ??? ??? ?free(p); ?? ??? ??? ?system("pause"); ? ??? ??? ??? ?system("cls"); ?? ??? ??? ?return true; ?? ??? ?} ?? ??? ?else ?? ??? ?{ ?? ??? ??? ?q=p; ?? ??? ??? ?p=p->next; ?? ??? ?} ?? ?} ?? ?cout<<"未找到該學(xué)生"<<endl;? system("pause"); ? ?system("cls"); ?? ?return false; } //查找學(xué)生信息? bool queryNode(Link head){ ? ? // 按照給定的學(xué)號(hào)查詢學(xué)生記錄,如果查找成功返回true,如果沒找到學(xué)號(hào)返回false ? ? //輸入要處理的學(xué)號(hào) ?? ?char no[NO_LENGTH]; ?? ?inputStudentNo("查找",no); ?? ??? ?Link p=head->next; ?? ?while(p) ?? ?{ ?? ??? ?if(strcmp(p->data.studentNo,no)==0) ?? ??? ?{ ?? ??? ??? ? ? ??? ??? ??? ?system("cls"); ? ??? ??? ??? ?cout<<"姓名:"<<p->data.studentName<<" ? ?學(xué)號(hào):"<<p->data.studentNo<<" ?成績:"<<p->data.score<<endl;? ?? ??? ??? ?return true; ?? ??? ?} ?? ??? ?else ?? ??? ?{ ?? ??? ??? ?p=p->next; ?? ??? ?} ?? ?} ?? ?cout<<"未找到該學(xué)生"<<endl;? ? ?system("cls"); ?? ?return false; } //修改學(xué)生信息? bool modifyNode(Link head){ ? ? // 按照給定的學(xué)號(hào)找到學(xué)生記錄節(jié)點(diǎn),如果修改成功返回true,如果沒找到學(xué)號(hào)返回false ?? ? ? ? //輸入要處理的學(xué)號(hào) ?? ?char no[NO_LENGTH]; ?? ?inputStudentNo("修改",no); ?? ?Link p=head->next; ?? ?while(p) ?? ?{ ?? ??? ?if(strcmp(p->data.studentNo,no)==0) ?? ??? ?{ ?? ??? ??? ?cout<<"請輸入修改后的姓名"<<endl;? ?? ??? ??? ?cin>>p->data.studentName; ?? ??? ??? ?cout<<"請輸入修改后的學(xué)號(hào)"<<endl;? ?? ??? ??? ?cin>>p->data.studentNo; ?? ??? ??? ?cout<<"請輸入修改后的成績"<<endl;? ?? ??? ??? ?cin>>p->data.score; ?? ??? ??? ?system("cls"); ?? ??? ??? ?return true; ?? ??? ?} ?? ??? ?else ?? ??? ?{ ?? ??? ??? ?p=p->next; ?? ??? ?} ?? ?} ?? ?cout<<"未找到該學(xué)生,請重新輸入學(xué)號(hào)"<<endl;? ?? ?system("cls"); ?? ?return false; } //統(tǒng)計(jì)學(xué)生人數(shù) int countNode(Link head){ ?? ?//統(tǒng)計(jì)學(xué)生人數(shù),掃描鏈表統(tǒng)計(jì)節(jié)點(diǎn)個(gè)數(shù),返回節(jié)點(diǎn)數(shù) ?? ?Link p; ?? ?int count = 0; ?? ?p = head->next; ?? ?while(p) ?? ?{ ?? ??? ?p=p->next; ?? ??? ?count++; ?? ?} ?? ?//填充代碼 ?? ?system("cls"); ?? ?return count; } //清空鏈表? void clearLink(Link head){ ?? ?Link q,p; ?? ?p=head->next; ?? ?q=head; ?? ?while(p) ?? ?{ ?? ??? ?q->next=p->next; ?? ??? ?free(p); ?? ??? ?p=q->next; ?? ?} ? ? ? ? //遍歷鏈表,用free語句刪除鏈表中用malloc建立起的所有的節(jié)點(diǎn) } //學(xué)生數(shù)據(jù)文件儲(chǔ)存? //儲(chǔ)存任意時(shí)期的學(xué)生數(shù)據(jù)? void Store_List(Link head) { ?? ?//文件操作? ?? ?ofstream ofs; ?? ?ofs.open("Std_Information.txt",ios::out); ?? ? ?? ?if(head==NULL) ?? ?{ ?? ??? ?printf("學(xué)生為空\n"); ?? ??? ?return;? ?? ?} ?? ?else ?? ?{ ?? ??? ?Link p=head->next; ?? ??? ?while(p) ?? ??? ?{ ?? ??? ??? ?ofs<< "姓名:"<<p->data.studentName<<" ? ?學(xué)號(hào):"<<p->data.studentNo<<" ?成績:"<<p->data.score<<endl;? ?? ??? ??? ?p=p->next; ?? ??? ?} ?? ??? ? ?? ?} } int main() { ?? ?int select; ? ? ?? ?int count; ?? ?Link head; ?// 定義鏈表 ?? ? ?? ? ?? ?//建立head頭結(jié)點(diǎn),在這個(gè)程序中head指向頭結(jié)點(diǎn),頭結(jié)點(diǎn)data部分沒有內(nèi)容,其后續(xù)節(jié)點(diǎn)才有真正的數(shù)據(jù) ?? ?head = (Link)malloc(sizeof(Node)); ?? ?head->next = NULL; ?? ?while(1) ?? ?{ ?? ??? ?myMenu(); ?? ??? ?printf("\n請輸入你的選擇(0-8):"); ?//顯示提示信息 ?? ??? ?scanf("%d",&select); ?? ??? ?switch(select) ?? ??? ?{ ?? ??? ?case 1: ?? ??? ??? ?//增加學(xué)生記錄 ?? ??? ??? ?if(addNode(head)) ?? ??? ??? ??? ?printf("成功插入一個(gè)學(xué)生記錄。\n\n"); ?? ??? ??? ?break; ?? ??? ?case 2: ?? ??? ??? ?//刪除學(xué)生記錄 ?? ??? ??? ?if(deleteNode(head)) ?? ??? ??? ??? ?printf("成功刪除一個(gè)學(xué)生記錄。\n\n"); ?? ??? ??? ?else ?? ??? ??? ??? ?printf("沒有找到要?jiǎng)h除的學(xué)生節(jié)點(diǎn)。\n\n"); ?? ??? ??? ?break; ?? ??? ?case 3: ?? ??? ??? ?//查詢學(xué)生記錄 ?? ??? ??? ?if(queryNode(head)) ?? ??? ??? ??? ?printf("成功找到學(xué)生記錄。\n\n"); ?? ??? ??? ?else ?? ??? ??? ??? ?printf("沒有找到要查詢的學(xué)生節(jié)點(diǎn)。\n\n"); ?? ??? ??? ?break; ?? ??? ?case 4: ?? ??? ??? ?//修改學(xué)生記錄 ?? ??? ??? ?if(modifyNode(head)) ?? ??? ??? ??? ?printf("成功修改一個(gè)學(xué)生記錄。\n\n"); ?? ??? ??? ?else ?? ??? ??? ??? ?printf("沒有找到要修改的學(xué)生節(jié)點(diǎn)。\n\n"); ?? ??? ??? ?break; ?? ??? ?case 5: ?? ??? ??? ?//統(tǒng)計(jì)學(xué)生人數(shù) ?? ??? ??? ?count = countNode(head); ?? ??? ??? ?printf("學(xué)生人數(shù)為:%d\n\n",count); ?? ??? ??? ?break; ?? ??? ?case 6: ?? ??? ??? ?//顯示學(xué)生記錄 ?? ??? ??? ?displayNode(head); ?? ??? ??? ?break; ?? ??? ?case 7:Store_List(head); ?? ??? ??? ??? ?cout<<"打印成功"<<endl;? ?? ??? ??? ??? ?system("pause"); ? ??? ??? ??? ??? ?system("cls"); ?? ??? ??? ?break; ?? ??? ?case 8: ?? ??? ??? ?//退出前清除鏈表中的所有結(jié)點(diǎn) ? ? ? ? ? ? clearLink(head); ?? ??? ??? ?return 0; ?? ??? ?default: ?? ??? ??? ?printf("輸入不正確,應(yīng)該輸入0-8之間的數(shù)。\n\n"); ?? ??? ??? ?system("pause"); ?? ??? ??? ?system("cls");? ?? ??? ??? ?break; ?? ??? ?} ?? ?} ?? ?return 0; }
7.測試結(jié)果
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
深入了解C語言結(jié)構(gòu)化的程序設(shè)計(jì)
這篇文章主要介紹了C語言編程中程序的一些基本的編寫優(yōu)化技巧,文中涉及到了基礎(chǔ)的C程序內(nèi)存方面的知識(shí),非常推薦!需要的朋友可以參考下2021-07-07QT使用SQLite數(shù)據(jù)庫超詳細(xì)教程(增刪改查、對(duì)大量數(shù)據(jù)快速存儲(chǔ)和更新)
這篇文章主要給大家介紹了關(guān)于QT使用SQLite數(shù)據(jù)庫的相關(guān)資料,其中包括增刪改查以及對(duì)大量數(shù)據(jù)快速存儲(chǔ)和更新,SQLite是一種嵌入式關(guān)系型數(shù)據(jù)庫管理系統(tǒng),它是一個(gè)軟件庫,提供了一個(gè)自包含、無服務(wù)器、零配置的、事務(wù)性的SQL數(shù)據(jù)庫引擎,需要的朋友可以參考下2024-01-01