1、#include #include typedef struct Student/*定义学生类 */int num;char name20;char sex2;int age;float grade;stu;typedef struct LNodestu data;struct LNode *next;LNode,* Linklist;Linklist InitList_L()/*构造一个空的单向链表*/ Linklist L;L=(Linklist)malloc(sizeof(stu);if(!L)printf(“ERRORn“); elseL-next=NULL;printf(“OKn“)
2、;return (L);void DestroyList_L(Linklist L)/*销毁单向链表 */Linklist p;if(!L)printf(“ERRORn“);elsewhile(L)p=L;L=L-next;free(p); printf(“OKn“);void ClearList_L(Linklist L)/*将 L 重置为空表*/Linklist p;if(!L)printf(“ERRORn“);elsewhile(L-next)p=L-next;L-next=p-next;free(p);printf(“OKn“); void ListEmpty_L(Linklist L
3、)/*L 为空表返回 TRUE,否则返回 FALSE*/if(!L)printf(“ERRORn“);elseif(!L-next)printf(“TRUEn“);elseprintf(“FLASEn“); int ListLength_L(Linklist L)/*返回 L 中数据元素个数*/int i=0;Linklist p=L;if(!L)return 0;elsewhile(p-next)i+;p=p-next;return i; void GetElem_L(Linklist L,int i)/*返回第 i 个元素的值 */Linklist p=L-next;int j=1;whi
4、le(p+j;if(!p|ji)printf(“ERRORn“);elseprintf(“第 %d 个学生的数据为:n“,i);printf(“学号:%dn 姓名 :%sn 性别:%sn 年龄:%dn 成绩:%fn“,p-data.num,p-data.name,p-data.sex,p-data.age,p-data.grade);printf(“OKn“);void PriorElem_L(Linklist L,stu cur_e)/*返回 cur_e 的前驱*/ Linklist p=L;while(p-nextif(!p-next|p=L)printf(“ERRORn“);elsepr
5、intf(“cur-e 的前驱的数据为 :n“); printf(“学号:%dn 姓名 :%sn 性别:%sn 年龄:%dn 成绩:%fn“,p-data.num,p-data.name,p-data.sex,p-data.age,p-data.grade);printf(“OKn“); void NextElem_L(Linklist L,stu cur_e)/*用 next_e 返回 cur_e 的后驱*/Linklist p=L-next;while(pif(!p|!p-next)printf(“ERRORn“);elseprintf(“cur-e 的后驱的数据为 :n“); print
6、f(“学号:%dn 姓名 :%sn 性别:%sn 年龄:%dn 成绩:%fn“,p-next-data.num,p-next-data.name,p-next-data.sex,p-next-data.age,p-next-data.grade);printf(“OKn“); void ListInsert_L(Linklist L,int i)/*在 i 位置之前插入新元素 */int j=0;Linklist p=L,s;while(p+j;if(!p|ji-1)printf(“ERRORn“);elses=(Linklist)malloc(sizeof(LNode);printf(“请输
7、入要插入学生元素的数据:n“);printf(“学号:n“);scanf(“%d“, printf(“姓名:n“);scanf(“%s“,printf(“年龄n“);scanf(“%d“,printf(“性别:n“);scanf(“%s“,printf(“成绩:n“);scanf(“%f“,s-next=p-next;p-next=s;printf(“OKn“); void ListDelete_L(Linklist L,int i)/*删除第 i 个元素*/Linklist p=L,q;int j=0;while(p+j;if(!p|jnext;p-next=q-next;printf(“删
8、除的元素为:n“);printf(“学号:%dn 姓名 :%sn 性别:%sn 年龄:%dn 成绩:%fn“,q-data.num,q-data.name,q-data.sex,q-data.age,q-data.grade);free(q);printf(“OKn“); Linklist ListCreat_L(int n)/*建立带头结点的单链表*/Linklist L,s,r;int i;L=(Linklist)malloc(sizeof(LNode);r=L;for(i=0;idata.num); printf(“姓名:n“);scanf(“%s“,printf(“年龄n“);scan
9、f(“%d“,printf(“性别:n“);scanf(“%s“,printf(“成绩:n“);scanf(“%f“, r-next=s;r=s;r-next=NULL;return L;void display(Linklist p)/*信息的输出 */printf(“*学生信息*n“);printf(“ 学号 姓名 性别 年龄 成绩n“);while(p)printf(“%dt%st%st%dt%fn“,p-data.num,p-data.name,p-data.sex,p-data.age,p-data.grade);p=p-next; printf(“*n“);void main()L
10、inklist L,Q,p;int n,i;printf(“首先请先建立一个学生数据单链表再进行其他操作n“);printf(“要输入的学生数n“);scanf(“%d“, Q=ListCreat_L(i);p=Q-next;L=Q; printf(“现在输出建立的表:n“);display(p); printf(“ n 现在请输入任意键进入菜单来进行接下来的操作n“);getchar();for(;)printf(“*菜单*n“);printf(“ 1.建立空的单链表n“);printf(“ 2.建立单链表n“);printf(“ 3.销毁单链表n“);printf(“ 4.将单链表置为空表
11、n“);printf(“ 5.L 若为空表返回 TRUE ,否则返回 FLASEn“);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(“ 请输入你的选择(011):n“);scanf(“%d“,switch(n) case 1:L=InitL
12、ist_L();printf(“ 现在输出新建的空表:n“);display(L-next); break;case 2:printf(“ 现在重新建立一个单链表n“); int i;printf(“ 请输入学生人数:n“);scanf(“%d“,L=ListCreat_L(i);printf(“ 现在输出建立的单链表n“);display(L-next);break; case 3:DestroyList_L(L);break;case 4:ClearList_L(L);printf(“ 清空后为:n“);display(L-next); break;case 5:ListEmpty_L(L
13、);break;case 6:printf(“ 线性表的长度为%d.n“,ListLength_L(L);break;case 7:int i;printf(“ 请输入查找的数据位序:n“);scanf(“%d“,GetElem_L(L,i);break;case 8:stu cur_e;printf(“ 请输入学生 cue_e 的学号:n“);scanf(“%d“,PriorElem_L(L,cur_e);break;case 9:stu cur_e;printf(“ 请输入学生 cue_e 的学号:n“);scanf(“%d“,NextElem_L(L,cur_e);break;case 10:int i;printf(“ 请输入插入的位序:n“);scanf(“%d“,ListInsert_L(L,i);printf(“现在输出在第%d 个元素插入元素后的单链表:n“,i);display(L-next); break;case 11:int i;printf(“ 请输入需删除元素的位序:n“);scanf(“%d“,ListDelete_L(L,i);printf(“现在输出删除第%d 个元素后的单链表:n“,i);display(L-next); break;case 0:exit(0);