#include <stdio.h>
#include <stdlib.h>
typedef struct Student{
int id;
char name[10];
int score;
}Student;
typedef Student ElemType;
typedef int Status;
typedef struct Lnode{
ElemType data;
struct Lnode *next;//结点类型的指针类型
}Lnode;
typedef Lnode * LinkList;//链表就相当于一个指针,所以是结点类型的指针
Status InsiList(LinkList &L)
{
L = (LinkList)malloc(sizeof(Lnode));
if(!L)
{
return 0;
}
L -> next = NULL;
return 1;
}
//头插法
Status CreatList(LinkList &L,int n)
{
LinkList p;
int i;
L = (LinkList)malloc(sizeof(Lnode));
if(!L)
{
return 0;
}
L -> next = NULL;//先建立一个带头节点的单链表
printf("请输入学生个人基本信息\n");
printf("学号\t姓名\t成绩\n");
for(i = n;i >= 1;i --)
{
p = (LinkList)malloc(sizeof(Lnode));
if(!p)
{
return 0;
}
scanf("%d %s %d",&p -> data.id,p -> data.name,&p -> data.score);
p -> next = L -> next;
L -> next = p;//插入到表头
}
return 1;
}
//在表中插入
Status InsertList(LinkList &L,int i,ElemType e)
{
LinkList p,s;
int j;
p = L;
j = 0;
if(i < 1)
{
printf("超限\n");
return 0;
}
while(p && j < i - 1)
{
p = p -> next;
j ++;
}
if(!p)//i不合法
{
return 0;
}
s = (LinkList)malloc(sizeof(Lnode));
if(!s)
{
printf("插入失败\n");
return 0;
}
s -> data = e;
s -> next = p -> next;
p -> next = s;
return 1;
}
//删除
Status DeteleElem(LinkList &L,int i,ElemType &e)
{
LinkList p,q;
//printf("1\n");
int j;
if(i < 1)
{
printf("系统查无此人\n");
return 0;
}
p = L;
j = 0;
while(p && j < i - 1)
{
p = p -> next;
j ++;
}
if(!p || !(p -> next))
{
return 0;
}
q = p -> next;
p -> next = q -> next;
e = q -> data;
free(q);
return 1;
}
//求表长
Status ListLength(LinkList L)
{
LinkList p;
int j = 0;
p = L -> next;
while(p)
{
p = p -> next;
j ++;
}
return j;
}
//读取
Status GetElem(LinkList L,int i,ElemType &e)
{
LinkList p;
int j;
if(i < 1)
{
printf("系统查无此人\n");
return 0;
}
p = L -> next;
j = 1;
while(p && j < i)
{
p = p -> next;
j ++;
}
if(!p)
{
return 0;
}
e = p -> data;
return 1;
}
int main()
{
LinkList L;
int i;
ElemType e;
int choice;//选择
int people;//人数
int temp;//插入的位置
int t;//删除的位置
if(InsiList(L))
{
printf("链表初始化成功\n");
printf("请输入要录入的学生人数:");
scanf("%d",&people);
if(CreatList(L,people))
{
printf("插入成功\n");
while(1)
{
printf("该系统的功能:\n");
printf("1,插入\n");
printf("2,删除\n");
printf("3,当前状态\n");
printf("请输入你的选择: ");
scanf("%d",&choice);
switch(choice)
{
case 1:
//printf("1");
printf("请输入你要插入的位置:");
scanf("%d",&temp);
printf("请输要插入的元素:\n");
printf("学号\t姓名\t成绩\n");
scanf("%d %s %d",&e.id,e.name,&e.score);
if(InsertList(L,ListLength(L) - temp + 2,e))//因为它是头插法所以先进后出 ,而插入是插在i之前所以还要加1
{
printf("插入成功\n");
}
break;
case 2:
printf("请输入你要删除的位置:");
scanf("%d",&t);
if(DeteleElem(L,ListLength(L) - t + 1,e))//因为它是头插法所以先进后出
{
printf("删除成功\n");
}
break;
case 3:
for(i = 1;i <= ListLength(L);i ++)
{
printf("学号\t姓名\t成绩\n");
if(GetElem(L,ListLength(L) - i + 1,e))
{
printf("查询成功\n");
printf("%d\t%s\t%d\n",e.id,e.name,e.score);
}
}
break;
}
}
}
}
else
{
printf("初始化失败\n");
}
}
用链表操作学生信息
最新推荐文章于 2024-01-08 10:50:57 发布