結(jié)構(gòu)體定義:
typedef struct Student
{
char name[20];
int id;
float score;
}datatype;
typedef struct Node
{
union
{
datatype data; //數(shù)據(jù)域
int len;
};
struct Node *next; //指針域
}Linklist;
功能函數(shù):
1.申請(qǐng)結(jié)點(diǎn)
//定義申請(qǐng)節(jié)點(diǎn)函數(shù)
Linklist * node_apply(datatype e)
{
Linklist *p = (Linklist*)malloc(sizeof(Linklist));
if(NULL == p)
{
printf("節(jié)點(diǎn)申請(qǐng)失敗\n");
return NULL;
}
//將數(shù)據(jù)存到節(jié)點(diǎn)中
p->data = e;
p->next = NULL;
return p;
}
2.創(chuàng)建鏈表
//創(chuàng)建鏈表
Linklist *list_create()
{
Linklist* L = (Linklist*)malloc(sizeof(Linklist));
if(NULL == L)
{
printf("創(chuàng)建失敗\n");
return NULL;
}
//初始化
L->len = 0;
L->next = NULL;
//printf("創(chuàng)建成功\n");
return L;
}
3.鏈表判空
//判空
int list_empty(Linklist *L)
{
//1表示空 0表示非空
return NULL==L->next ? 1:0;
}
4.遍歷學(xué)生信息
//遍歷學(xué)生信息
void stu_show(Linklist *L)
{
//判斷邏輯
if(NULL==L || list_empty(L))
{
printf("無法遍歷\n");
return;
}
//遍歷邏輯
printf("學(xué)生信息如下:\n");
printf("\n");
//定義遍歷指針遍歷鏈表
Linklist *q = L->next;
while(q!=NULL)
{
printf("學(xué)生姓名:%s\t",q->data.name);
printf("學(xué)生學(xué)號(hào):%d\t",q->data.id);
printf("學(xué)生成績:%.2f\n",q->data.score);
printf("\n");
q = q->next;
}
printf("\n");
return;
}
5.尾插法添加學(xué)生信息
//尾插法添加學(xué)生信息
int stu_insert_tail(Linklist *L,datatype e)
{
//判斷邏輯
if(NULL == L)
{
printf("所給鏈表不合法\n");
return -1;
}
//申請(qǐng)節(jié)點(diǎn)
Linklist *p = node_apply(e);
//遍歷指針指向最后一個(gè)節(jié)點(diǎn)
Linklist *q = L;
while(q->next!=NULL)
{
q = q->next;
}
//尾插邏輯
q->next = p;
//表的變化
L->len++;
//printf("尾插成功\n");
return 0;
}
6.根據(jù)姓名查找學(xué)生信息
//根據(jù)姓名查找學(xué)生信息
int stu_search_name(Linklist *L,char sname[20])
{
//判斷邏輯
if(NULL==L || list_empty(L))
{
printf("查找失敗\n");
return -1;
}
//定義遍歷指針遍歷鏈表
Linklist *q = L->next;
while(q != NULL)
{
if(!strcasecmp(sname,q->data.name)) //判斷字符串是否相等只能用string函數(shù)族中的函數(shù)
{
printf("查找到如下信息\n");
printf("學(xué)生姓名:%s\t",q->data.name);
printf("學(xué)生學(xué)號(hào):%d\t",q->data.id);
printf("學(xué)生成績:%.2f\n",q->data.score);
return 0; //查找到直接退出函數(shù)體
}
q = q->next;
}
printf("未找到相關(guān)信息\n");
return 1;
}
7.根據(jù)學(xué)號(hào)查找學(xué)生信息
//根據(jù)學(xué)號(hào)查找學(xué)生信息
int stu_search_id(Linklist *L,int sid)
{
//判斷邏輯
if(NULL==L || list_empty(L))
{
printf("查找失敗\n");
return -1;
}
//定義遍歷指針遍歷鏈表
Linklist *q = L->next;
while(q != NULL)
{
if(q->data.id == sid)
{
printf("查找到如下信息:\n");
printf("學(xué)生姓名:%s\t",q->data.name);
printf("學(xué)生學(xué)號(hào):%d\t",q->data.id);
printf("學(xué)生成績:%.2f\n",q->data.score);
return 0; //查找到直接退出函數(shù)體
}
q = q->next;
}
printf("未找到相關(guān)信息\n");
return 1;
}
8.根據(jù)姓名刪除學(xué)生信息
//根據(jù)姓名刪除學(xué)生信息
int stu_delete_name(Linklist *L,char dname[20])
{
//判斷邏輯
if(NULL==L || list_empty(L))
{
printf("刪除失敗\n");
return -1;
}
//定義遍歷指針遍歷鏈表
Linklist *q = L;
while(NULL!=q->next && strcasecmp(dname,q->next->data.name))
{
q = q->next;
}
if(NULL != q->next)
{
Linklist *p = q->next; //標(biāo)記
q->next = p->next; //孤立
free(p); //踢開
p = NULL;
//表的變化
L->len--;
printf("刪除成功\n");
}
else
{
printf("未找到相關(guān)信息\n");
}
return 0;
}
9.根據(jù)學(xué)號(hào)刪除學(xué)生信息
//根據(jù)學(xué)號(hào)刪除學(xué)生信息
int stu_delete_id(Linklist *L,int did)
{
//判斷邏輯
if(NULL==L || list_empty(L))
{
printf("刪除失敗\n");
return -1;
}
//定義遍歷指針遍歷鏈表
Linklist *q = L;
while(NULL!=q->next && q->next->data.id!=did)
{
q = q->next;
}
if(NULL != q->next)
{
Linklist *p = q->next;
q->next = p->next;
free(p);
p = NULL;
L->len--;
printf("刪除成功\n");
}
else
{
printf("未找到相關(guān)信息\n");
}
return 0;
}
10.根據(jù)學(xué)生姓名修改學(xué)生信息
//根據(jù)學(xué)生姓名修改學(xué)生信息
int stu_update_name(Linklist *L,char uname[20],datatype e)
{
//判斷邏輯
if(NULL==L || list_empty(L))
{
printf("修改失敗\n");
return -1;
}
//修改邏輯
Linklist *p = L->next; //定義遍歷指針
while(p!=NULL) //遍歷鏈表
{
if(!strcasecmp(p->data.name,uname)) //判斷字符串是否相等
{
p->data = e;
break;
}
p = p->next;
}
printf("學(xué)生信息修改成功\n");
return 0;
}
11.根據(jù)學(xué)生學(xué)號(hào)修改學(xué)生信息
//根據(jù)學(xué)生學(xué)號(hào)修改學(xué)生信息
int stu_update_id(Linklist *L,int uid,datatype e)
{
//判斷邏輯
if(NULL==L || list_empty(L))
{
printf("修改失敗\n");
return -1;
}
//修改邏輯
Linklist *p = L->next; //定義遍歷指針
while(p!=NULL) //遍歷鏈表
{
if(p->data.id == uid)
{
p->data = e;
break;
}
p = p->next;
}
printf("學(xué)生信息修改成功\n");
return 0;
}
12.按學(xué)號(hào)將學(xué)生排序
//按學(xué)號(hào)將學(xué)生排序
void stu_sort_id(Linklist *L,int flag)
{
//判斷邏輯
if(NULL==L || list_empty(L))
{
printf("排序失敗\n");
}
//冒泡排序
Linklist *q = L->next; //定義遍歷指針
if(flag) //升序
{
for(int i=0;i<L->len-1;i++)
{
q = L->next; //每一輪排序開始前都要將遍歷指針指回第一個(gè)結(jié)點(diǎn)
for(int j=0;j<L->len-i-1;j++)
{
if(q->data.id>q->next->data.id) //大升小降
{
datatype temp = q->data; //三杯水交換
q->data = q->next->data;
q->next->data = temp;
}
q = q->next;
}
}
}
else //降序
{
for(int i=0;i<L->len-1;i++)
{
q = L->next;
for(int j=0;j<L->len-i-1;j++)
{
if(q->data.id<q->next->data.id)
{
datatype temp = q->data;
q->data = q->next->data;
q->next->data = temp;
}
q = q->next;
}
}
}
//printf("排序成功\n");
}
13.按成績將學(xué)生排序
//按成績將學(xué)生排序
void stu_sort_score(Linklist *L,int flag)
{
//判斷邏輯
if(NULL==L || list_empty(L))
{
printf("排序失敗\n");
}
//冒泡排序
Linklist *q = L->next; //定義遍歷指針
if(flag) //升序
{
for(int i=0;i<L->len-1;i++)
{
q = L->next;
for(int j=0;j<L->len-i-1;j++)
{
if(q->data.score>q->next->data.score)
{
datatype temp = q->data;
q->data = q->next->data;
q->next->data = temp;
}
q = q->next;
}
}
}
else //降序
{
for(int i=0;i<L->len-1;i++)
{
q = L->next;
for(int j=0;j<L->len-i-1;j++)
{
if(q->data.score<q->next->data.score)
{
datatype temp = q->data;
q->data = q->next->data;
q->next->data = temp;
}
q = q->next;
}
}
}
//printf("排序成功\n");
}
主函數(shù):
int main(int argc, const char *argv[])
{
//新建一個(gè)存放學(xué)生信息的單鏈表
Linklist *L = list_create();
//初始化幾個(gè)變量并存入單鏈表中
datatype e1;
strcpy(e1.name,"zy");
e1.id = 924;
e1.score = 96;
stu_insert_tail(L,e1);
datatype e2;
strcpy(e2.name,"yl");
e2.id = 128;
e2.score = 95;
stu_insert_tail(L,e2);
datatype e3;
strcpy(e3.name,"wjm");
e3.id = 562;
e3.score = 100;
stu_insert_tail(L,e3);
datatype e4;
strcpy(e4.name,"sy");
e4.id = 357;
e4.score = 91;
stu_insert_tail(L,e4);
while(1) //循環(huán)打印系統(tǒng)菜單
{
printf("--------------------------------\n");
printf("------歡迎進(jìn)入學(xué)生管理系統(tǒng)------\n");
printf("---------1.添加學(xué)生信息---------\n");
printf("---------2.查找學(xué)生信息---------\n");
printf("---------3.刪除學(xué)生信息---------\n");
printf("---------4.修改學(xué)生信息---------\n");
printf("-------5.顯示全部學(xué)生信息-------\n");
printf("-------6.退出學(xué)生管理系統(tǒng)-------\n");
printf("--------------------------------\n");
printf("請(qǐng)?zhí)顚憯?shù)字以選擇相應(yīng)功能:\n");
int select;
scanf("%d",&select);
getchar(); //吸收垃圾字符防止陷入死循環(huán)
switch(select)
{
case 1:
{
//初始化數(shù)據(jù)
datatype e;
//終端輸入學(xué)生信息
printf("請(qǐng)輸入學(xué)生姓名:\n");
scanf("%s",e.name);
printf("請(qǐng)輸入學(xué)生學(xué)號(hào):\n");
scanf("%d",&e.id);
printf("請(qǐng)輸入學(xué)生成績:\n");
scanf("%f",&e.score);
//尾插法添加學(xué)生信息
stu_insert_tail(L,e);
printf("添加成功\n");
break;
}
case 2:
{
//提示查找方式
printf("請(qǐng)選擇按什么查找:\n");
printf("1.姓名\t2.學(xué)號(hào)\n");
int select1;
scanf("%d",&select1);
switch(select1)
{
case 1:
{
//終端輸入想要查找的學(xué)生姓名
char sname[20];
printf("請(qǐng)輸入要查找的學(xué)生姓名:\n");
scanf("%s",sname);
//根據(jù)姓名查找學(xué)生信息
stu_search_name(L,sname);
break;
}
case 2:
{
int sid;
printf("請(qǐng)輸入要查找的學(xué)生學(xué)號(hào):\n");
scanf("%d",&sid);
//根據(jù)學(xué)號(hào)查找學(xué)生信息
stu_search_id(L,sid);
break;
}
default:
{
printf("你輸入的數(shù)字有誤!\n");
break;
}
}
break;
}
case 3:
{
//提示刪除方式
printf("請(qǐng)選擇按什么刪除:\n");
printf("1.姓名\t2.學(xué)號(hào)\n");
int select2;
scanf("%d",&select2);
switch(select2)
{
case 1:
{
char dname[20];
printf("請(qǐng)輸入要?jiǎng)h除的學(xué)生姓名:\n");
scanf("%s",dname);
int res = stu_search_name(L,dname);
if(!res)
{
char answer;
getchar(); //吸收空格
printf("你確定要?jiǎng)h除嗎?(回復(fù)y或n)\n");
scanf("%c",&answer);
if(answer=='y' || answer=='Y')
{
//根據(jù)姓名刪除學(xué)生信息
stu_delete_name(L,dname);
break;
}
else if(answer=='n' || answer=='N')
{
printf("已取消刪除\n");
break;
}
else
{
printf("你輸入的回復(fù)有誤!\n");
break;
}
}
break;
}
case 2:
{
int did;
printf("請(qǐng)輸入要?jiǎng)h除的學(xué)生學(xué)號(hào):\n");
scanf("%d",&did);
int res = stu_search_id(L,did);
if(!res)
{
char answer;
getchar();
printf("你確定要?jiǎng)h除嗎?(回復(fù)y或n)\n");
scanf("%c",&answer);
if(answer=='y' || answer=='Y')
{
//根據(jù)學(xué)號(hào)刪除學(xué)生信息
stu_delete_id(L,did);
break;
}
else if(answer=='n' || answer=='N')
{
printf("已取消刪除\n");
break;
}
else
{
printf("你輸入的回復(fù)有誤!\n");
break;
}
}
break;
}
default:
{
printf("你輸入的數(shù)字有誤!\n");
break;
}
}
break;
}
case 4:
{
//提示修改方式
printf("請(qǐng)選擇按什么查找要修改的學(xué)生信息:\n");
printf("1.姓名\t2.學(xué)號(hào)\n");
int select3;
scanf("%d",&select3);
switch(select3)
{
case 1:
{
char uname[20];
printf("請(qǐng)輸入要修改信息的學(xué)生姓名:\n");
scanf("%s",uname);
//先判斷是否存在終端輸入的學(xué)生姓名
int res = stu_search_name(L,uname);
if(!res)
{
datatype e_name;
printf("請(qǐng)輸入新的學(xué)生姓名:\n");
scanf("%s",e_name.name);
printf("請(qǐng)輸入新的學(xué)生學(xué)號(hào):\n");
scanf("%d",&e_name.id);
printf("請(qǐng)輸入新的學(xué)生成績:\n");
scanf("%f",&e_name.score);
//根據(jù)學(xué)生姓名修改學(xué)生信息
stu_update_name(L,uname,e_name);
}
break;
}
case 2:
{
int uid;
printf("請(qǐng)輸入要修改信息的學(xué)生學(xué)號(hào):\n");
scanf("%d",&uid);
//判斷是否存在終端輸入的學(xué)生學(xué)號(hào)
int res = stu_search_id(L,uid);
if(!res)
{
datatype e_id;
printf("請(qǐng)輸入新的學(xué)生姓名:\n");
scanf("%s",e_id.name);
printf("請(qǐng)輸入新的學(xué)生學(xué)號(hào):\n");
scanf("%d",&e_id.id);
printf("請(qǐng)輸入新的學(xué)生成績:\n");
scanf("%f",&e_id.score);
//根據(jù)學(xué)生學(xué)號(hào)修改學(xué)生信息
stu_update_id(L,uid,e_id);
}
break;
}
default:
{
printf("你輸入的數(shù)字有誤!\n");
break;
}
}
break;
}
case 5:
{
//提示顯示方式
printf("請(qǐng)選擇學(xué)生排序方式:\n");
printf("1.學(xué)號(hào)升序\n");
printf("2.學(xué)號(hào)降序\n");
printf("3.成績升序\n");
printf("4.成績降序\n");
int select4;
scanf("%d",&select4);
switch(select4)
{
case 1:
{
stu_sort_id(L,1);
stu_show(L);
break;
}
case 2:
{
stu_sort_id(L,0);
stu_show(L);
break;
}
case 3:
{
stu_sort_score(L,1);
stu_show(L);
break;
}
case 4:
{
stu_sort_score(L,0);
stu_show(L);
break;
}
default:
{
printf("你輸入的數(shù)字有誤!\n");
}
}
break;
}
case 6:
{
printf("退出成功\n");
exit(0); //跳出死循環(huán)
}
default:
{
printf("你輸入的數(shù)字有誤!\n");
}
}
}
return 0;
}
測(cè)試結(jié)果:
1.測(cè)試添加學(xué)生信息功能及查找學(xué)生信息功能:
查找剛剛添加的學(xué)生hqy的信息發(fā)現(xiàn)能夠被查找到,通過姓名和學(xué)號(hào)皆可。
?2.測(cè)試刪除學(xué)生信息功能:
1)按姓名刪除
?刪除學(xué)生hqy后再查找hqy無結(jié)果
?2)按學(xué)號(hào)刪除
?學(xué)生zy的信息也被刪除
?3.測(cè)試修改學(xué)生信息功能:
1)按姓名修改
?遍歷學(xué)生列表可見已修改成功
?2)按學(xué)號(hào)修改
?4.測(cè)試學(xué)生排序功能:
1)按學(xué)號(hào)排序
升序:
降序:?
?2)按成績排序
升序:
降序:
?5.退出系統(tǒng)
文章來源:http://www.zghlxwxcb.cn/news/detail-419185.html
?文章來源地址http://www.zghlxwxcb.cn/news/detail-419185.html
到了這里,關(guān)于用單鏈表實(shí)現(xiàn)學(xué)生信息管理系統(tǒng)(7.23周末作業(yè))的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!