【数据结构】链式存储实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《数据结构B》实验报告
系计算机与电子专业电子科学与技术2008级01 __班
姓名岳恒学号20081185028 2010年1 0月9日
上机题目:链式存储实验
1.详细设计
实验目的:理解链表的逻辑结构和存储结构,熟练掌握链表的相关操作。
1、问题描述
链表是用一组任意的存储单元来依次存储线性表中的各个数据元素,这些存储单元可以是连续的,也可以是不连续的。用链接存储结构表示线性表的一个元素时至少要有两部分信息:一是这个数据元素的值,二是这个数据元素的直接后继的存储地址。这两部分信息一起组成了链表的一个结点。数据域用来存放数据元素的值;指针域(又称链域)用来存放该数据元素的直接后继结点的地址。链表正是通过每个结点的指针域将线性表的n个结点按其逻辑次序链接成为一个整体。通常用箭头表示链域中的指针,于是单链表就可以直观地画成用箭头链接起来的结点序列,单链表中每个结点的存储地址存放在其直接前驱的指针域中,因此访问单链表的每一个结点必须从表头指针开始进行。对单链表的操作主要有:建立单链表、查找(按序号查找、按值查找)、插入一个结点、删除一个结点、求表长等。
2、数据结构设计
单链表的结点结构如下:
typedef struct node
{ /*单链表结点结构*/
ElemType data; /*ElemType可以是任何相应的数据类型如int,char等*/
struct node *next;
} LinkList;
3、功能(函数)设计
链表的基本操作:
InitList1(LinkList *&head)
//初始化不带头结点的链表头指针
AddHead1(LinkList *&head, ElemType x)
//使用表首添加法,向头指针为head的链表中插入一个结点,其值为x
InitList(LinkList *&head)
//初始化带头结点的链表头指针
AddHead(LinkList *head, ElemType x)
//使用表尾添加法,向头指针为head的链表中插入一个结点,其值为x
CreatList(LinkList *head,int n)
//生成含有n个结点的单链表
output(LinkList *head)
//输出单链表
GetNode(LinkList *head, int i)
//在带头结点的单链表中查找第i个结点,找到返回该结点指针,否则返回NULL
LocateNode(LinkList *head, ElemType x)
//在带头结点的单链表中查找值为x的结点,找到返回结点指针,否则返回NULL
InsertNode(LinkList *head, int i, ElemType x)
//在带头结点的单链表中第i个结点位置上插入值为x的结点
DeleteNode1(LinkList *head, ElemType x)
//在带头结点的单链表中删除值为x的结点
DeleteNode(LinkList *head, int i)
//在带头结点的单链表中删除第i个结点
Length(LinkList *head)
//在带头结点的单链表中求表的长度
InsertOrder(LinkList *head,int x)
//在有序单链表L中插入值为x的结点,插入后仍然有序
union1(LinkList *head,LinkList *B,LinkList *&C)
//A和B是两个带头结点的递增有序的单链表,本算法将两表合并成,一个带头结点的递增有序单链表C,利用原表空间。
4、界面设计
指导用户按照正确的格式输入数据。
5、编码实现
#include
#include
#include
typedef int ElemType;
#define MaxSize 100
typedef struct
{ ElemType data[MaxSize];
int front;
int rear;
} CircSeqQueue;
void QueueInitial(CircSeqQueue *pQ) //创建一个由指针pQ所指向的空顺序循环队列{
pQ->front=pQ->rear=0;
}
int IsEmpty(CircSeqQueue *pQ) //判断队列是否为空
{
return pQ->front==pQ->rear;
}
int IsFull(CircSeqQueue *pQ) ////判断队列是否已满
{
return (pQ->rear+1)%MaxSize==pQ->front;
}
void EnQueue(CircSeqQueue *pQ,ElemType e) //若队列不满则元素e进队
{
if(IsFull(pQ))
{ printf("队列益处!\n");
return;
}
pQ->rear=(pQ->rear+1)%MaxSize;
pQ->data[pQ->rear]=e;
}
ElemType DeQueue(CircSeqQueue *pQ) //若循环队列不为空,则删除队头元素,并返回他的值
{
if(IsEmpty(pQ))
{ printf("空队列!\n");
exit(1);
}
pQ->front=(pQ->front+1)%MaxSize;
return pQ->data[pQ->front] ;
}
ElemType GetFront(CircSeqQueue *pQ) //若循环队列不为空,则返回队头元素的值
{
if(IsEmpty(pQ))
{ printf("空列队!\n");
exit(1);
}
return pQ->data[(pQ->front+1)%MaxSize];
}
void MakeEmpty(CircSeqQueue *pQ) //将由指针pQ所指向的队列变为空队
{
pQ->front=pQ->rear=0;