#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;
}
用链表实现学生信息系统
最新推荐文章于 2023-03-31 19:46:30 发布