线性表的抽象数据类型的实现实验报告Word文档格式.docx
《线性表的抽象数据类型的实现实验报告Word文档格式.docx》由会员分享,可在线阅读,更多相关《线性表的抽象数据类型的实现实验报告Word文档格式.docx(20页珍藏版)》请在冰豆网上搜索。
![线性表的抽象数据类型的实现实验报告Word文档格式.docx](https://file1.bdocx.com/fileroot1/2023-2/2/c6607572-dc41-4867-ba44-9b532e836b1f/c6607572-dc41-4867-ba44-9b532e836b1f1.gif)
malloc.h>
#definesize20
#defineelemtypeint
structseqlist
{elemtypeelem[size];
intlast;
};
voidmenu()
{printf("
\n.........................................."
);
printf("
\n0.退出操作................................"
\n1.建立数据类型为整形的顺序表(长度小于20)."
\n2.打印线性表.............................."
\n3.在线性表中查找第i个元素,并返回其值....."
\n4.在线性表中第i个元素之前插入一已知元素..."
\n5.在线性表中删除第i个元素................."
\n6.求线性表中所有元素值(整数)之和........"
\n7.初始化..................................\n"
}
voidins(seqlist*L)
{L->
last=-1;
voidcreat(seqlist*L)
{inti=0;
elemtypej;
请输入线性表元素(-1结束):
"
scanf("
%d"
&
j);
while(j!
=-1)
{L->
elem[i++]=j;
L->
last++;
if(i>
size-1)break;
scanf("
}
voidprint(seqlist*L)
{inti;
顺序表中元素为:
for(i=0;
i<
=L->
last;
i++)
printf("
%d\t"
L->
elem[i]);
intfind(seqlist*L,inti)
{if(i<
1||i>
L->
last+1)return0;
elsereturn(L->
elem[i-1]);
intinsert(seqlist*L,inti,intx)
{intj;
if(L->
last+1==size||i<
last+2)return0;
for(j=L->
j>
=i-1;
j--)
L->
elem[j+1]=L->
elem[j];
elem[i-1]=x;
return1;
intdel(seqlist*L,inti)
{inte,j;
last==-1||i<
last+1)
return0;
else
e=L->
elem[i-1];
for(j=i;
j<
last+1;
j++)
elem[j-1]=L->
last--;
intsum(seqlist*L)
{inti=0,s=0;
last==-1)return0;
i++)s+=L->
elem[i];
returns;
intisempty(seqlist*L)
{if(L->
last==-1)
return1;
elsereturn0;
voidmain()
{inti,cz,e;
elemtypedate;
seqlistL;
menu();
请输入你要执行的操作的序号:
i=scanf("
cz);
while
(1)
{if(!
i)printf("
只能输入数值"
elsebreak;
\n再输入一次:
rewind(stdin);
i=scanf("
while(cz)
{switch(cz)
{case1:
if(isempty(&
L))
{ins(&
L);
creat(&
elseprintf("
表已经存在,先清空再进行此操作!
\n"
break;
case2:
printf("
表为空\n"
elseprint(&
case3:
printf("
输入待查找元素的位置:
scanf("
i);
if(find(&
L,i))
查找的第%d个元素为%d\n"
i,find(&
L,i));
else
查找位置错误\n"
case4:
请输入要插入的元素及位置:
date);
if(insert(&
L,i,date))
插入元素成功!
elseprintf("
插入位置不合法或栈已满!
case5:
请输入要删除元素的位置\n"
e=L.elem[i-1];
if(del(&
{printf("
删除第%d个值为%d的元素\n"
i,e);
删除成功\n"
}
Elseprintf("
删除位置不合法或表已空\n"
case6:
表已空!
线性表中所有元素值(整数)和:
%d\n"
sum(&
L));
case7:
ins(&
break;
default:
无此操作!
\n只能输入数值"
测试数据与实验结果
7.初始化
1.建表
2.打印
3.查找
4.插入不合法长度超过20
5.删除然后打印
4~.插入合法
6.求和
二、链表(带头结点)基本操作实验
数据元素类型ElemType取字符型char。
按照动态单循环链表结构实现如下算法(各算法边界条件适当给出):
1创建任意字符型有序(递增排序)单循环链表(即链表的字符元素随机在键盘上输入),长度限定在15之内;
2打印(遍历)该链表(依次打印出表中元素值);
3在链表中查找第i个元素,i合法返回元素值,否则,返回FALSE;
4在链表中查找与一已知字符相同的第一个结点,有则返回TRUE,否则,返回FALSE;
5在链表中按照有序方式插入一已知字符元素;
6在线性表中删除第i个结点;
7计算链表的长度。
#include<
#defineelemtypechar
#definesize15
staticintn=0;
typedefstructNode
{
elemtypedata;
structNode*next;
}Node,*linklist;
voidinit(linklist*L)
*L=(linklist)malloc(sizeof(Node));
(*L)->
next=*L;
n=0;
voidcreat(linklistL)
inti=0,j;
Node*s,*r;
elemtypec[size],t;
r=L->
next;
请输入字符型元素(最多15个,输入字符'
@'
结束):
%s"
c);
while(c[i]!
='
)
{
n++;
i++;
i=0;
n;
for(j=i;
n-i-1;
{
if(c[j]<
c[j+1])
{t=c[j];
c[j]=c[j+1];
c[j+1]=t;
}
t=c[i];
s=(Node*)malloc(sizeof(Node));
s->
data=t;
r->
next=s;
r=s;
voidlength(linklistL)
链表长度为:
n);
voidshow(linklistL)
intj;
Node*p;
p=L;
if(!
p){printf("
表为空!
return;
for(j=0;
%c"
p->
next->
data);
p=p->
intisempty(linklistL)
Node*pre;
pre=L;
if(pre->
next==L)
return0;
voidfind4(linklistL,inti)
intj=0;
if(i<
size)
查找位置错误!
while(j<
i)
j++;
if(i=j)
voidfind5(linklistL,elemtypek)
inti=1,j;
p=L->
if(n==0)
return;
if(p->
data!
=k)
p=p->
else{printf("
第%d个元素是要查找的元素%c"
i,k);
链表中无此字符!
voidinsert(linklistL,elemtypet)
Node*r,*s;
inti=0;
r=L;
if(n==size)
表已满!
for(i;
n-1&
&
t<
r->
data;
r=r->
s=(Node*)malloc(sizeof(Node));
s->
next=r->
r->
插入成功!
n++;
return;
voiddel(linklistL,inti)
Node*p,*r;
n){printf("
删除位置不对!
i-1)
p=p->
开始删除"
r=p->
p->
free(r);
删除成功!
n--;
.........................................................................\n"
0.退出程序...............................................................\n"
1.初始化单循环链表.......................................................\n"
2.创建任意字符型有序(递减排序最长15)单循环链表........................\n"
3.打印(遍历)该链表(依次打印出表中元素值).............................\n"
4.在链表中查找第i个元素..................................................\n"
5.在链表中查找与一已知字符相同的第一个结点...............................\n"
6.在链表中按照有序方式插入一已知字符元素.................................\n"
7.在线性表中删除第i个结点................................................\n"
8.计算链表的长度.........................................................\n"
intcz,i,j,k;
charkey,t;
linklistL;
if(!
else
rewind(stdin);
while(cz)
switch(cz)
case1:
init(&
if(isempty(L))
creat(L);
表已存在,请先初始化单循环链表!
show(L);
请输入查找的第i个元素的i值:
j=scanf("
while
(1)
{
if(!
j)
break;
rewind(stdin);
j=scanf("
find4(L,i);
请输入要查找的字符:
key);
find5(L,key);
请输入要插入的字符:
t);
insert(L,t);
输入要删除的第i个元素的i值:
k);
del(L,k);
case8:
length(L);
menu();
while
(1)
i=scanf("