/*頭文件*/
# include & ltstdio.h & gt
# include & ltdos.h & gt
# include & ltstdlib.h & gt/*其他註釋*/
# include & ltstring.h & gt/*字符串函數*/
# include & ltmem.h & gt/*存儲器操作功能*/
# include & ltctype.h & gt/*字符操作功能*/
# include & ltalloc.h & gt/*動態地址分配功能*/
#定義LEN sizeof(學生)
Typedef struct stu /*定義用於緩存數據的結構數組*/
{ char num[6];
字符名稱[5];
int score[3];
int sum
浮動平均值;
int順序;
struct stu * next
}學生;
/*函數原型*/
學生* init();/*初始化函數*/
int menu _ select();/*菜單功能*/
學生* create();/*創建壹個鏈表*/
作廢打印(學生*頭像);/*顯示所有記錄*/
void搜索(學生*人頭);/*查找記錄*/
學生*刪除(學生*頭);/*刪除記錄*/
學生*排序(學生*頭);/*排序*/
學生*插入(學生*頭,學生*新);/*插入記錄*/
作廢保存(學生*人頭);/*保存文件*/
學生* load();/*讀取文件*/
/*主功能界面*/
主()
{學生*頭,新;
head = init();/*鏈表被初始化,使得head的值為NULL*/
for(;;)/*無限次循環*/
{開關(menu_select())
{
case 1:head = create();打破;
案例二:打印(頭);打破;
案例三:搜索(頭);打破;
情況4:head=delete(頭);打破;
案例五:head=sort(頭);打破;
案例6:head = insert(head & amp;新);打破;/* & amp;新的意思是回郵地址*/
案例7:救(頭);打破;
情況8:head = load();打破;
案例9:出口(0);/*如果菜單返回值為9,程序結束*/
}
}
}
/*初始化函數*/
學生*init()
{
返回NULL/*返回空指針*/
}
/*菜單選擇功能*/
menu_select()
{ int n;
結構日期d;/*定義時間結構*/
getdate(& amp;d);/*讀取系統日期並將其放入結構D */
printf("按任意鍵進入菜單……");/*按任意鍵進入主菜單*/
getch();/*從鍵盤讀取字符,但不要在屏幕上顯示*/
clr SCR();/*清空屏幕*/
printf(" * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * \ n ");
printf("\t\t歡迎使用\ n ");
printf("\n\t\t學生成績管理系統";
printf(" * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *菜單* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * \ n ");
printf("\t\t\t1。輸入記錄\ n ");/*輸入學生記錄*/
printf("\t\t\t2。打印記錄\ n ");/*顯示*/
printf("\t\t\t3。按姓名搜索記錄\ n ");/*查找*/
printf("\t\t\t4。刪除壹條記錄\ n ");/*刪除*/
printf("\t\t\t5。排序以創建新文件\ n ");/*排序*/
printf("\t\t\t6。將記錄插入列表\ n ");/*插入*/
printf("\t\t\t7。保存文件\ n ");/*保存*/
printf("\t\t\t8。加載文件\ n”);/*閱讀*/
printf("\t\t\t9。退出\ n ");/*退出*/
printf("\n\t\t由胡海紅制作。\ n ");
printf(" * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * \ n ");
printf("\t\t\t\t%d\\%d\\%d\n ",d.da_year,d.da_mon,d . da _ day);/*顯示當前系統日期*/
做{
printf(" \ n \ t \ t \ t輸入您的選擇(1 ~ 9):");
scanf("%d ",& ampn);
} while(n & lt;1 | | n >;9);/*如果所選項目不在1~9之間,請再次輸入*/
返回(n);/*返回選中的項,主函數根據數字調用相應的函數*/
}
/*輸入函數*/
學生*創建()
{int i,s;
學生*head=NULL,* p;/*定義函數。這個函數返回壹個指向鏈表頭的指針*/
clr SCR();
for(;;)
{ p =(STUDENT *)malloc(LEN);/*創建新模塊*/
如果(!P) /*如果指針p為空*/
{ printf(" \ n內存不足。);/*輸出內存溢出*/
返回(頭);/*返回頭指針,下同*/
}
printf("輸入編號(0:列表結尾):");
scanf("%s ",p-& gt;num);
如果(p->;num[0]= = ' 0 ')break;/*如果學號的第壹個字符為0,則輸入結束*/
printf("輸入姓名:");
scanf("%s ",p-& gt;姓名);
printf("請輸入%d分\n ",3);/*提示開始輸入分數*/
s = 0;/*計算每個學生的總分,初始值為0*/
for(I = 0;我& lt3;I++) /*3門課程循環3次*/
{
做{
printf("分數%d:",I+1);
scanf("%d ",& ampp->;score[I]);
如果(p->;score[I]& lt;0 | | p->;score[I]& gt;100) /*確保分數在0到100之間*/
printf("數據錯誤,請重新輸入。\ n ");
} while(p-& gt;score[I]& lt;0 | | p->;score[I]& gt;100);
s = s+p-& gt;得分[I];/*累加所有科目的分數*/
}
p->;sum = s;/*保存總分*/
p->;平均值=(float)s/3;/*通過強制類型轉換將S轉換為float類型,然後得到平均值*/
p->;順序= 0;/*排序前該值為0 */
p->;下壹個=頭;/*將首節點作為新輸入節點的後繼節點*/
head = p;/*新的輸入節點是新的頭節點*/
}
返回(頭);
}
/*顯示所有記錄的功能*/
作廢打印(學生*頭像)
{ int I = 0;/*統計記錄的數量*/
學生* p;/*移動指針*/
clr SCR();
p =頭部;/*初始值是頭指針*/
printf(" \ n * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *學生* * * * * * * * * * * * * * * * * * * * * * * * * * * * \ n ");
printf("-\ n ");
printf(" | Rec | Num | Name | sc 1 | Sc2 | Sc3 | Sum | Ave | Order | \ n ");
printf("-\ n ");
而(p!=空)
{
i++;
printf(" | % 3d | % 4s | %-4s | % 3d | % 3d | % 3d | % 3d | % 4.2f | %-5d | \ n ",
我,p-& gt;num,p->姓名,p-& gt;得分[0],p-& gt;分數[1],p-& gt;分數[2],p-& gt;sum,p->平均值,p-& gt;訂單);
p = p-& gt;接下來;
}
printf("-\ n ");
printf(" * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * END * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * \ n ");
}
/*查找記錄功能*/
無效搜索(學生*負責人)
{學生* p;/*移動指針*/
char s[5];/*用於存儲名稱的字符數組*/
clr SCR();
printf("請輸入搜索名稱。\ n ");
scanf("%s ",s);
p =頭部;/*將頭指針賦給p*/
while(strcmp(p-& gt;姓名和地址。& ampp!= NULL) /*當記錄的名稱不是您要查找的名稱,或者指針不為空時*/
p = p-& gt;接下來;/*將指針移動到下壹個節點*/
如果(p!=NULL) /*如果指針不為空*/
{ printf(" \ n * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *);
printf("-\ n ");
printf(" | Num | Name | sc 1 | sc2 | sc3 | Sum | Ave | Order | \ n ");
printf("-\ n ");
printf(" | % 4s | % 4s | % 3d | % 3d | % 3d | % 3d | % 4.2f | %-5d | \ n ",
p->;num,p->姓名,p-& gt;得分[0],p-& gt;分數[1],p-& gt;分數[2],p-& gt;sum,p->平均值,p-& gt;訂單);
printf("-\ n ");
printf(" * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * END * * * * * * * * * * * * * * * * * * * * * * * * * * * * \ n ");
}
其他
printf(" \ n列表中沒有編號為%s的學生。\n”,s);/*顯示沒有學生*/
}
/*刪除記錄功能*/
學生*刪除(學生*頭)
{ int n;
學生*p1,* p2/*p1是指向要刪除的節點的指針,p2是其前任指針*/
char c,s[6];/*s[6]用於存儲學號,C用於輸入字母*/
clr SCR();
printf("請輸入刪除的編號:");
scanf("%s ",s);
p 1 = p2 =頭;/*將初始值頭指針分配給p1和p2 */
while(strcmp(p 1->;數字,s)和amp& ampp1!= NULL) /*當記錄的學號不是妳要找的,或者指針不為空*/
{ p2 = p 1;/*將p1的指針值賦給p2,作為p1的前任指針*/
p 1 = p 1->;接下來;/*將p1指針指向下壹條記錄*/
}
if(strcmp(p 1->;Num,s)==0) /*找到的學生編號*/
{ printf(" * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *找到了* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * \ n ");
printf("-\ n ");
printf(" | Num | Name | sc 1 | sc2 | sc3 | Sum | Ave | Order | \ n ");
printf("-\ n ");
printf(" | % 4s | % 4s | % 3d | % 3d | % 3d | % 3d | % 4.2f | %-5d | \ n ",
p 1->;num,p 1->;名稱,p 1->;分數[0],p 1-& gt;分數[1],p 1->;score[2],p 1-& gt;sum,p1->平均值,p 1->;訂單);
printf("-\ n ");
printf(" * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * END * * * * * * * * * * * * * * * * * * * * * * * * * * * * \ n ");
printf("確定要刪除學生Y/N嗎?");/*提示是否刪除,輸入y刪除,輸入n退出*/
for(;;)
{scanf("%c ",& ampc);
if(c = = ' N ' | | c = = ' N ')break;/*如果不刪除,就會跳出這個循環*/
if(c=='y'||c=='Y ')
{
If(p 1 = = head)/* If p 1 = = head,被刪除的節點是第壹個節點*/
head = p 1->;接下來;/*給head第二個節點地址*/
其他
p2->;next = p 1->;接下來;/*否則,將下壹個節點地址分配給前壹個節點地址*/
n = n-1;
printf(" \ n共有%s名學生被刪除。\n”,s);
printf("別忘了保存。\ n ");打破;/*刪除然後跳出循環*/
}
}
}
其他
printf(" \ n列表中沒有編號為%s的學生。\n”,s);/*找不到節點*/
返回(頭);
}
/*排序功能*/
學生*排序(學生*頭)
{ int I = 0;/*保存排名*/
學生*p1,*p2,*t,* temp/*定義臨時指針*/
temp = head-& gt;接下來;/*將原表頭指針指向的下壹個節點作為頭指針*/
head->;next = NULL/*第壹個節點是新表的頭節點*/
while(temp!=NULL) /*當原始表不為空時排序*/
{
t =溫度;/*取原表的頭節點*/
temp = temp-& gt;接下來;/*原始頭節點的指針向後移動*/
p 1 =頭;/*設置移動指針p1,從頭指針開始*/
p2 =頭部;/*設置移動指針p2為p1的前身,初始值為頭指針*/
while(t->;平均& ltp 1->;平均& amp& ampp1!=NULL) /*比較平均分數*/
{
p2 = p 1;/*當排序點值較小時,新的表格指針將向後移動*/
p 1 = p 1->;接下來;
}
If(p1==p2) /*p1==p2,表示要排序的點的值大,應該排在第壹*/
{
t->;next = p 1;/*要排序的點的後繼者是p*/
head = t;/*新的頭節點是要排序的點*/
}
Else /*要排序的點要插在中間的p2和p1之間,如果P為空,就是尾部*/
{
t->;next = p 1;/*t後面是p1*/
p2->;next = t;/*p2後面跟著t*/
}
}
p 1 =頭;/*排序後的頭指針賦給p1,準備填排名*/
而(p1!=NULL) /*當p1不為空時,執行以下操作*/
{
i++;/*節點序列號*/
p 1->;order = I;/*將節點序列號分配給等級*/
p 1 = p 1->;接下來;/*指針向後移動*/
}
printf("排序成功。\ n ");/*排序成功*/
返回(頭);
}
/*插入記錄功能*/
學生*插入(學生*頭,學生*新)
{學生*p0,*p1,* p2
int n,sum1,I;
p 1 =頭;/*使p1指向第壹個節點*/
p0 =新;/*p0指向要插入的節點*/
請輸入壹個新記錄。\ n ");/*提示輸入記錄信息*/
printf("輸入編號:");
scanf("%s ",新-& gt;num);
printf("輸入姓名:");
scanf("%s ",新-& gt;姓名);
printf("請輸入%d分。\n ",3);
sum 1 = 0;/*保存新記錄的總分,初始值為0*/
for(I = 0;我& lt3;i++)
{
做{
printf("分數%d:",I+1);
scanf("%d ",& amp新建-& gt;score[I]);
if(新建-& gt;score[I]& gt;100 | |新->;score[I]& lt;0)
printf("數據錯誤,請重新輸入。\ n ");
}while(新-& gt;score[I]& gt;100 | |新->;score[I]& lt;0);
sum 1 = sum 1+new-& gt;得分[I];/*累加所有科目的分數*/
}
新建-& gt;sum = sum 1;/*將總分存儲在新記錄中*/
新建-& gt;平均值=(float)sum 1/3;
新建-& gt;順序= 0;
If(head==NULL) /*原鏈表為空表*/
{ head = p0P0->;next = NULL}/*將p0指向的節點作為頭節點*/
其他
{ while((P0-& gt;平均& ltp 1->;平均)& amp& amp(p 1->;下壹個!=NULL))
{ p2 = p 1;/*使p2指向p1剛剛指向的節點*/
p 1 = p 1->;接下來;/*p1向後移動壹個節點*/
}
如果(P0-& gt;平均值& gt= p 1->;平均)
{ if(head = = p 1)head = P0;/*在原始第壹個節點之前插入*/
否則p2-& gt;next = p0/*在p2指向的節點後插入*/
P0->;next = p 1;}
其他
{ p 1->;next = p0P0->;next = NULL}/*在最後壹個節點後插入*/
}
n = n+1;/*節點數加上1*/
head=sort(頭);/*調用排序函數對學生的成績重新排序*/
printf(" \ n已插入學生%s。\n ",新建-& gt;姓名);
printf("不要忘記保存新文件。\ n ");
返回(頭);
}
/*將數據保存到文件功能*/
作廢保存(學生*人頭)
{ FILE * fp/*定義指向文件的指針*/
學生* p;/*定義移動指針*/
char outfile[10];
printf("輸入輸出文件名,例如c:\ \ score \ n ");
scanf("%s ",outfile);
If ((FP = fopen (outfile," WB))= = null)/*以只寫模式打開二進制文件進行輸出*/
{
printf("無法打開文件\ n ");
返回;/*如果打不開,返回菜單*/
}
printf(" \ n保存文件......\ n ");
p =頭部;/*將指針從頭指針移開*/
而(p!=NULL) /*如果p不為空*/
{
fwrite(p,LEN,1,FP);/*寫記錄*/
p = p-& gt;接下來;/*指針向後移動*/
}
fclose(FP);/*關閉文件*/
printf("保存文件成功!\ n ");
}
/*從文件函數中讀取數據*/
學生*負荷()
{STUDENT *p1,*p2,* head = NULL/*定義記錄指針變量*/
FILE * fp/*定義指向文件的指針*/
char infile[10];
printf("輸入infile名稱,例如c:\ \ score \ n ");
scanf("%s ",infile);
If ((FP = fopen (infile," Rb))= = null)/*以只讀模式打開壹個二進制文件*/
{
printf("無法打開文件。\ n ");
返回(頭);
}
printf(" \ n正在加載文件!\ n ");
p1=(學生*)malloc(LEN);/*創建新模塊*/
如果(!p1)
{
printf("內存不足!\ n ");
返回(頭);
}
head = p 1;/*作為頭指針應用於空格*/
而(!Feof(fp)) /*循環讀取數據,直到文件結束*/
{
if(fread(p1,LEN,1,fp)!= 1)break;/*如果數據未被讀取,跳出循環*/
p 1->;next =(STUDENT *)malloc(LEN);/*為下壹個節點騰出空間*/
如果(!p 1->;下壹個)
{
printf("內存不足!\ n ");
返回(頭);
}
p2 = p 1;/*使p2指向p1剛剛指向的節點*/
p 1 = p 1->;接下來;/*指針向後移動,數據鏈接被重新讀入當前頁腳*/
}
p2->;next = NULL/*最後壹個節點的後繼指針為空*/
fclose(FP);
printf("妳已經成功從文件中讀取數據!\ n ");
返回(頭);
}