数据结构线性表实验报告.docx
《数据结构线性表实验报告.docx》由会员分享,可在线阅读,更多相关《数据结构线性表实验报告.docx(11页珍藏版)》请在冰豆网上搜索。
数据结构线性表实验报告
实验报告
课程
数据结构
实验名称
实验一线性表
学号
姓名
实验日期:
实验一线性表
实验目的:
1.理解线性表的逻辑结构特性;
2.熟练掌握线性表的顺序存储结构的描述方法,以及在该存储结构下的基本操作;并能灵活运用;
3.熟练掌握线性表的链表存储结构的描述方法,以及在该存储结构下的基本操作;并能灵活运用;
4.掌握双向链表和循环链表的的描述方法,以及在该存储结构下的基本操作。
实验原理:
线性表顺序存储结构下的基本算法;
线性表链式存储结构下的基本算法;
实验内容:
2-21设计单循环链表,要求:
(1) 单循环链表抽象数据类型包括初始化操作、求数据元素个数操作、插入操作、删除操作、取消数据元素操作和判非空操作。
(2) 设计一个测试主函数,实际运行验证所设计单循环链表的正确性。
2-22.设计一个有序顺序表,要求:
(1) 有序顺序表的操作集合有如下操作:
初始化、求数据元素个数、插入、删除和取数据元素。
有序顺序表与顺序表的主要区别是:
有序顺序表中的数据元素按数据元素值非递减有序。
(2) 设计一个测试主函数,实际运行验证所设计有序顺序表的正确性。
(3) 设计合并函数ListMerge(L1,L2,L3),功能是把有序顺序表L1和L2中的数据元素合并到L3,要求L3中的数据元素依然保持有序。
并设计一个主函数,验证该合并函数的正确性。
程序代码:
2-21
(1)头文件LinList.h如下:
typedefstructnode
{
DataTypedata;
structnode*next;
}SLNode;
/*
(1)初始化ListInitiate(SLNode**head)*/
voidListInitiate(SLNode**head)
{/*如果有内存空间,申请头结点空间并使头指针head指向头结点*/
if((*head=(SLNode*)malloc(sizeof(SLNode)))==NULL)exit
(1);
(*head)->next=NULL;/*置结束标记NULL*/
}
/*
(2)求当前数据元素个数ListLength(SLNode*head)*/
intListLength(SLNode*head)
{
SLNode*p=head;
intsize=0;
while(p->next!
=head)
{
p=p->next;
size++;
}
returnsize;
}
/*(3)插入ListInsert(SLNode*head,inti,DataTypex)*/
/*在带头结点的单链表的第i(0<=i<=size)个结点前*/
/*插入一个存放数据元素x的结点。
插入成功时返回1,失败返回0*/
intListInsert(SLNode*head,inti,DataTypex)
{
SLNode*p,*q;
intj;
p=head;
j=-1;
while(p->next!
=head&&j/*最终让指针指向第i-1个结点*/
{
p=p->next;
j++;
}
if(j!
=i-1)
{
printf("Theinsertedpositioniserror!
");
return0;
}
/*生成新结点由指针q指示*/
if((q=(SLNode*)malloc(sizeof(SLNode)))==NULL)exit
(1);
q->data=x;
q->next=p->next;
p->next=q;
return1;
}
/*(4)删除ListDelete(SLNode*head,inti,DataType*x)*/
/*删除带头结点的单链表head的第i(0<=i<=size)个结点前*/
/*被删除结点的数据元素域由x带回。
删除成功时返回1,失败返回0*/
intListDelete(SLNode*head,inti,DataType*x)
{
SLNode*p,*s;
intj;
p=head;
j=-1;
while(p->next!
=head&&p->next->next!
=head&&j/*最终让指针指向第i-1个结点*/
{
p=p->next;
j++;
}
if(j!
=i-1)
{
printf("Thedeletedpositionofparameteriserror!
");
return0;
}
s=p->next;/*指针s指指向ai结点*/
*x=s->data;
p->next=p->next->next;/*删除*/
free(s);/*释放指针s所指结点的内存空间*/
return1;
}
/*(5)取数据元素ListGet(SLNode*head,inti,DataType*x)*/
intListGet(SLNode*head,inti,DataType*x)
{
SLNode*p;
intj;
p=head;
j=-1;
while(p->next!
=head&&j
{
p=p->next;
j++;
}
if(j!
=i)
{
printf("Thegottenpositionofparameteriserror!
");
return0;
}
*x=p->data;
return1;
}
/*(6)撤销单链表Destroy(SLNode**head)*/
voidDestroy(SLNode**head)
{
SLNode*p,*p1;
p=*head;
while(p!
=NULL)
{
p1=p;
p=p->next;
free(p1);
}
*head=NULL;
}
(2)测试主函数如下:
#include/*包含printf()函数*/
#include/*包含exit()函数*/
#include/*包含malloc()函数*/
typedefintDataType;/*定义DataType为int*/
#include"LinList.h"/*包含单链表的头文件*/
voidmain(void)
{
SLNode*head;/*定义头指针变量*/
inti,x;
ListInitiate(&head);/*初始化*/
for(i=0;i<10;i++)/*插入10个数据元素*/
{
if(ListInsert(head,i,i+1)==0)
{
printf("error!
\n");
return;
}
}
if(ListDelete(head,4,&x)==0)/*删除第四个数据元素*/
{
printf("error!
\n");
return;
}
for(i=0;i{
if(ListGet(head,i,&x)==0)/*取数据元素*/
{
printf("error!
\n");
return;
}
else
printf("%d",x);/*显示*/
}
Destroy(&head);/*撤销单链表*/
}
2-22设计一个有序顺序表
头文件程序如下:
#defineNULL0
typedefstruct
{
DataTypeList[MaxSize];
intsize;
}SeqList;
voidlistInitiate(SeqList*L)/*初始化顺序表L*/
{
L->size=0;/*定义初始化数据元素个数*/
}
intListLength(SeqListL)
{
returnL.size;
}
intListInsert(SeqList*L,inti,DataTypex)
{
intj;
if(L->size>=MaxSize)
{
printf("顺序表已满无法插入!
\n");
return0;
}
elseif(i<0||i>L->size)
{
printf("参数i不合法!
\n");
return0;
}
else
{
for(j=L->size;j>i;j--)
L->List[j]=L->List[j-1];
L->List[i]=x;
L->size++;
return1;
}
}
intListDelete(SeqList*L,inti,DataType*x)
{
intj;
if(L->size<=0)
{
printf("顺序表已空无数据元素可删!
\n");
return0;
}
elseif(i<0||i>L->size-1)
{
printf("参数i不合法!
\n");
return0;
}
else
{
*x=L->List[i];
for(j=i+1;jsize-1;j++)
L->List[j-1]=L->List[j];
L->size--;
return1;
}
}
intListGet(SeqListL,inti,DataType*x)
{
if(i<0||i>L.size-1)
{
printf("参数i不合法!
\n");
return0;
}
else
{
*x=L.List[i];
return1;
}
}
/*测试主函数设计如下:
*/
#include
#defineMaxSize100
typedefintDataType;
#include"SeqList.h"
intSLOrderInsert(SeqList*L,DataTypex)
{
intj;
if(L->size>=MaxSize-1)
{
printf("顺序表已满无法插入!
\n");
return0;
}
{
for(j=L->size-1;j>0&&xlist[j];j--)
L->list[j+1]=L->list[j];
L->list[j+1]=x;
L->size++;
return1;
}
}
voidmain(void)
{
SeqListMyList;
inta[]={1,2,4,5,6,8,9};/*数组a中的数据元素递增有序*/
inti,n=7;
intx;
ListInitiate(&MyList);
for(i=0;iListInitiate(&MyList);
SLOrderInser