/*頭文件*/
# 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
}學生;
/*函數原型*/
STUDENT * init();/*初始化函數*/
int menu _ select();/*菜單功能*/
STUDENT * create();/*創建鏈接列表*/
作廢打印(學生*頭像);/*顯示所有記錄*/
void搜索(學生*頭像);/*查找記錄*/
學生*刪除(學生*頭像);/*刪除記錄*/
學生*排序(學生*頭);/*排序*/
STUDENT * insert(STUDENT * head,STUDENT * new);/*插入記錄*/
void save(學生*頭像);/*保存文件*/
STUDENT * load();/*讀取文件*/
/*主功能界面*/
主()
{學生*頭像,新;
head = init();/*鏈表被初始化,因此head的值為空*/
for(;;)/*循環無限次*/
{ switch(menu _ select())
{
case 1:head = create();打破;
案例二:打印(頭);打破;
案例三:搜索(頭);打破;
情況四:head=delete(頭);打破;
情況5:head = sort(head);打破;
情況6:head = insert(head & amp;新);打破;/* & amp;新的意思是寄信人地址*/
案例七:救人(頭);打破;
情況8:head = load();打破;
情況9:出口(0);/*如果菜單返回值為9,程序結束*/
}
}
}
/*初始化函數*/
學生*初始化()
{
返回NULL/*返回空指針*/
}
/*菜單選擇功能*/
菜單選擇()
{ int n;
結構日期d;/*定義時間結構*/
getdate(& amp;d);/*讀取系統日期並將其放入結構D */
printf(“按任意鍵進入菜單……”);/*按任意鍵進入主菜單*/
getch();/*從鍵盤讀取字符,但不要顯示在屏幕上*/
clrscr();/*清空屏幕*/
printf(“* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * \ n“);
printf(“\ t \ t歡迎來到\ n“);
printf(“\ n \ t \ t學生成績管理系統\ n“);
printf(“* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * n“);
printf(“\ t \ t \ t 1。輸入記錄\ 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“);/*退出*/
胡海紅制作。\ 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 & gt;9);/*如果所選項目不在1~9之間,請再次輸入*/
返回(n);/*返回選中的項目,main函數根據數字調用相應的函數*/
}
/*輸入功能*/
學生*創建()
{int i,s;
STUDENT *head=NULL,* p;/*定義函數。這個函數返回壹個指向鏈表頭部的指針*/
clrscr();
for(;;)
{ p =(STUDENT *)malloc(LEN);/*創建新模塊*/
如果(!p)/*如果指針p為空*/
{ printf(“\ n內存不足);/*輸出內存溢出*/
返回(頭);/*返回頭指針,下同*/
}
printf(“輸入編號(0:列表結尾:)“;
scanf(“% s“,p-& gt;num);
if(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】);
if(p-》;得分【I】& lt;0 | | p-》;score【I】& gt;100)/*確保分數在0到100之間*/
printf(“數據錯誤,請重新輸入。\ n ");
} while(p-& gt;得分【I】& lt;0 | | p-》;score【I】& gt;100);
s = s+p-& gt;score【I】;/*累加所有科目的分數*/
}
p-》;sum = s;/*保存總分*/
p-》;平均值=(float)s/3;/*通過強制類型轉換將S轉換為float類型,然後獲取平均值*/
p-》;order = 0;/*排序前該值為0 */
p-》;next = head/*將首節點作為新輸入節點的後繼節點*/
head = p;/*新的輸入節點是新的頭節點*/
}
返回(頭);
}
/*顯示所有錄制的功能*/
無效打印(學生*頭像)
{ int I = 0;/*統計記錄的數量*/
學生* p;/*移動指針*/
clrscr();
p =頭部;/*初始值是頭指針*/
printf(“\ n * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * \ n“);
printf(“-\ n“);
printf(“| Rec | Num | Name | sc 1 | Sc2 | Sc3 | Sum | Ave | Order | \ n“);
printf(“-\ n“);
而(p!=NULL)
{
i++;
printf(“| % 3d | % 4s | %-4s | % 3d | % 3d | % 3d | % 3d | % 4.2f | %-5d | \ n“,
我,p-》;num,p-》;名稱,p-& gt;得分【0】,p-》;分數【1】,p-》;score【2】,p-》;sum,p-》;平均值,p-》;訂單);
p = p-& gt;接下來;
}
printf(“-\ n“);
printf(“* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * \ n“);
}
/*查找記錄功能*/
無效搜索(學生*負責人)
{ STUDENT * p;/*移動指針*/
char s【5】;/*用於存儲姓名的字符數組*/
clrscr();
printf(“請輸入搜索名稱。\ n ");
scanf(“% s“,s);
p =頭部;/*將頭指針分配給p*/
while(strcmp(p-& gt;姓名)和名稱。& ampp!= NULL)/*當記錄的名稱不是您要查找的名稱或者指針不為空時*/
p = p-& gt;接下來;/*將指針移動到下壹個節點*/
如果(p!= NULL)/*如果指針不為空*/
{ printf(“\ n * * * * * * * *找到了* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * \ 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-》;分數【1】,p-》;score【2】,p-》;sum,p-》;平均值,p-》;訂單);
printf(“-\ n“);
printf(“* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * \ n“);
}
其他
printf(“\ n列表中沒有編號為%s的學生。\n“,s);/*顯示沒有學生*/
}
/*刪除記錄功能*/
學生*刪除(學生*頭)
{ int n;
學生*p1,* p2/*p1是指向要刪除的節點的指針,p2是其前置指針*/
char c,s【6】;/* s【6】用於存儲學生編號,C用於輸入字母*/
clrscr();
printf(“請輸入刪除的編號:“);
scanf(“% s“,s);
p 1 = p2 = head;/*將初始值頭指針分配給p1和p2 */
while(strcmp(p 1-》;數字(s)和& 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-& gt;分數【0】,p 1-》;score【1】,p 1-》;score【2】,p 1-》;sum,p 1-》;平均值,p 1-》;訂單);
printf(“-\ n“);
printf(“* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * \ 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-& gt;接下來;/*否則,將下壹個節點地址分配給前壹個節點地址*/
n = n-1;
printf(“\ nNum % s學生已被刪除。\n“,s);
printf(“不要忘記保存。\ n ");打破;/*刪除然後跳出循環*/
}
}
}
其他
printf(“\ n列表中沒有編號為%s的學生。\n“,s);/*找不到節點*/
返回(頭);
}
/*排序功能*/
學生*排序(學生*頭)
{ int I = 0;/*保存排名*/
STUDENT *p1、*p2、*t、* temp/*定義臨時指針*/
temp = head-& gt;接下來;/*使用原始表的頭指針指向的下壹個節點作為頭指針*/
head-》;next = NULL/*第壹個節點是新表的頭節點*/
while(temp!= NULL)/*當原始表不為空時排序*/
{
t =溫度;/*取原表的頭節點*/
temp = temp-& gt;接下來;/*原始頭節點的指針向後移動*/
p 1 = head;/*從頭部指針開始設置移動指針p 1 */
p2 =頭部;/*將移動指針p2設置為p1的前身,初始值為頭指針*/
while(t-》;平均& ltp 1-》;平均值和平均值。& ampp1!= NULL)/*比較平均分數*/
{
p2 = p 1;/*當排序點值較小時,新表格指針將後移*/
p 1 = p 1-》;接下來;
}
if(p 1 = = p2)/* p 1 = = 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 = head;/*排序後的頭指針賦給p1,準備填寫排名*/
while(p 1!= NULL)/*當p1不為空時,執行以下操作*/
{
i++;/*節點序列號*/
p 1-》;order = I;/*將節點序列號分配給等級*/
p 1 = p 1-》;接下來;/*指針向後移動*/
}
printf(“排序成功。\ n ");/*排序成功*/
返回(頭);
}
/*插入記錄功能*/
學生*插入(學生*頭像,學生*新頭像)
{STUDENT *p0、*p1、* p2
int n,sum1,I;
p 1 = head;/*使p1指向第壹個節點*/
p0 =新;/*p0指向要插入的節點*/
請輸入壹條新記錄。\ n ");/*記錄信息提示*/
printf(“輸入編號:“);
scanf(“% s“,new-& gt;num);
printf(“輸入名稱:“);
scanf(“% s“,new-& 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 | |新-》;得分【I】& lt;0)
printf(“數據錯誤,請重新輸入。\ n ");
}while(新-& gt;score【I】& gt;100 | |新-》;得分【I】& lt;0);
sum 1 = sum 1+new-& gt;score【I】;/*累加所有科目的分數*/
}
新-& gt;sum = sum 1;/*將總分存儲在新記錄中*/
新-& gt;average =(float)sum 1/3;
新-& gt;order = 0;
if(head = = NULL)/*原始鏈表是壹個空表*/
{ head = p0P0-》;next = NULL}/*將p0指向的節點作為頭節點*/
其他
{ while((P0-》;平均& ltp 1-》;平均)和amp& amp(p 1-》;下壹個!=空)
{ p2 = p 1;/*使p2指向p1剛剛指向的節點*/
p 1 = p 1-》;接下來;/*p1向後移動壹個節點*/
}
如果(P0-》;平均值& gt= p 1-》;平均)
{ if(head = = p 1)head = P0;/*插入原始第壹個節點之前*/
否則p2-》;next = p0/*在p2指向的節點後插入*/
P0-》;next = p 1;}
其他
{ p 1-& gt;next = p0P0-》;next = NULL}/*在最後壹個節點後插入*/
}
n = n+1;/*節點數加上1*/
head = sort(head);/*調用排序函數對學生的成績進行重新排序*/
printf(“已插入學生%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 ");
p1=(學生*)malloc(LEN);/*創建新模塊*/
如果(!p1)
{
printf(“內存不足!\ n ");
返回(頭);
}
head = p 1;/*作為頭部指針應用於空格*/
而(!feof(FP))/*循環讀取數據直到文件結束*/
{
if(fread(p 1,LEN,1,fp)!= 1)break;/*如果數據未被讀取,則跳出循環*/
p 1-》;next=(學生*)malloc(LEN);/*為下壹個節點騰出空間*/
如果(!p 1-》;下壹個)
{
printf(“內存不足!\ n ");
返回(頭);
}
p2 = p 1;/*使p2指向p1剛剛指向的節點*/
p 1 = p 1-》;接下來;/*指針向後移動,數據鏈接被重新讀入當前頁腳*/
}
p2-》;next = NULL/*最後壹個節點的後續指針為空*/
fclose(FP);
printf(“您已經成功從文件中讀取數據!\ n ");
返回(頭);
}