要求实现功能:
1.头插学生
2.尾插学生
3.任意位置插入学生
4.输出所有学生
5.任意位置删除学生
6.按位置查找学生
7.修改学生
8.尾删学生
9.按学号查找学生
10.按学号查找学生返回
11.逆序
12.按学号排序
13.对重复学生去重
Link.h部分
#ifndef LINK_H_ #define LINK_H_ #include <myhead.h> typedef struct { int id; char name[20]; int age; }Stu,*Pstu; typedef struct listNode { union { int len; Stu s; }; struct listNode *next; }Link,*Plink; Plink create_link(); int input_stu_front(Plink); int output_all_stu(Plink); int input_stu_rear(Plink); int input_stu_anypos(Plink); int delete_stu(Plink); int find_stu(Plink); int change_stu(Plink); int delete_rear(Plink); int find_dele_id(Plink); Plink find_id_stu(Plink); int re(Plink); int sort_link(Plink); int node_dele(Plink,Plink); int de_repeat(Plink); int free_link(Plink); #endif
Link.c部分
#include "Link.h" Plink create_link() { Plink p=malloc(sizeof(Link)); if(NULL==p) { printf("创建失败\n"); return NULL; } printf("创建成功\n"); p->len=0; p->next=NULL; return p; } int input_stu_front(Plink L) { if(NULL==L) { printf("单链表不存在\n"); return -1; } Plink p=create_link(); printf("请输入学生学号:"); scanf("%d",&p->s.id); printf("请输入学生姓名:"); scanf("%s",p->s.name); printf("请输入学生年龄:"); scanf("%d",&p->s.age); p->next=L->next; L->next=p; L->len++; return -1; } int input_stu_rear(Plink L) { if(NULL==L) { printf("单链表不存在\n"); return -1; } Plink p=create_link(); printf("请输入学生学号:"); scanf("%d",&p->s.id); printf("请输入学生姓名:"); scanf("%s",p->s.name); printf("请输入学生年龄:"); scanf("%d",&p->s.age); Plink t=L; for(int i=0;i<L->len;i++) { t=t->next; } t->next=p; p->next=NULL; L->len++; return 0; } int input_stu_anypos(Plink L) { int pos; printf("请输入要插入的位置:"); scanf("%d",&pos); if(pos<1||pos>L->len+1||NULL==L) { printf("插入失败\n"); return -1; } Plink p=create_link(); printf("请输入学生学号:"); scanf("%d",&p->s.id); printf("请输入学生姓名:"); scanf("%s",p->s.name); printf("请输入学生年龄:"); scanf("%d",&p->s.age); Plink t=L; for(int i=0;i<pos-1;i++) { t=t->next; } p->next=t->next; t->next=p; L->len++; return 0; } int output_all_stu(Plink L) { if(NULL==L) { printf("单链表不存在\n"); return -1; } Plink t=L; for(int i=0;i<L->len;i++) { t=t->next; printf("学号:%d 姓名:%s 年龄:%d\n",t->s.id,t->s.name,t->s.age); } return 0; } int delete_stu(Plink L) { int pos; printf("请输入要删除的位置:"); scanf("%d",&pos); if(NULL==L||pos<1||pos>L->len+1) { printf("单链表不存在\n"); return -1; } Plink t=L; for(int i=0;i<pos-1;i++) { t=t->next; } Plink Q=t->next; t->next=t->next->next; L->len--; printf("删除成功\n"); free(Q); Q=NULL; return 0; } int find_stu(Plink L) { int pos; printf("请输入需要查找的位置:"); scanf("%d",&pos); if(pos<1||pos>L->len||NULL==L) { printf("查找失败\n"); return -1; } Plink t=L; for(int i=0;i<pos;i++) { t=t->next; } printf("学号:%d 姓名:%s 年龄:%d\n",t->s.id,t->s.name,t->s.age); return 0; } int change_stu(Plink L) { int pos; printf("请输入需要修改的位置:"); scanf("%d",&pos); if(pos<1||pos>L->len||NULL==L) { printf("查找失败\n"); return -1; } Plink t=L; for(int i=0;i<pos;i++) { t=t->next; } printf("请修改学生学号:"); scanf("%d",&t->s.id); printf("请修改学生姓名:"); scanf("%s",t->s.name); printf("请修改学生年龄:"); scanf("%d",&t->s.age); return 0; } int delete_rear(Plink L) { if(NULL==L) { printf("单链表不存在\n"); return -1; } Plink t=L; for(int i=0;i<L->len-1;i++) { t=t->next; } Plink Q=t->next; t->next=t->next->next; L->len--; printf("删除成功\n"); free(Q); Q=NULL; return 0; } int find_dele_id(Plink L) { if(NULL==L) { printf("删除失败\n"); } int key; printf("请输入要删除的id:"); scanf("%d",&key); int flag=0; Plink t=L; for(int i=0;i<L->len;i++) { if(key==t->next->s.id) { flag=1; break; } t=t->next; } if(flag==0) { printf("未找到该学生删除失败\n"); }else { Plink Q=t->next; t->next=t->next->next; L->len--; free(Q); Q=NULL; printf("删除成功\n"); } return 0; } Plink find_id_stu(Plink L) { int key; printf("请输入要查找的学生学号:"); scanf("%d",&key); Plink t=L; if(NULL==L) { printf("单链表不存在\n"); return NULL; } for(int i=0;i<=L->len;i++) { t=t->next; if(key==t->s.id) { printf("查找成功\n"); printf("学号:%d 姓名:%s 年龄:%d\n",t->s.id,t->s.name,t->s.age); return t; } } return NULL; } int re(Plink L) { Plink Q,t; Q=L->next; t=Q->next; while(NULL!=t) { Q->next=t->next; t->next=L->next; L->next=t; t=Q->next; } return 0; } int sort_link(Plink L) { Plink j; Stu t; for(int i=1;i<L->len;i++) { for(Plink j=L->next;j->next!=NULL;j=j->next) { if(j->s.id<j->next->s.id) { t=j->s; j->s=j->next->s; j->next->s=t; } } } return 0; } int node_dele(Plink L,Plink j) { Plink Q=j->next; j->next=j->next->next; L->len--; free(Q); Q=NULL; return 0; } int de_repeat(Plink L) { for(Plink i=L;i->next!=NULL;i=i->next) { Plink j=i->next; while(j->next!=NULL) { if(i->next->s.id==j->next->s.id) { node_dele(L,j); }else { j=j->next; } } } } int free_link(Plink L) { if(NULL==L) { printf("单链表为空,释放失败\n"); return -1; } Plink t=L; while(t!=NULL) { t=t->next; free(L); L=t; } printf("释放成功\n"); return 0; }
main.c部分
#include "Link.h" int main(int argc, const char *argv[]) { Plink L=create_link();//创建头链表 int order; while(1) { printf("\t\t学生管理系统\n"); printf("\t\t1.输入学生信息,头插法\n"); printf("\t\t2.输入学生信息,尾差法\n"); printf("\t\t3.任意位置插入一位学生信息\n"); printf("\t\t4.输出所有学生信息\n"); printf("\t\t5.任意位置删除一位学生信息\n"); printf("\t\t6.查找学生信息\n"); printf("\t\t7.修改学生信息\n"); printf("\t\t8.尾删学生信息\n"); printf("\t\t9.按学号删除学生\n"); printf("\t\t10.查学号返回地址\n"); printf("\t\t11.逆序学生\n"); printf("\t\t12.按学号排序\n"); printf("\t\t13.对重复学生去重\n"); printf("\t\t14.退出系统\n"); printf("\t\t请输入您要执行的操作:"); scanf("%d",&order); switch(order) { case 1: input_stu_front(L); break; case 2: input_stu_rear(L); break; case 3: input_stu_anypos(L); break; case 4: output_all_stu(L); break; case 5: delete_stu(L); break; case 6: find_stu(L); break; case 7: change_stu(L); break; case 8: delete_rear(L); break; case 9: find_dele_id(L); break; case 10: find_id_stu(L); break; case 11: re(L); break; case 12: sort_link(L); break; case 13: de_repeat(L); break; case 14: free_link(L); return 0; default: free_link(L); return 0; } } return 0; }