单链表操作.docx
《单链表操作.docx》由会员分享,可在线阅读,更多相关《单链表操作.docx(7页珍藏版)》请在冰豆网上搜索。
单链表操作
一、目的和要求
1.熟悉并掌握单链表的逻辑结构定义、特点。
2.熟悉并掌握单链表描述方法。
3.熟悉并掌握单链表的基本操作,包括单链表的建立,判别表是否为空,求表长,插入与删除数据元素,查找数据元素等。
二、实验内容(以学生成绩信息表为例)
1、LinkListInitList()//生成一个带有头节点的空单链
表
2、LinkListCreat(LinkListM,inti)//链表初始化
3、PrintLNode(LinkListM)//输出链表
4、intpankong(LinkListM)//判断链表是否为空
5、intLENGTH(LinkListM)//求链表的长度
6、LinkListInsertNode(LinkListM,intj)//在链表中插入一个节点
7、intDeleteLNode(LinkListM,into)//删除链表中的某个节点
8、searchLNode(LinkListM,inth)//查找某个同学的成绩
三、源程序
#include
#include
typedefstruct
{
intchengji[3];
intnum;
}students;
typedefstructNode
{
studentsS;
structNode*next;
}LNode,*LinkList;
LinkListInitList()//生成一个带有头节点的空单链表
{
LinkListM;
M=(LNode*)malloc(sizeof(LNode));
M->next=NULL;
returnM;
}
LinkListCreat(LinkListM,inti)//链表初始化
{
intj,l;
LNode*N,*P;
P=M;
for(j=0;j
{N=(LNode*)malloc(sizeof(LNode));
N->next=NULL;
printf("输入第%d个学生的学号:
",j+1);
scanf("%d",&N->S.num);
printf("输入第%d个学生的成绩:
",j+1);
for(l=0;l<3;l++)
scanf("%d",&N->S.chengji[l]);
P->next=N;
P=N;
}
returnM;
}
PrintLNode(LinkListM)//输出链表
{
intj;
LNode*P;
P=M;
printf("全部学生的信息为:
\n");
while(P->next!
=NULL)
{
P=P->next;
printf("%d",P->S.num);
for(j=0;j<3;j++)
printf("%d",P->S.chengji[j]);
printf("\n");
}
}
intpankong(LinkListM)//判断链表是否为空
{
if(M->next==NULL)
{
printf("表为空!
\n");
return0;
}
else
{
printf("表非空!
\n");
return1;
}
}
intLENGTH(LinkListM)//求链表的长度
{
LNode*P;
intlength=0;
P=M;
while(P->next!
=NULL)
{
length++;
P=P->next;
}
returnlength;
}
LinkListInsertNode(LinkListM,intj)//在链表中插入一个节点
{
LNode*P,*Q=M,*N=M;
inti;
P=(LNode*)malloc(sizeof(LNode));
P->S.num=j;
printf("请分别输入您要插入的学生的成绩信息");
for(i=0;i<3;i++)
scanf("%d",&P->S.chengji[i]);
if(Q->next==NULL)
{
Q->next=P;
P->next=NULL;
}
else
{
while(Q->next->S.numS.num&&Q->next!
=NULL)
Q=Q->next;
if(Q->next!
=NULL)
{
P->next=Q->next;
Q->next=P;
}
if(Q->next==NULL)
{
Q->next->next=P;
P->next=NULL;
}
}
returnM;
}
intDeleteLNode(LinkListM,into)//删除链表中的某个节点
{
LNode*Q=M,*P;
if(Q->next==NULL)return0;
else
{
while(Q->next->S.num!
=o&&Q->next!
=NULL)
Q=Q->next;
if(Q->next->S.num==o)
{
P=Q->next;
Q->next=Q->next->next;
return1;
}
if(Q->next==NULL)
return2;
}
}
searchLNode(LinkListM,inth)//查找某个同学的成绩
{
LNode*P=M,*Q;intj;
Q=(LNode*)malloc(sizeof(LNode));
while(P->next->S.num!
=h&&P->next!
=NULL)
P=P->next;
if(P->next!
=NULL)
{
printf("您要查找的学号为%d的学生的成绩为:
",h);
for(j=0;j<3;j++)
printf("%d",P->next->S.chengji[j]);
printf("\n");
}
if(P->next==NULL)
printf("您查找的学生不存在!
");
}
voidmain()
{
LinkListM;
inti,length,k,j,o,l,h;
M=InitList();
printf("输入学生的个数:
");
scanf("%d",&i);
M=Creat(M,i);
k=pankong(M);
if(k)PrintLNode(M);
length=LENGTH(M);
printf("表长为:
%d\n",length);
printf("请输入您要插入的学生的学号:
");
scanf("%d",&j);
M=InsertNode(M,j);
length++;
PrintLNode(M);
printf("请输入您要删除的学生的学号:
");
scanf("%d",&o);
l=DeleteLNode(M,o);
if(l==0)printf("表为空,请确认!
");
if(l==1)
{
printf("删除成功!
");
PrintLNode(M);
}
if(l==2)printf("您要删除的学生不存在,请确认!
");
printf("请输入您要查找的学生的学号:
");
scanf("%d",&h);
searchLNode(M,h);
}