数据结构实验5单链表配套代码.docx
《数据结构实验5单链表配套代码.docx》由会员分享,可在线阅读,更多相关《数据结构实验5单链表配套代码.docx(20页珍藏版)》请在冰点文库上搜索。
数据结构实验5单链表配套代码
数据结构实验5配套代码
1、
#include
#include
#include
#defineOK1
#defineERROR0
#defineOVERFLOW-2
#defineMAXSIZE100
#defineNULL0
typedefintStatus;
typedefintElemType;
typedefstructLNode
{
ElemTypedata;//数据域
structLNode*next;//指针域
}LNode,*LinkList;//*LinkList为Lnode类型的指针
intmain()
{
LNode*La=NULL;
charchoice1,choice2,choice3;//菜单选项
ElemTypeb[MAXSIZE],b1[MAXSIZE],x,z;
inti,num,num1,n,m,e,y;
StatusInitList_L(LinkList&L);
voidCreateList_L(LinkList&L,ElemTypea[],intn);
StatusDispList_L(LinkListL);
intListEmpty(LinkListL);
StatusGetElem_L(LinkListL,inti,ElemType&e);
intLocateELem_L(LinkListL,ElemTypee);
StatusListInsert_L(LinkList&L,inti,ElemTypee);
StatusListDelete_L(LinkList&L,inti,ElemType&e);
intListLength_L(LinkListL);
StatusClearList(LinkList&L);
StatusDestroyList_L(LinkList&L);
InitList_L(La);
printf("线性表中元素的个数?
\n");
scanf("%d",&num);
printf("请输入元素:
\n");
for(i=0;iscanf("%d",&b[i]);
CreateList_L(La,b,num);
do
{
printf("\t单链表操作\n");
printf("P-输出\t\tG-取值\n");
printf("S-查找\t\tI-插入\n");
printf("D-删除\t\tC-清空\n");
printf("L-求表长\tQ-退出\n");
scanf("%c",&choice1);
choice1=toupper(choice1);//将字符choice转换为大写英文字母
switch(choice1)
{
case'P':
printf("线性表中的元素为:
\n");
DispList_L(La);
break;
case'G':
printf("要查找第几个元素?
\n");
scanf("%d",&n);
m=GetElem_L(La,n,e);
if(!
m)
printf("要查找的元素位置不合法!
\n");
else
printf("要查找的第%d个元素是:
%d\n",n,e);
break;
case'S':
printf("要查找的元素的值为:
\n");
scanf("%d",&x);
m=LocateELem_L(La,x);
if(!
m)
printf("线性表中不存在该元素!
\n");
else
printf("%d是本表中的第%d个元素。
\n",x,m);
break;
case'I':
printf("在第几个元素前面插入?
\n");
scanf("%d",&y);
printf("插入的值为:
\n");
scanf("%d",&z);
m=ListInsert_L(La,y,z);
if(!
m)
printf("插入元素失败!
\n");
else
{
printf("在第%d个元素前面插入%d后的线性表为:
\n",y,z);
DispList_L(La);
}
break;
case'D':
printf("要删除第几个元素?
\n");
scanf("%d",&y);
m=ListDelete_L(La,y,e);
if(!
m)
printf("删除元素失败!
\n");
else
{
printf("删除掉第%d个元素后的线性表为:
\n",y);
DispList_L(La);
}
break;
case'L':
printf("线性表的长度为:
%d\n",ListLength_L(La));
break;
case'C':
printf("确定要清空线性表吗?
\n");
scanf("%c",&choice2);
choice2=toupper(choice2);
if(choice2=='Y')
{
ClearList(La);
printf("需要重新创建线性表吗?
\n");
scanf("%c",&choice3);
choice3=toupper(choice3);
if(choice3=='Y')
{
printf("线性表中元素的个数?
\n");
scanf("%d",&num1);
printf("请输入元素:
\n");
for(i=0;iscanf("%d",&b1[i]);
CreateList_L(La,b1,num1);
printf("新创建的线性表为:
\n",y);
DispList_L(La);
}
}
break;
case'Q':
DestroyList_L(La);
printf("再见!
\n");
break;
default:
printf("不正确的选项!
\a");
}
printf("\n");
}
while(choice1!
='Q');
return0;
}
StatusInitList_L(LinkList&L)
{
L=newLNode;//创建头结点
L->next=NULL;//置头结点的指针域为空
returnOK;
}
voidCreateList_L(LinkList&L,ElemTypea[],intn)
//正位序输入n个元素的值,建立带表头结点的单链表L
{
LinkListp,r;
inti;
r=L;//r总是指向当前尾结点,初始时r指向头结点
for(i=0;i{
p=newLNode;
p->data=a[i];//输入元素值
p->next=NULL;
r->next=p;//插入到表尾
r=p;//r指向新的尾结点
}
r->next=NULL;
}
intListEmpty(LinkListL)//若L为空表,则返回1,否则返回0
{
if(L->next)//L->next不为0,即非空
return0;
else
return1;
}
StatusDispList_L(LinkListL)
{
LinkListp;
if(ListEmpty(L))
returnERROR;
else
{
p=L->next;
while(p)//p不空则继续输出
{
printf("%d",p->data);
p=p->next;
}
printf("\n");
}
}
StatusGetElem_L(LinkListL,inti,ElemType&e)
{
LinkListp;
intj=1;
p=L->next;//初始化
while(p&&j
{//向后扫描,直到p指向第i个元素或p为空
p=p->next;
++j;
}
if(!
p||j>i)
returnERROR;//第i个元素不存在
e=p->data;//取第i个元素
returnOK;
}
intLocateELem_L(LinkListL,ElemTypee)
//返回L中值为e的数据元素的位置序号,查找失败返回0
{
LinkListp;
intj=1;
p=L->next;
while(p&&p->data!
=e)
{
p=p->next;
j++;
}
if(p)
returnj;
else
return0;
}
StatusListInsert_L(LinkList&L,inti,ElemTypee)
{
LinkListp,s;
intj=0;
p=L;
while(p&&j{
p=p->next;
++j;
}//寻找第i-1个结点
if(!
p||j>i-1)
returnERROR;//i大于表长+1或者小于1
s=newLNode;//生成新结点s
s->data=e;//将结点s的数据域置为e
s->next=p->next;//将结点s插入L中
p->next=s;
returnOK;
}
StatusListDelete_L(LinkList&L,inti,ElemType&e)
{
LinkListp,q;
intj=0;
p=L;
while(p->next&&j{//寻找第i个结点,并令p指向其前驱
p=p->next;
++j;
}
if(!
(p->next)||j>i-1)
returnERROR;//删除位置不合理
q=p->next;//临时保存被删结点的地址以备释放
p->next=q->next;//改变删除结点前驱结点的指针域
e=q->data;//保存删除结点的数据域
deleteq;//释放删除结点的空间
returnOK;
}
intListLength_L(LinkListL)//返回L中数据元素个数
{
LinkListp;
inti=0;
p=L->next;//p指向第一个结点
while(p)
{//遍历单链表,统计结点数
i++;
p=p->next;
}
returni;
}
StatusClearList(LinkList&L)//将L重置为空表
{
LinkListp,q;
p=L->next;//p指向第一个结点
while(p)//没到表尾
{
q=p->next;
deletep;
p=q;
}
L->next=NULL;//头结点指针域为空
returnOK;
}
StatusDestroyList_L(LinkList&L)//销毁
{
LinkListp;
while(L)
{
p=L;
L=L->next;
deletep;
}
returnOK;
}
14、
#include
#include
#include
#defineOK1
#defineERROR0
#defineOVERFLOW-2
#defineMAXSIZE100
#defineNULL0
typedefintStatus;
typedefintElemType;
typedefstructLNode
{
ElemTypedata;//数据域
structLNode*next;//指针域
}LNode,*LinkList;//*LinkList为Lnode类型的指针
intmain()
{
LNode*La=NULL;
ElemTypeb[MAXSIZE],x;
inti,num;
StatusInitList_L(LinkList&L);
voidCreateList_L(LinkList&L,ElemTypea[],intn);
StatusDispList_L(LinkListL);
intListEmpty(LinkListL);
ElemTypeMax_L(LinkListL);
InitList_L(La);
printf("线性表中元素的个数?
\n");
scanf("%d",&num);
printf("请输入元素:
\n");
for(i=0;iscanf("%d",&b[i]);
CreateList_L(La,b,num);
if(ListEmpty(La))
printf("线性表为空!
\n");
else
{
printf("线性表为:
\n");
DispList_L(La);
x=Max_L(La);
printf("线性表中最大的数据为:
%d",x);
}
return0;
}
StatusInitList_L(LinkList&L)
{
L=newLNode;
L->next=NULL;
returnOK;
}
voidCreateList_L(LinkList&L,ElemTypea[],intn)//正位序输入n个元素的值,建立带表头结点的单链表L
{
LinkListp,r;
inti;
r=L;//尾指针r指向头结点
for(i=0;i{
p=newLNode;
p->data=a[i];//输入元素值
p->next=NULL;
r->next=p;//插入到表尾
r=p;//r指向新的尾结点
}
}
intListEmpty(LinkListL)//若L为空表,则返回1,否则返回0
{
if(L->next)//非空
return0;
else
return1;
}
StatusDispList_L(LinkListL)
{
LinkListp;
if(ListEmpty(L))
returnERROR;
else
{
p=L->next;
while(p)
{
printf("%d",p->data);
p=p->next;
}
printf("\n");
}
}
ElemTypeMax_L(LinkListL)
{
LinkListp;
ElemTypemax;
max=L->next->data;//假定第一个结点中数据具有最大值
p=L->next->next;
while(p)
{
if(p->data>max)
max=p->data;//如果p所指结点的值大于max的值,则重新赋值
p=p->next;//遍历链表
}
returnmax;
}
15、
#include
#include
#include
#defineOK1
#defineERROR0
#defineOVERFLOW-2
#defineMAXSIZE100
#defineNULL0
typedefintStatus;
typedefintElemType;
typedefstructLNode
{
ElemTypedata;//数据域
structLNode*next;//指针域
}LNode,*LinkList;//*LinkList为Lnode类型的指针
intmain()
{
LNode*La=NULL;
ElemTypeb[MAXSIZE],max,min;
inti,num;
StatusInitList_L(LinkList&L);
voidCreateList_L(LinkList&L,ElemTypea[],intn);
StatusDispList_L(LinkListL);
intListEmpty(LinkListL);
voidDelete_maxmin(LinkList&L,intmink,intmaxk);
InitList_L(La);
printf("线性表中元素的个数?
\n");
scanf("%d",&num);
printf("请输入元素:
\n");
for(i=0;iscanf("%d",&b[i]);
CreateList_L(La,b,num);
if(ListEmpty(La))
printf("线性表为空!
\n");
else
{
printf("线性表为:
\n");
DispList_L(La);
printf("maxis:
\n");
scanf("%d",&max);
printf("minis:
\n");
scanf("%d",&min);
Delete_maxmin(La,min,max);
printf("删除之后的线性表为:
\n");
DispList_L(La);
}
return0;
}
StatusInitList_L(LinkList&L)
{
L=newLNode;
L->next=NULL;
returnOK;
}
voidCreateList_L(LinkList&L,ElemTypea[],intn)//正位序输入n个元素的值,建立带表头结点的单链表L
{
LinkListp,r;
inti;
r=L;//尾指针r指向头结点
for(i=0;i{
p=newLNode;
p->data=a[i];//输入元素值
p->next=NULL;
r->next=p;//插入到表尾
r=p;//r指向新的尾结点
}
}
intListEmpty(LinkListL)//若L为空表,则返回1,否则返回0
{
if(L->next)//非空
return0;
else
return1;
}
StatusDispList_L(LinkListL)
{
LinkListp;
if(ListEmpty(L))
returnERROR;
else
{
p=L->next;
while(p)
{
printf("%d",p->data);
p=p->next;
}
printf("\n");
}
}
voidDelete_maxmin(LinkList&L,intmink,intmaxk)
{LinkListp,q,pre,s;
pre=L;
p=L->next;//首元结点
while(p&&p->data<=mink)
{
pre=p;
p=p->next;
}//查找第一个值>mink的结点
if(p)
{
while(p&&p->datap=p->next;//查找第一个值≥maxk的结点
q=pre->next;
pre->next=p;//修改指针
while(q!
=p)
{
s=q->next;
deleteq;
q=s;
}//释放结点空间
}
}