建立学生信息无头结点单链表C语言版.docx
《建立学生信息无头结点单链表C语言版.docx》由会员分享,可在线阅读,更多相关《建立学生信息无头结点单链表C语言版.docx(14页珍藏版)》请在冰豆网上搜索。
建立学生信息无头结点单链表C语言版
#include
#include
typedefstructStudent/*定义学生类*/
{
intnum;
charname[20];
charsex[2];
intage;
floatgrade;
}stu;
typedefstructLNode
{
studata;
structLNode*next;
}LNode,*Linklist;
LinklistInitList_L(LinklistL)/*构造一个空的单向链表*/
{
L=(Linklist)malloc(sizeof(stu));
if(!
L)
printf("ERROR\n");
else
{
L=NULL;
printf("OK\n");
returnL;
}
}
voidDestroyList_L(LinklistL)//销毁单向链表*/
{
Linklistp;
if(!
L)
printf("ERROR\n");
else
{
while(L)
{
p=L;
L=L->next;
free(p);
}
printf("OK\n");
}
}
voidClearList_L(LinklistL)/*将L重置为空表*/
{
Linklistp;
if(!
L)
printf("ERROR\n");
else
{
while(L->next)
{
p=L->next;
L->next=p->next;
free(p);
}
printf("OK\n");
}
}
voidListEmpty_L(LinklistL)/*L为空表返回TRUE,否则返回FALSE*/
{
if(!
L)
printf("ERROR\n");
else
{
if(!
L->next)
printf("TRUE\n");
else
printf("FLASE\n");
}
}
intListLength_L(LinklistL)/*返回L中数据元素个数*/
{
inti=0;
Linklistp=L;
if(!
L)
return0;
else
{
while(p)
{
i++;
p=p->next;
}
returni;
}
}
voidGetElem_L(LinklistL,inti)//返回第i个元素的值*/
{
stue;
Linklistp=L;
intj=1;
while(p!
=NULL&&j
{
p=p->next;
++j;
}
if(!
p||j>i)
printf("ERROR\n");
else
{
printf("学生%d的数据为:
\n",i);
printf("学号:
%d\n姓名:
%s\n性别:
%s\n年龄:
%d\n成绩:
%f\n",p->data.num,p->data.name,p->data.sex,p->data.age,p->data.grade);
printf("OK\n");
}
}
voidPriorElem_L(LinklistL,stucur_e)/*用pre_e返回cur_e的前驱*/
{
Linklistp=L;
while(p->next&&(p->next->data).num!
=cur_e.num)
p=p->next;
if(!
p->next)
printf("ERROR\n");
else
{
printf("cur_e的前驱为:
\n");
printf("num:
%d\nname:
%s\nsex:
%s\nage:
%d\ngrade:
%f\n",p->data.num,p->data.name,p->data.sex,p->data.age,p->data.grade);
printf("OK\n");
}
}
voidNextElem_L(LinklistL,stucur_e)/*用next_e返回cur_e的后驱*/
{
Linklistp=L;
while(p&&(p->data).num!
=cur_e.num)
p=p->next;
if(!
p||!
p->next)
printf("ERROR\n");
else
{
printf("cur_e的后驱为:
\n");
printf("num:
%d\nname:
%s\nsex:
%s\nage:
%d\ngrade:
%f\n",p->next->data.num,p->next->data.name,p->next->data.sex,p->next->data.age,p->next->data.grade);
printf("OK\n");
}
}
voidListInsert_L(LinklistL,inti)/*在i位置之前插入新元素*/
{
intj=0;
Linklistp=L,s;
while(p&&j{
p=p->next;
++j;
}
if(!
p||j>i-2)
printf("ERROR\n");
else
{
s=(Linklist)malloc(sizeof(LNode));
printf("请输入要插入的元素的数据:
\n");
printf("学号:
\n");
scanf("%d",&s->data.num);
printf("姓名:
\n");
scanf("%s",&s->data.name);
printf("年龄\n");
scanf("%d",&s->data.age);
printf("性别:
\n");
scanf("%s",&s->data.sex);
printf("成绩:
\n");
scanf("%f",&s->data.grade);
s->next=p->next;
p->next=s;
printf("OK\n");
}
}
voidListDelete_L(LinklistL,inti)/*删除第i个元素*/
{
Linklistp=L,q;
intj=0;
while(p&&j{
p=p->next;
++j;
}
if(!
p->next||j>i-2)
printf("ERROR\n");
else
{
q=p->next;
p->next=q->next;
free(q);
printf("OK\n");
}
}
voidListTraverse_L(LinklistL,intvisit(stu))/*对L中每个元素调用函数visit()*/
{
Linklistp=L->next;
while(p)
{
if(!
visit(p->data))
{
printf("ERROR\n");
break;
break;
}
}
if(!
p)
printf("OK\n");
}
LinklistListCreat_L()/*建立不带头结点的单链表*/
{
LinklistL,p1,p2;
intn=0;
p1=p2=(Linklist)malloc(sizeof(LNode));
printf("请输入学生的数据,学号为零停止\n学号:
\n");
scanf("%d",&p1->data.num);
printf("姓名:
\n");
scanf("%s",&p1->data.name);
printf("年龄\n");
scanf("%d",&p1->data.age);
printf("性别:
\n");
scanf("%s",&p1->data.sex);
printf("成绩:
\n");
scanf("%f",&p1->data.grade);
L=NULL;
while(p1->data.num!
=0)
{
n=n+1;
if(n==1)
L=p1;
else
p2->next=p1;
p2=p1;
p1=(Linklist)malloc(sizeof(LNode));
printf("请输入学生的数据,学号为零停止:
\n学号:
\n");
scanf("%d",&p1->data.num);
printf("姓名:
\n");
scanf("%s",&p1->data.name);
printf("年龄\n");
scanf("%d",&p1->data.age);
printf("性别:
\n");
scanf("%s",&p1->data.sex);
printf("成绩:
\n");
scanf("%f",&p1->data.grade);
}
p2->next=NULL;
returnL;
}
voiddisplay(Linklistp)
{
printf("***************学生信息*****************\n");
printf("学号姓名性别年龄成绩\n");
while(p)
{
printf("%d\t%s\t%s\t%d\t%f\n",p->data.num,p->data.name,p->data.sex,p->data.age,p->data.grade);
p=p->next;
}
printf("****************************************\n");
}
voidmain()
{
LinklistL,Q,p;
printf("首先请先建立一个学生数据单链表再进行其他操作\n");
Q=ListCreat_L();
p=Q;
L=Q;
printf("现在输出建立的表\n");
display(p);
intn;
printf("\n请输入任意键进入菜单........\n");
getchar();
for(;;)
{
printf("***********************菜单******************\n");
printf("1.建立空的单链表\n");
printf("2.建立单链表\n");
printf("3.销毁单链表\n");
printf("4.将单链表置为空表\n");
printf("5.L若为空表返回TRUE,否则返回FLASE\n");
printf("6.返回L中数据元素个数\n");
printf("7.返回L中第i个元素的值\n");
printf("8.返回cur_e的前驱\n");
printf("9.返回cur_e的后驱\n");
printf("10.在i之前插入新元素\n");
printf("11.删除第i个元素\n");
printf("0.结束\n");
printf("***********************************************\n");
printf("请输入你的选择(0~11):
\n");
scanf("%d",&n);
switch(n)
{
case1:
L=InitList_L(L);break;
case2:
{
printf("现在请重新建立单链表\n");
L=ListCreat_L();
printf("现在输出建立的单链表\n");
display(L);
break;
}
case3:
DestroyList_L(L);break;
case4:
ClearList_L(L);break;
case5:
ListEmpty_L(L);break;
case6:
printf("线性表的长度为%d.\n",ListLength_L(Q));break;
case7:
{
inti;
printf("请输入查找的数据位序:
\n");
scanf("%d",&i);
GetElem_L(L,i);
break;
}
case8:
{
stucur_e;
printf("请输入cue_e的学生的学号:
\n");
scanf("%d",&cur_e.num);
PriorElem_L(L,cur_e);
break;
}
case9:
{
stucur_e;
printf("请输入cue_e的学生的学号:
\n");
scanf("%d",&cur_e.num);
NextElem_L(L,cur_e);
break;
}
case10:
{
inti;
printf("请输入插入的位序:
\n");
scanf("%d",&i);
ListInsert_L(L,i);
printf("现在输出插入后的单链表\n");
display(L);
break;
}
case11:
{
inti;
printf("请输入需删除元素的位序:
\n");
scanf("%d",&i);
ListDelete_L(L,i);
printf("现在输出删除后的单链表\n");
display(L);
break;
}
case0:
exit(0);
default:
printf("输入数据有误,请重新输入\n");
}
}
}