综合编程题
有没有大神能给一个编程啊,就是综合数组、循环、指针、调用函数的那种,谢谢了

#include<stdio.h> #include<stdlib.h> #define LEN sizeof(struct Studnet) void creat(); void print(); void Insert(); void Del(); void Menu(); struct Studnet { int num; int score; struct Studnet *next; }*head=NULL,*Mark_head; int n=0; void Menu() { printf("菜单:\n输入1创建/加长链表\n"); printf("输入2插入链表\n"); printf("输入3删除链表\n"); printf("输入4输出链表\n"); printf("输入0退出\n"); } void creat() { struct Studnet *p1,*p2; if (n==0) { printf("请输入学生的成绩和学号(按0退出)\n"); Mark_head=p1=p2=(struct Studnet *)malloc(LEN); head=p1; printf("%d--",n+1); scanf("%d%d",&p1->num,&p1->score); } else { p1=head; while (p1->next) p1=p1->next;//这个循环构造是把结构体指针p1移向尾部 p2=p1; n--; } while (p1->num) { n++; p2->next=p1; p2=p1; p1=(struct Studnet *)malloc(LEN); printf("%d--",n+1); scanf("%d%d",&p1->num,&p1->score); } p2->next=NULL; } void print() { struct Studnet *p=head; int i=1; if (n==0) { printf("该表为空表,返回菜单\n"); return; } while (p) { printf("%d--",i++); printf("%4d %4d\n",p->num,p->score); p=p->next; } printf("\n"); } void Insert()//插入链表 { int point,i; struct Studnet *p1=head; struct Studnet *p2,*pt=NULL; if (n==0) { printf("该表为空表\n"); return; } while (n) { i=1; p1=p2=head; //初始化 printf("插入节点:请输入学生的学号和成绩(学号输入0返回菜单,输入-1查询链表情况)\n"); p2=(struct Studnet *)malloc(LEN); printf("%d--",n+1); if (scanf("%d%d",&p2->num,&p2->score)&&p2->num==0) return; else if (p2->num==-1) { printf("链表数据如下:\n"); print(); printf("\n请重新输入数据(学号输入0返回菜单)\n"); printf("%d--",n+1); if (scanf("%d%d",&p2->num,&p2->score)&&p2->num==0) return; } printf("请选择你要插入的节点位置(现在共有%d个节点,按0返回菜单)\n",n); while (scanf("%d",&point)&&(point>n||point<1)&&point!=0) printf("找不到该节点\n"); if (point==0) return; while (1) { if (point==1)//插入节点在头部 { p2->next=p1; head=p2; Mark_head=p2; n++; printf("插入成功\n"); break; } else if (point==n)//插入节点在尾部 { while (p1->next) p1=p1->next; p1->next=p2; p2->next=NULL; n++; printf("插入成功\n"); break; } if (point!=i+1) { p1=p1->next; i++; } else //插入节点在中间 { pt=p1->next; p1->next=p2; p2->next=pt; n++; printf("插入成功\n"); break; } } } printf("该表为空表\n"); } void Del()//删除节点 { struct Studnet *p1,*p2,*pt; int point,i; if (n==0) { printf("该表为空表\n"); return; } while (1) { i=1; p1=p2=head;//初始化 printf("请选择要删除的节点(现在共有%d个节点,按0返回菜单,按-1输出链表)\n",n); while (scanf("%d",&point)&&(point<0||point>n)&&point!=0) { if (point==-1) { print(); Del(); } if (n==0) return; printf("找不到该节点\n"); } if (point==0) return; while (1) { if (point==1&&n!=1)//删除节点在头部 { head=head->next; p1=head; free(Mark_head); Mark_head=p1; n--; printf("已成功删除节点\n"); break; } if (point==n&&n!=1)//删除节点在尾部 { while (p1->next) { p2=p1; p1=p1->next; } free(p1); p2->next=NULL; printf("已成功删除节点\n"); n--; break; } if (n==1)//当链表只有一个节点的时候 { free(Mark_head); n--; printf("已成功删除节点--现在链表为空表\n"); return; } if (point!=i)//删除节点在中间 { if (i!=1) p2=p2->next; p1=p1->next; i++; } else //找到删除的节点 { pt=p2->next; p1=p1->next; p2->next=p1; free(pt); n--; printf("已成功删除节点\n"); break; } } } } int main() { short choice; Menu(); while (scanf("%d",&choice)&&choice) { fflush(stdin); system("cls"); switch (choice) { case 1:creat();break; case 2:Insert();break; case 3:Del();break; case 4:print();break; } if (choice) Menu(); } return 0; }