#include<stdio.h> #include<string.h> typedef struct student { int num; char name[10]; float score[3]; }DataType; typedef struct LNode { DataType data; struct LNode *next; }LNode,*LinkList; //建立带头链表-头插法 1 LNode* Creat_LinkList1() { LinkList L;//创建链表 LNode *p;//p作为待插入节点 int flag=0; printf("请输入这五名学生的学号、姓名和三科成绩:\n"); L->next=NULL; while(flag!=5) { flag++; p=new LNode; scanf("%d %s %f %f %f",&p->data.num,p->data.name,&p->data.score[0],&p->data.score[1],&p->data.score[2]); p->next=L->next; L->next=p; } return L; } //建立带头链表-尾插法 1 LNode* Creat_LinkList2() { LinkList L=new LNode;//创建链表 LNode *s,*p;//p作为待插入节点,s作为尾结点 int flag=0; printf("请输入这五名学生的学号、姓名和三科成绩:\n"); L->next=NULL; s=L; while(flag!=2) { flag++; p=new LNode; scanf("%d %s %f %f %f",&p->data.num,p->data.name,&p->data.score[0],&p->data.score[1],&p->data.score[2]); s->next=p; s=p; } s->next=NULL; return L; } //求链表的长度 1 int Length_LinkList(LinkList L) { LNode *p; p=L; int len=0; while(p->next) { p=p->next; len++; } return len; } //按序号查找 1 LNode* Get_LinkList(LinkList L,int i) { LNode *p; int num=0; p=L; while((p->next)&& num<i) { p=p->next; num++; } return p; } //按值查找 1 LNode* Locate_LinkList(LinkList L,DataType x) { LNode *p; p=L; while(p->next&&p->data.num!=x.num&&p->data.name!=x.name) p=p->next; return p; } //插入元素 1 int Insert_LinkList(LinkList L,int i,DataType x) { LNode *p,*s;//s是待插入的结点 p=Get_LinkList(L,i-1);//查找第i个元素的前驱 if(p==NULL) return 0;//第i-1个结点不存在 else { s=new LNode; s->data=x; s->next=p->next; p->next=s; return 1; } } //删除元素 1 int Delete_LinkList(LinkList L,int i) { LNode *p,*s; p=Get_LinkList(L,i-1); if(p==NULL) return -1; else { if(p->next==NULL) return 0; else { s=p->next; p->next=s->next;//逻辑上删除 delete s;//物理上删除 return 1; } } } //链表倒置 1 void Reverse_LinkList(LinkList L) { LNode *p,*q; p=L->next; L->next=NULL; while(p) { q=p; p=p->next; q->next=L->next; L->next=q; } } //删除链表中的重复结点 1 void Pur_LinkList(LinkList L) { LNode *p,*q,*r; p=L->next; while(p) { q=p; while(q->next) { if(p->data.num==q->next->data.num&&p->data.name==q->data.name) { r=q->next; q->next=r->next; delete r; } else q=q->next; } p=p->next; } } //显示链表中的所有信息及所有的学生信息 1 void Print_LinkList(LinkList L) { printf("学号 姓名 A科成绩 B科成绩 C科成绩\n"); LNode *p; p=L->next; while(p) { printf("%d %7s %8.2f %9.2f %9.2f\n",p->data.num,p->data.name,p->data.score[0],p->data.score[1],p->data.score[2]); p=p->next; } } //显示链表中结点的信息及某同学的信息 1 void Print_LNode(LNode *p) { printf("%d %7s %8.2f %9.2f %9.2f\n",p->data.num,p->data.name,p->data.score[0],p->data.score[1],p->data.score[2]); } int main() { LinkList L; L=Creat_LinkList1(); Print_LinkList(L); int flag; printf("请输入你需要进行的操作:\n"); printf("1.统计学生总数\n"); printf("2.通过位置查找学生信息\n"); printf("3.通过学生学号和姓名查找学生信息\n"); printf("4.插入学生信息\n"); printf("5.删除学生信息\n"); printf("6.逆序学生信息\n"); printf("7.删除重复的学生信息\n"); scanf("%d",&flag); if(flag==1) { printf("链表中存储了%d个学生的信息。\n",Length_LinkList(L)); } if(flag==2) { printf("请输入你想查找学生信息的位置:\n"); int site; scanf("%d",&site); LNode *p; p=Get_LinkList(L,site); if(p==NULL) printf("没有找到该学生的信息!"); else { printf("第%d位同学的学号、姓名及各课成绩为:\n",site); Print_LNode(p); } } if(flag==3) { LNode *p; DataType d1; printf("请输入学生的学号和姓名:\n"); scanf("%d %s",&d1.num,d1.name); p=Locate_LinkList(L,d1); if(p==NULL) printf("没有找到该学生的信息!"); else { printf("这位同学的学号、姓名及各课成绩为:\n"); Print_LNode(p); } } if(flag==4) { DataType d2; int location,flag1=0; printf("请输入你要插入的学生的位置和信息:\n"); scanf("%d %d %s %f %f %f",&location,&d2.num,d2.name,&d2.score[0],&d2.score[1],&d2.score[2]); //flag1=Insert_LinkList(L,location,d2); if(flag1==0) printf("插入位置不合法!"); else printf("插入成功!"); Print_LinkList(L); } if(flag==5) { int flag2,site1; printf("请输入你想删除学生信息的位置:\n"); scanf("%d",&site1); flag2=Delete_LinkList(L,site1); if(flag2==-1||flag2==0) printf("删除的位置不合法。\n"); else printf("删除成功!\n"); Print_LinkList(L); } if(flag==6) { Reverse_LinkList(L); Print_LinkList(L); } if(flag==7) { Pur_LinkList(L); Print_LinkList(L); } return 0; }
用链表实现学生信息系统
猜你喜欢
转载自blog.csdn.net/Gloming__zxy/article/details/80040875
今日推荐
周排行