线性表的存储结构定义及基本操作实验报告600724何俊林Word下载.docx

上传人:b****8 文档编号:22430511 上传时间:2023-02-04 格式:DOCX 页数:37 大小:51.94KB
下载 相关 举报
线性表的存储结构定义及基本操作实验报告600724何俊林Word下载.docx_第1页
第1页 / 共37页
线性表的存储结构定义及基本操作实验报告600724何俊林Word下载.docx_第2页
第2页 / 共37页
线性表的存储结构定义及基本操作实验报告600724何俊林Word下载.docx_第3页
第3页 / 共37页
线性表的存储结构定义及基本操作实验报告600724何俊林Word下载.docx_第4页
第4页 / 共37页
线性表的存储结构定义及基本操作实验报告600724何俊林Word下载.docx_第5页
第5页 / 共37页
点击查看更多>>
下载资源
资源描述

线性表的存储结构定义及基本操作实验报告600724何俊林Word下载.docx

《线性表的存储结构定义及基本操作实验报告600724何俊林Word下载.docx》由会员分享,可在线阅读,更多相关《线性表的存储结构定义及基本操作实验报告600724何俊林Word下载.docx(37页珍藏版)》请在冰豆网上搜索。

线性表的存储结构定义及基本操作实验报告600724何俊林Word下载.docx

依次对L的每个数据元素进行输出;

.“销毁算法”初始条件:

销毁顺序线性表L;

.“置空表算法”初始条件:

将L重置为空表;

.“求表长算法”初始条件:

返回L中数据元素个数;

.“按序号查找算法”初始条件:

顺序线性表L已存在,元素位置为i,且1≤i≤ListLength(L)操作结果:

返回L中第i个数据元素的值

.“按值查找算法”初始条件:

顺序线性表L已存在,元素值为e;

返回L中数据元素值为e的元素位置;

.“判表空算法”初始条件:

顺序线性表L已存在;

若L为空表,则返回TRUE,否则返回FALSE;

分析:

修改输入数据,预期输出并验证输出的结果,加深对有关算法的理解。

(二)基本实验内容(单链表):

建立单链表,完成链表(带表头结点)的基本操作:

建立链表、插入、删除、查找、输出、求前驱、求后继、两个有序链表的合并操作。

其他基本操作还有销毁链表、将链表置为空表、求链表的长度、获取某位置结点的内容、搜索结点。

利用线性表的链式存储结构,设计一组输入数据(假定为一组整数),能够对单链表进行如下操作:

.初始化一个带表头结点的空链表;

.创建一个单链表是从无到有地建立起一个链表,即一个一个地输入各结点数据,并建立起前后相互链接的关系。

又分为逆位序(插在表头)输入n个元素的值和正位序(插在表尾)输入n个元素的值;

.插入结点可以根据给定位置进行插入(位置插入),也可以根据结点的值插入到已知的链表中(值插入),且保持结点的数据按原来的递增次序排列,形成有序链表。

.删除结点可以根据给定位置进行删除(位置删除),也可以把链表中查找结点的值为搜索对象的结点全部删除(值删除);

.输出单链表的内容是将链表中各结点的数据依次显示,直到链表尾结点;

其它的操作算法描述略。

2.实现要求:

对链表的各项操作一定要编写成为C(C++)语言函数,组合成模块化的形式,还要针对每个算法的实现从时间复杂度和空间复杂度上进行评价。

构造一个空的线性表L,产生头结点,并使L指向此头结点;

.“建立链表算法”初始条件:

空链存在;

选择逆位序或正位序的方法,建立一个单链表,并且返回完成的结果;

.“链表(位置)插入算法”初始条件:

已知单链表L存在;

在带头结点的单链线性表L中第i个位置之前插入元素e;

.“链表(位置)删除算法”初始条件:

在带头结点的单链线性表L中,删除第i个元素,并由e返回其值;

.“输出算法”初始条件:

链表L已存在;

依次输出链表的各个结点的值;

(三)扩展实验内容(顺序表)

查前驱元素、查后继元素、顺序表合并等.

.根据给定元素的值,求出前驱元素;

.根据给定元素的值,求出后继元素;

.对已建好的两个顺序表进行合并操作,若原线性表中元素非递减有序排列,要求合并后的结果还是有序(有序合并);

对于原顺序表中元素无序排列的合并只是完成A=A∪B(无序合并),要求同样的数据元素只出现一次。

.修改主程序,实现对各不同的算法调用。

.“查前驱元素算法”初始条件:

若数据元素存在且不是第一个,则返回前驱,否则操作失败;

.“查后继元素算法”初始条件:

若数据元素存在且不是最后一个,则返回后继,否则操作失败;

.“无序合并算法”的初始条件:

已知线性表La和Lb;

将所有在线性表Lb中但不在La中的数据元素插入到La中;

.“有序合并算法”的初始条件:

已知线性表La和Lb中的数据元素按值非递减排列;

归并La和Lb得到新的线性表Lc,Lc的数据元素也按值非递减排列;

(四)扩展实验内容(链表)

.求前驱结点是根据给定结点的值,在单链表中搜索其当前结点的后继结点值为给定的值,将当前结点返回;

.求后继结点是根据给定结点的值,在单链表中搜索其当前结点的值为给定的值,将后继结点返回;

.两个有序链表的合并是分别将两个单链表的结点依次插入到第3个单链表中,继续保持结点有序;

.“求前驱算法”初始条件:

线性表L已存在;

若cur_e是L的数据元素,且不是第一个,则用pre_e返回它的前驱;

.“求后继算法”初始条件:

若cur_e是L的数据元素,且不是最后一个,则用next_e返回它的后继;

.“两个有序链表的合并算法”初始条件:

线性表单链线性表La和Lb的元素按值非递减排列;

归并La和Lb得到新的单链表。

三、实验环境和实验步骤

实验环境:

利用CodeBlocks10.05集成开发环境进行本实验的操作。

实验步骤――顺序表的定义与操作:

1.启动CodeBlocks10.5;

2.按“Createanewproject”,通过”file”,按“C/C++source”,选择”c”,然后GO.储存文件“D:

\c语言\顺序表.c“,

3.进行编代码。

4、编好之后,搞ctrl+shift+F9进行编译。

然后按ctrl+F10.

5.如果编译出问题,然后进行调试。

实验步骤――链表的定义与操作:

\c语言\单链表.c“,

四、实验分析

顺序表代码如下:

#include<

stdio.h>

#include"

stdlib.h"

malloc.h>

#defineLIST_INIT_SIZE100

#defineok1

#defineERROR0

#defineOVERFLOW-1

#defineNum3

typedefintDataType;

typedefintStatus;

typedefstruct

{

DataType*elem;

intLength;

intListsize;

}SeqList;

SeqListL;

StatusInitSeqList(SeqList*L)

L->

elem=(DataType*)malloc(LIST_INIT_SIZE*sizeof(DataType));

if(!

L->

elem)

exit(OVERFLOW);

Length=0;

Listsize=LIST_INIT_SIZE;

returnok;

}

StatusInsertSeqList(SeqList*L,inti,DataTypee)

DataType*q,*p;

if(i<

1||i>

Length+1)

returnERROR;

else

if(L->

Length>

=L->

Listsize)

{

printf("

TheSeqListisfull!

"

);

}

q=L->

elem+i-1;

for(p=L->

elem+L->

Length-1;

p>

=q;

--p)

*(p+1)=*p;

*q=e;

++L->

Length;

intDeleteSeqList(SeqList*L,inti)

intj;

Length)

theinumberisnotexist!

for(j=i-1;

j<

j++)

*(L->

elem+j)=*(L->

elem+j+1);

Length--;

//voidSearchSeqList(SeqList*L,DataTypex)

voidSearchSeqList(SeqList*L,intx)

intj=0;

while(j<

Length&

&

*(L->

elem+j)!

=x)

j++;

if(j>

error"

运行结果"

%d"

j+1);

voidPrintfSeqList(SeqList*L)

Printf("

运行结果:

inti;

for(i=0;

i<

i++)

*(L->

elem+i));

voidLenSeqList(SeqList*L)

inti=0,*j;

for(j=L->

elem;

i++;

\n元素个数为:

i);

voidPriorSeqLement(SeqList*L,inti)

int*j;

输入有误"

elseif(i==1)

无前驱"

elsej=L->

elem+i-2;

运行结果:

*j);

StatusNextSeqElement(SeqList*L,inti)

int*j;

1||L->

无后继"

elem+i;

voidListSeqEmpty(SeqList*L)

Length==0)

书序表为空"

elseprintf("

顺序表非空"

StatusChangSeqList(SeqList*L)

inti,j,q;

for(i=0,j=L->

Length/2;

i++,j--)

q=*(L->

elem+i);

elem+i)=*(L->

elem+j);

elem+j)+q;

StatusClearSeqList(SeqList*L)

voidDestorySeqList(SeqList*L)

free(L);

Listsize=0;

voidmain()

SeqList*LA=&

L;

inti,e,j,x,k,m,*p,q=0;

InitSeqList(&

L);

输入元素:

for(p=LA->

q<

Num;

q++,p++)

scanf("

p);

LA->

Length++;

PrintfSeqList(&

printf("

\n输入要插入元素的位置和元素:

scanf("

%d,%d"

&

i,&

e);

InsertSeqList(LA,i,e);

\n输入要删除元素的位置:

j);

DeleteSeqList(&

L,j);

\n输入要查找的值:

x);

SearchSeqList(&

L,x);

\n输入元素求其前驱:

k);

PriorSeqList(&

L,k);

\n输入元素求其后继:

m);

NextSeqList(&

L,m);

\n求表长:

LenSeqList(&

//判断表是否为空

\n判断表是否为空:

\n"

ListSeqEmpty(&

逆转:

ChangSeqList(&

置空表:

ClearSeqList(&

销毁:

DestorySeqList(&

单链表代码:

//List.h

fstream>

usingnamespacestd;

typedefintElemType;

typedefstructstudent

ElemTypen;

structstudent*next;

}Student,*SListLink;

classSList

public:

SList();

//建立一个空链表**************

voidCreateSList();

//建立链表**************

voidClearSList();

//将链表重置为空链表**************

ElemTypeSListLength();

//返回链表中的长度**************

boolSListEmpty();

//判断链表是否为空链表**************

ElemTypeGetElem();

//返回链表的一个元素**************

voidSortElem();

//对链表排序

voidSListInsert();

//插入一个元素**************

voidSListDelete();

//删除一个元素**************

boolSlistDeleteSame();

//删除相同的元素

voidShowSList();

//显示一个链表**************

voidFileSave();

//写入文件

voidFileRead();

//从文件打开

voidFileDelete();

//从文件删除

voidFileCheck();

//查看文件内容

~SList();

//销毁链表

private:

SListLinkhead;

SListLinkp;

SListLinkq;

SListLinktemp;

intslistlength;

};

SList:

:

SList()//建立一个空链表

head=p=q=temp=NULL;

slistlength=0;

voidSList:

CreateSList()//建立链表

if(head==NULL)

ElemTypem;

cout<

<

请输入一个数字:

(0,负数表示结束输入)"

endl;

cin>

>

m;

if(m>

0)

head=q=p=temp=newStudent;

q->

n=m;

++slistlength;

while(m!

=0&

m>

=0)

if(m!

p=newStudent;

p->

next=p;

q=p;

next=NULL;

链表创建成功"

//没有输出?

head=p=q=NULL;

你已经创建过新链表了"

intSList:

SListLength()//返回链表中的长度

链表中的元素个数是:

slistlength<

returnslistlength;

ElemTypeSList:

GetElem()//返回链表对应序号的一个元素

if(head!

=NULL)

请输入要返回的数在链表中的序号"

if(slistlength>

=m)

intindx=1;

p=head;

while

(1)

if(m==indx)

链表返回你查找的数:

head->

n<

returnhead->

n;

p=p->

next;

++indx;

p->

returnp->

序号超出链表范围"

return-1;

不允许非法输入"

此链表是空链表"

boolSList:

SListEmpty()//判断链表是否为空链表

此链表不是空链表"

returnfalse;

returntrue;

SlistDeleteSame()//删除链表中相同元素

删除链表中相同元素的节点,请输入一个要删除的数:

这是一个空链表"

SortElem()//对链表排序

for(p=head;

p!

=NULL;

p=p->

next)

temp=p;

for(q=p->

q!

q=q->

if(q->

n>

=temp->

n)

temp=q;

if(temp!

=p)

ElemTypet=p->

n=temp->

temp->

n=t;

排序成功"

此链表是空链表,不能进行此操作"

ClearSList()//将链表重置为空表

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 历史学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1