這供妳參考。
# include & ltstdio.h & gt
# include & ltconio.h & gt
# include & ltmalloc.h & gt
# include & ltstring.h & gt
typedef結構學生
{
char student number[10];/*學生ID */
char student name[20];/*學生姓名*/
char class name[20];/*類名*/
float mark 1;/*等級1 */
浮動標記2;/*二年級*/
浮動標記3;/*三年級*/
結構學生*下壹個;
}學生;
學生* headLink/*鏈表頭指針*/
/*以下是函數聲明*/
void ReadInfoFormFile(void);
void DesplayMenu(void);
void CreateHeadLink(void);
STUDENT * MallocNode(void);
void get information(STUDENT * t);
void OutputInformation(無效);
void desplayfobystudentname(void);
void desplayfobystudentnumber(void);
void DesplayOneNode(學生* t);
void InsertOneNode(學生* t);
void DeleteNodeBystudentNumber(void);
void ChangeMarkByName(void);
void ChangeMarkByNumber(void);
void SaveLinkToFile(void);
void DesplayMarkSegment(void);
void compositorbytolmark(void);
int choose/*用於接受用戶的選擇*/
/*主函數*/
主()
{
CreateHeadLink();
ReadInfoFormFile();
DesplayMenu();
}
/************************************
函數功能:從文件中讀取學生信息到鏈表中。
************************************/
void ReadInfoFormFile(void)
{
FILE * fp
學生* p;
fp=fopen("student.txt "," r ");
如果(!fp)
{
Printf("文件不存在\ n ");
返回;
}
p = MallocNode();
while(fscanf(fp," %s%s%s%f%f ",p-& gt;學生編號,p-& gt;學生姓名,p-& gt;類名。(p->;馬克1);(p->;mark2),以及amp(p->;mark 3))& gt;0)
{
insertone node(p);
p = MallocNode();
}
fclose(FP);
}
/************************************
功能函數:顯示菜單,根據用戶的輸入。
完成相應的功能。
************************************/
void DesplayMenu(void)
{
學生* p;
Printf(" -請選擇相應的函數);
Printf("| 1顯示所有學生的信息| \ n ");
Printf("| 2按名稱查詢| \ n ");
Printf("| 3按學號查詢| \ n ");
Printf("| 4添加學生| \ n ");
Printf("| 5刪除學生| \ n ");
Printf("| 6按姓名修改學生成績| \ n ");
Printf("| 7根據學生編號修改學生成績| \ n ");
Printf("| 8保存所有學生信息| \ n ");
Printf("| 9顯示優秀和失敗學生的分數| \ n ");
Printf("| 10對結果進行排序並輸出結果| \ n ");
printf(" | 11 Exit | \ n \ n ");
scanf("%d ",& amp選擇);/*獲得用戶的選擇*/
切換(選擇)
{
案例1:
output information();/*顯示所有學生的信息*/
打破;
案例二:
desplayofbystudentname();
打破;
案例三:
desplayofbystudentnumber();/*根據用戶輸入的學號顯示學生的信息*/
打破;
案例4:
p = MallocNode();/*先申請新節點*/
GetInformation(p);/*要求用戶在新節點中輸入信息*/
insertone node(p);/*向鏈表添加新節點*/
打破;
案例5:
DeleteNodeBystudentNumber();/*根據用戶輸入的學號刪除學生*/
打破;
案例6:
ChangeMarkByName();/*根據用戶輸入的姓名修改學生成績*/
打破;
案例7:
ChangeMarkByNumber();/*根據用戶輸入的學號修改學生成績*/
打破;
案例8:
SaveLinkToFile();/*保存數據*/
打破;
案例9:
DesplayMarkSegment();/*顯示各年級學生的分數*/
打破;
案例10:
compositorbytolmark();
打破;
案例11:
SaveLinkToFile();/*退出前保存數據*/
免費(headLink);
退出(1);
打破;
默認值:
打破;
}
DesplayMenu();/*遞歸調用*/
}
/************************************
功能:創建鏈表頭。
************************************/
void CreateHeadLink(void)
{
學生* p;
p=(學生*)malloc(sizeof(學生));
headLink = p;
p->;next = NULL
}
/************************************
功能:申請新節點並初始化。
************************************/
學生*MallocNode(void)
{
學生* p;
int I;
p=(學生*)malloc(sizeof(學生));
if(p==NULL)
返回NULL
for(I = 0;我& lt10;i++)
p->;student number[I]= ' \ 0 ';
for(I = 0;我& lt20;i++)
p->;student name[I]= ' \ 0 ';
for(I = 0;我& lt20;i++)
p->;class name[I]= ' \ 0 ';
p->;mark 1 = 0.0;
p->;mark2 = 0.0
p->;mark3 = 0.0
p->;next = NULL
返回p;
}
/************************************
函數Function:獲取用戶輸入的學生信息。
************************************/
void GetInformation(學生*t)
{
Printf("請輸入學號:\ n ");
scanf("%s ",t-& gt;學生編號);
Printf("請輸入學生姓名:\ n ");
scanf("%s ",t-& gt;student name);
Printf("請輸入該學生的班級:\ n ");
scanf("%s ",t-& gt;class name);
Printf("請輸入1等級:\ n ");
scanf("%f ",& amp(t->;mark 1));
Printf("請輸入二年級:\ n ");
scanf("%f ",& amp(t->;mark 2));
Printf("請輸入三年級:\ n ");
scanf("%f ",& amp(t->;mark 3));
}
/************************************
功能:在鏈表的末尾添加壹個節點。
************************************/
void InsertOneNode(STUDENT *t)
{
學生* p;
p = headLink
while(p->;下壹個)
{
p = p-& gt;接下來;
}
p->;next = t;
}
/************************************
功能功能:根據用戶輸入的學生姓名顯示該學生的信息。
************************************/
void desplayfobystudentname(void)
{
學生* p;
char student name[20];
char flag = 0;
p = head link-& gt;接下來;
Printf("請輸入學生姓名:\ n ");
scanf("%s ",student name);
while(p)
{
if(strcmp(p-& gt;學生名,學生名)==0)
{
Printf("學號\t姓名\t班級\t年級1\t年級1\t年級3\t總成績\t平均成績\ n \ n \ ");
去播放節點(p);
flag = 1;
打破;
}
p = p-& gt;接下來;
}
如果(!旗幟)
Printf("抱歉,沒有叫%s \n "的學生,student named
}
/************************************
功能功能:根據用戶輸入的學號顯示該學生的信息。
************************************/
void desplayfobystudentnumber(void)
{
學生* p;
char student number[10];
char flag = 0;
p = head link-& gt;接下來;
Printf("請輸入學號:\ n ");
scanf("%s ",student number);
while(p)
{
if(strcmp(p-& gt;學生編號,學生編號)==0)
{
Printf("學號\t姓名\t班級\t年級1\t年級1\t年級3\t總成績\t平均成績\ n \ n \ ");
去播放節點(p);
flag = 1;
打破;
}
p = p-& gt;接下來;
}
如果(!旗幟)
Printf("抱歉,沒有學號為%s \n "的學生,student number);
}
/************************************
函數Function:輸出壹個節點的信息。
************************************/
無效取消播放節點(學生*t)
{
printf("%s\t ",t-& gt;學生編號);
printf("%s\t ",t-& gt;student name);
printf("%s\t ",t-& gt;class name);
printf("%.2f\t ",t-& gt;mark 1);
printf("%.2f\t ",t-& gt;mark 2);
printf("%.2f\t ",t-& gt;mark 3);
printf("%.2f\t ",t-& gt;mark 1+t->;mark 2+t-& gt;mark 3);
printf("%.2f\t\n ",(t-& gt;mark 1+t->;mark 2+t-& gt;mark 3)/3);
}
/************************************
功能:根據用戶輸入的學號刪除學生。
************************************/
void DeleteNodeBystudentNumber(void)
{
char student number[10];
學生*p,* q;
char flag = 0;
Printf("請輸入要刪除的學號:");
scanf("%s ",student number);
p = headLink
q = headLink-& gt;接下來;
while(q)
{
if(strcmp(q-& gt;學生編號,學生編號)==0)
{
p->;next = q-& gt;接下來;
免費(q);
flag = 1;
打破;
}
p = p-& gt;接下來;
q = q-& gt;接下來;
}
如果(!旗幟)
{
Printf("沒有此學號的學生\ n ");
返回;
}
Printf("成功刪除\ n ");
}
/************************************
功能功能:顯示所有學生的信息。
************************************/
無效輸出信息(無效)
{
學生* p;
p = head link-& gt;接下來;
if(p==NULL)
{
Printf("現在沒有學生信息,請先輸入學生信息\ n \ n ");
返回;
}
Printf("學號\t姓名\t班級\t年級1\t年級1\t年級3\t總成績\t平均成績\ n \ n \ ");
while(p)
{
去播放節點(p);
p = p-& gt;接下來;
}
}
/************************************
功能作用:根據輸入的名稱修改等級。
************************************/
void ChangeMarkByName(void)
{
學生* p;
char student name[20];
char flag = 0;
float mark1,mark2,mark3
p = head link-& gt;接下來;
Printf("請輸入學生姓名:\ n ");
scanf("%s ",student name);
while(p)
{
if(strcmp(p-& gt;學生名,學生名)==0)
{
Printf("請輸入新的1等級:\ n ");
scanf("%f ",& ampmark 1);
Printf("請輸入新的二年級:\ n ");
scanf("%f ",& ampmark 2);
Printf("請輸入新的三年級:\ n ");
scanf("%f ",& ampmark 3);
p->;mark 1 = mark 1;
p->;mark2 = mark2
p->;mark3 = mark3
flag = 1;
Printf("修改成功\ n ");
打破;
}
p = p-& gt;接下來;
}
如果(!旗幟)
Printf("抱歉,沒有叫%s \n "的學生,student named
}
/************************************
功能作用:根據輸入的學號修改成績。
************************************/
void ChangeMarkByNumber(void)
{
學生* p;
char student number[20];
char flag = 0;
float mark1,mark2,mark3
p = head link-& gt;接下來;
Printf("請輸入學號:\ n ");
scanf("%s ",student number);
while(p)
{
if(strcmp(p-& gt;學生編號,學生編號)==0)
{
Printf("請輸入新的1等級:\ n ");
scanf("%f ",& ampmark 1);
Printf("請輸入新的二年級:\ n ");
scanf("%f ",& ampmark 2);
Printf("請輸入新的三年級:\ n ");
scanf("%f ",& ampmark 3);
p->;mark 1 = mark 1;
p->;mark2 = mark2
p->;mark3 = mark3
flag = 1;
Printf("修改成功\ n ");
打破;
}
p = p-& gt;接下來;
}
如果(!旗幟)
Printf("抱歉,沒有學號為%s \n "的學生,student number);
}
/************************************
功能:將鏈表數據保存到文件中。
************************************/
void SaveLinkToFile(void)
{
學生* p;
FILE * fp
p = head link-& gt;接下來;
if(p==NULL)
{
Printf("現在沒有學生信息,請先輸入學生信息\ n \ n ");
返回;
}
fp=fopen("student.txt "," w+");
如果(!fp)
{
Printf("文件不存在\ n ");
返回;
}
while(p)
{
fprintf(fp," %s %s %s %f %f %f\n ",p-& gt;學生編號,p-& gt;學生姓名,p-& gt;類名,p-& gt;mark1,p->mark2,p-& gt;mark 3);
p = p-& gt;接下來;
}
fclose(FP);
}
/************************************
功能:顯示優秀和失敗學生的分數。
************************************/
void DesplayMarkSegment(void)
{
學生* p;
int count = 0;
p = head link-& gt;接下來;
printf(" 60(不及格)以下學生分數如下:\ n ");
Printf("學號\t姓名\t班級\t年級1\t年級1\t年級3\t總成績\t平均成績\ n \ n \ ");
while(p)
{
如果((6 & gt((int)(p-& gt;mark 1/10)))| |(6 & gt;((int)(p-& gt;mark 2/10)))| |(6 & gt;((int)(p-& gt;Mark 3/10)))/*只要有壹科不及格,就認為該生不及格*/
{
count++;
去播放節點(p);
}
p = p-& gt;接下來;
}
Printf("有%d個學生不及格-* * \n ",count);
p = head link-& gt;接下來;
Printf("成績優秀的學生成績如下:\ n ");
Printf("學號\t姓名\t班級\t年級1\t年級1\t年級3\t總成績\t平均成績\ n \ n \ ");
count = 0;
while(p)
{
如果((8 & lt=((int)(p-& gt;mark 1/10))& amp;& amp(8 & lt=((int)(p-& gt;mark 2/10)))& amp;& amp(8 & lt=((int)(p-& gt;mark3/10))))
{
count++;
去播放節點(p);
}
p = p-& gt;接下來;
}
Printf("有%d個成績優秀的學生\n ",count);
}
/************************************
函數函數:按總分排序
************************************/
void compositorbytalmark(void)
{
學生交換,*r,*p,* q;
r = head link-& gt;接下來;
if(r==NULL)
{
Printf("還沒有學生信息,請先輸入學生信息\ n ");
返回;
}
While(r)/*兩層While循環實現排序*/
{
p = r;
q = r-& gt;接下來;
while(q)
{
如果((q-& gt;mark 1+q->;mark 2+q-& gt;mark3)>(p->;mark 1+p-& gt;mark 2+p-& gt;mark3))
{
strcpy(exchange.studentNumber,q-& gt;學生編號);/*將Q節點信息復制到exchange*/ first */
strcpy(exchange.studentName,q-& gt;student name);
strcpy(exchange.className,q-& gt;class name);
exchange . mark 1 = q-& gt;mark 1;
exchange . mark 2 = q-& gt;mark2
exchange . mark 3 = q-& gt;馬克3;
strcpy(q-& gt;學生編號,p-& gt;學生編號);/*然後將P節點信息復制到q*/
strcpy(q-& gt;學生姓名,p-& gt;student name);
strcpy(q-& gt;類名,p-& gt;class name);
q->;mark 1 = p-& gt;mark 1;
q->;mark 2 = p-& gt;馬克3;
q->;mark 3 = p-& gt;馬克3;
strcpy(p-& gt;studentNumber,exchange . student number);/*最後,將交換節點信息復制到p*/
strcpy(p-& gt;studentName,exchange . student name);
strcpy(p-& gt;className,exchange . class name);
p->;mark 1 = exchange . mark 1;
p->;mark 2 = exchange . mark 2;
p->;mark 3 = exchange . mark 3;
}
q = q-& gt;接下來;
}
r = r-& gt;接下來;
}
output information();
}
祝妳學好C語言。我來這裏不是為了分,我只是想讓妳知道大學的真諦,這種實用的食物可以讓妳逐漸成熟!