开始声明两个结构体指针变量head, lnew 和长整的del_num开始for 循环for(;;)swich(menubar())menubar()=0?menubar()=1?menubar()=2?menubar()=3?menubar()=4?退出执行creat()函数break;执行打印print()函数break;请输入要插入的结点的信息,先输入学号输入你想删除的结点的学号如果输入的学号lnew->num!=0输入的学号进行判断del_num!=0break;开始while 循环lnew->num!=0break;再输入电话,地址,邮编执行del()函数head=del(head,del_num);执行insert()函数head=insert(head,lnew);判断输入的学号lnew->num!=0再输入电话、地址、邮编NYYNNNNYYYYN YNYNYN输出“谢谢您使用”并先执行getch()函数再执行exit(0)函数退出for循环结束NY主函数main()的流程图开始1=> n 并开辟一个长度为LEN 的内存空间并输入第一位同学的学号对刚输入的学号进行判断p1->num!=0head 进行初始化NULL=>head;再输入此同学的电话、地址、邮编开始while 循环p1->num!=0?p2->next=NULL;return head;n=n+1;n==1p2->next=p1;p2=p1;判断下一个输入的学号p1->num!=0?再输入电话、地址、邮编head=p1;开始输出结点个数head=>p判断链表是否为空head!=NULL?打印“此链表为空表”先打印标题学号、电话、地址、邮编p!=NULL为循环所要满足的条件?打印表的格式 即加横线—— 竖线 ||使输出的链表更加清晰打印结点里面的信息即学号、电话、地址、邮编YNYNYNYNYNNY结束结束creat()函数流程图print()函数流程图开始声明两个结构休指针变量p1,p2;head!=NULL?p 1=head ;num!=p1->num&&p1->next!=NULL?输出“链表是空的!”r eturn head;num==p1->num?返回头指针r eturn head;p2=p1;p1=p1->next;输出”num not beenfound!”p1==head ?输出 “删除:num ”p2->next=p1->next;结束YNYNYNYNhead=p1->next;函数传递过来的值:头指针head 和要删除的学号num 声明三个结构体指针变量p0,p1,p2p0=lnew;p1=headhead==NULL?结点数加1 n=n+1;返回头指针return head;head=p0;p0->next=NULL;p0->num>p1->num&&p1->next!=NULLp0->num <=p1->num ?p2=p1;p1->next=p0;p0->next=NULL;head==p1?p0->next=p1;p2->next=p0;函数传递过来的值有:链表头指针head 和要插入的结点的指针lnewYNNYYNYhead=p0;N开始结束del()函数流程图insert()函数流程图开始声明两个整型变量c 和flag;flagc<0 || c>4返回C 的值r eturn c;n==0 && c!=0 &&c!=4flag=0;输入“请输入0~4之间的数”输出“在建立链表之前请先输入0建立链表”NYNYYN结束menubar()函数流程图程序代码#include<stdio.h>#include<malloc.h>#define NULL 0#define LEN sizeof(struct student)#include<conio.h>#include<string.h>#include<stdlib.h>struct student{ long jsh;float xuefen;char name[30];int zongfen;struct student *next;};int n; /* n 为全局变量,用于统计结点的个数*//*―――――————――————-―――creat函数――――――————――――――――*/struct student *creat() /* 创建creat函数用于建立链表*/ {struct student *head;struct student *p1,*p2;n=0;p2=(struct student *)malloc(LEN); /* 开辟一个大小为LEN的内存单元*/p1=p2;printf("请输入教师号:");scanf("%ld",&p1->jsh); /* 输入jsh-教师号*/if(p1->jsh!=0){ printf("请输入课程名:");scanf("%s",p1->name); /* 输入课程名*/printf("请输入学分:");scanf("%f",&p1->xuefen); /* 输入学分*/printf("请输入总分:");scanf("%d",&p1->zongfen); /*输入总分*/printf("ok! 请输入下一个结点的信息(以教师号为0结束)\n");/* 提示已经输好了一位同学的信息*/}head=NULL;while(p1->jsh!=0) /* 如果输入的教师号不是0,则继续输入其他课程的信息*/{n=n+1;if(n==1)head=p1;elsep2->next=p1;p2=p1;p1=(struct student *)malloc(LEN);printf("请输入教师号:");scanf("%ld",&p1->jsh);if(p1->jsh!=0){printf("请输入课程名:");scanf("%s",p1->name);printf("请输入学分:");scanf("%f",&p1->xuefen);printf("请输入总分:");scanf("%d",&p1->zongfen);printf("ok! 请输入下一个结点的信息(以教师号为0结束)\n");}}p2->next=NULL;return head; /* 结束creat函数*/}/*―――――――---――――-―――print函数――――――----――――――――*/void print(struct student *head) /* 开始打印函数*/{struct student *p;printf("\n Now,These %d records are:\n",n);p=head;if(head!=NULL) /* 如果链表不是空,则打印每个结点信息*/{printf("---------|----------------|--------|-------\n");printf("教师号|课程名|学分|总分\n");do{printf("---------|----------------|--------|-------\n");printf("%-9ld|%-16s|%-8.0f|%-8d\n",p->jsh,p->name,p->xuefen,p ->zongfen);p=p->next;}while(p!=NULL);printf("---------|----------------|--------|-------\n");}else printf("链表是空的!\n"); /* 如果链表是空表,刚提示这个链表是空表*/} /* 结束print函数*//*―――――――---――――---―――del函数――――――-----――――――――*/struct student *del(struct student *head,long jsh) /* 开始创建del函数,用于删除结束*/{struct student *p1,*p2;if(head==NULL){printf("\n链表是空的!\n");return head;} /* 用于检查链表是否为空,如果为空,刚提示这个链表为空表*/p1=head;while(jsh!=p1->jsh && p1->next!=NULL){p2=p1;p1=p1->next;}if(jsh==p1->jsh) /* 找到对应的结点*/{if(p1==head) head=p1->next;else p2->next=p1->next;printf("删除:%ld\n",jsh);n=n-1;}else printf("0%ld 没有找到!\n",jsh); /* 没有打到对应的结点,则提示没有找到*/return head;}/*―――――――---――――-―――insert函数――――――----――――――――*/struct student *insert(struct student *head,struct student *lnew) /* 创建insert函数,用于插入结点,返回值为一个指针*/{struct student *p0,*p1,*p2;p1=head;p0=lnew;if(head==NULL){head=p0;} /* 结果链表为空表,刚把插入的结点指针给头指针,结点的next为空*/else{while((p0->jsh>p1->jsh) && (p1->next!=NULL)) /* 寻找该插入的位置*/{p2=p1;p1=p1->next;}if(p0->jsh<=p1->jsh) /* 找到了该插入的位置*/{if(head==p1)head=p0; /* 放在最前面*/elsep2->next=p0;/* 结点插到p1,p2之间*/p0->next=p1;}else {p0->next=NULL;} /* 结点插到最后*/ }n=n+1;return head;/* 结点数加*/}/* 结束insert函数的建立*//*―――――――---――――-―――menubar函数――――――----――――――――*/int menubar()/*创建菜单函数*/{int flag=1;/*用来做记号*/int c;printf("\n\n**************王芬的成绩表***************\n");printf(" ----学号:109074337\n");/*用来存储使用者选择的菜单代号*/printf("\n************** 链表综合处理***************\n");printf("1:创建链表----\n");printf("2:输出链表\n");printf("3:插入结点菜单\n");printf("4:删除结点\n");printf("0:退出----\n");printf("*************************************************") ;printf("\n请根据你想执行的命令,输入您的选择:(0~4):");scanf("%d",&c);/*接收使用都所输入的代号*/while(flag) /*flag用来标记,如果为链表为空,或者使用者第一次输入的不是0或者不是4,则需要重新输入*/{if(n==0&&c!=1&&c!=0){printf("在建立链表之前请先输入建立链表\n");printf("\n请输入您的选择:(0~4):");scanf("%d",&c);flag=1;}else flag=0 ;}while( c<0 || c>4 ) /*表示链表已经创建,但输入的不能大于4,或者小于0*/{printf("\n请输入您的选择:(0~4):");scanf("%d",&c);}return c; /*返回c的值*/}/*―――――――---――――-―――main函数――――――----――――――――*/main() /*开始主函数*/{ struct student *head,*lnew;long del_jsh;for(;;) /*开始for循环*/{switch (menubar()){case 1:printf("请输入创建的链表的结点的信息:\n");head=creat();break;case 2:print(head);break;case 3:printf("\n请输入要插入的结点的信息(以教师号为0结束):\n");lnew=(struct student *)malloc(LEN);printf("请输入教师号:");scanf("%ld",&lnew->jsh);if(lnew->jsh!=0){printf("请输入课程名:");scanf("%s",lnew->name);printf("请输入学分:");scanf("%f",&lnew->xuefen);printf("请输入总分:");scanf("%d",&lnew->zongfen);}while(lnew->jsh!=0){head=insert(head,lnew);print(head);printf("请输入下一个要插入的结点的信息(以教师号为0结束):\n");lnew=(struct student *)malloc(LEN);printf("请输入教师号:");scanf("%ld",&lnew->jsh);if(lnew->jsh!=0){printf("请输入课程名:");scanf("%s",lnew->name);printf("请输入学分");scanf("%f",&lnew->xuefen);printf("请输入总分:");scanf("%d",&lnew->zongfen);printf("ok! 请输入下一个要插入的结点的信息(如果xiNg 退出,输入教师号为0,就结束)\n");}}break;case 4:printf("\n请输入你想删除的结点的教师号:");scanf("%ld",&del_jsh);while(del_jsh!=0){head=del(head,del_jsh);print(head);printf("\n请输入你想删除的结点的教师号:");scanf("%ld",&del_jsh);}break;case 0:system("CLS");printf("\n\t\t谢谢您的使用\n\n\n\n");getch();exit(0); /*退出for循环*/ }}}测试的具体步骤步骤一、创建链表步骤二、输出链表步骤三、插入节点步骤四、删除节点步骤五、退出。