实验一 线性表.docx

上传人:b****5 文档编号:11810323 上传时间:2023-04-02 格式:DOCX 页数:12 大小:36.31KB
下载 相关 举报
实验一 线性表.docx_第1页
第1页 / 共12页
实验一 线性表.docx_第2页
第2页 / 共12页
实验一 线性表.docx_第3页
第3页 / 共12页
实验一 线性表.docx_第4页
第4页 / 共12页
实验一 线性表.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

实验一 线性表.docx

《实验一 线性表.docx》由会员分享,可在线阅读,更多相关《实验一 线性表.docx(12页珍藏版)》请在冰豆网上搜索。

实验一 线性表.docx

实验一线性表

实验一线性表

实验项目名称

线性表

实验日期

实验室

9#405实验室

机号

4

实验类型

设计型

学时

2

一、实验目的及要求(本次上机实践所涉及并要求掌握的知识点)

1、掌握顺序表的存储结构形式及其描述和基本运算的实现。

2、掌握动态链表结构及相关算法设计。

3、正确设计和调试本实验程序并上机运行,记录程序运行结果,结合运行结果,对程序进行分析。

4、完成实验报告。

二、实验环境(本次上机实践所使用的平台和相关软件)

微型计算机

WindowsXP,Visualc++

三、实验内容及步骤

实验内容:

1、实现顺序表的创建(输入)、输出、查找、插入和删除功能。

2、单链表的查找、插入和删除等基本操作的实现。

3、利用基本操作,实现两个有序单链表的合并。

实验步骤:

1、实现顺序表的创建(输入)、输出、查找、插入和删除功能。

●顺序表类型定义和相关的常量定义。

●创建顺序表:

初始化顺序表。

●编写函数,为顺序表录入数据。

●编写顺序表输出函数,通过循环依次输出SqList中的各个元素的内容。

●编写函数实现查找、插入和删除等基本操作。

2、实现单链表设计以及各种基本操作的实现。

●单链表类型定义和相关的常量定义。

●创建单链表:

初始化单链表。

●编写函数,为单链表录入数据。

●编写单链表输出函数,通过循环依次输出单链表中的各个元素的内容。

●编写函数实现单链表的查找、插入和删除等基本操作。

3、实现两个有序单链表的合并。

算法分析和设计

①为使算法的时间复杂度为O(n+m)只能采用“平移指针,一次扫描”的方法,于是设两个指针分别指向两个线性表表头。

②为使合并后仍为一个有序表,需对指针所指结点的数据域进行比较。

③要使合并后的有序表为递减有序表,比较后选出较小的一个将其从原链表中取出插入到新表的表首。

④指针后移,重复②,③步,直到其中一个表结束,将尚未结束表的元素依次取出插入新表。

⑤为减少头指针的变化,采用带有头结点的链表。

算法如下:

structnode

{intdata;

structnode*link;

}

typedefstructnodeNODE;

NODE*merge_link(NODE*head_a,NODE*head_b)

{NODE*p,*q,*head;

head=(NODE*)malloc(sizeof(NODE));

head->link=NULL;

p=head_a->link;

q=head_b->link;

while((p!

=NULL)&&(q!

=NULL))

if(p->datadata)

{head_a->link=p->link;

p->link=head->link;

head->link=p;

p=head_a->link;

}

else

{head_b->link=q->link;

q->link=head->link;

head->link=q;q=head_b->link;

}

while(p!

=NULL)

{head_a->link=p->link;

p->link=head->link;

head->link=p;

p=head_a->link;

}

while(q!

=NULL)

{head_b->link=q->link;

q->link=head->link;

head->link=q;

q=head_b->link;

}

free(head_a);

free(head_b);

return(head);

}

四、实验结果(本实验源程序清单及运行结果或实验结论、实验设计图)

实验程序1.#include

#defineok1

#defineerror0

#defineMAXSIZE100/*顺序表的容量*/

typedefintElemType;

typedefstruct

{

ElemTypeelem[MAXSIZE];/*存放顺序表的元素*/

intlast;/*顺序表的实际长度*/

}SqList;

voidInitList(SqList&sq)/*初始化线性表*/

{

sq.last=-1;

}

voidInputList(SqList&sq)/*输入线性表*/

{

inti=0,n=0;

printf("输入线性表的长度:

");

scanf("%d",&n);

printf("输入线性表元素:

");

while(i

{scanf("%d",&sq.elem[i]);

i++;}

sq.last=n-1;

printf("\n");

}

voidDispList(SqListsq)/*输出线性表*/

{

inti;

printf("输出线性表元素:

");

for(i=0;i<=sq.last;i++)

printf("%d",sq.elem[i]);

printf("\n");

}

intLocate(SqListsq,ElemTypex)/*按值查找*/

{

inti=0;

while((i<=sq.last)&&(sq.elem[i]!

=x))/*查找值为x的第1个结点*/

i++;

if(i>sq.last)

return(-1);/*未找到*/

else

return(i+1);

}

intInsList(SqList&sq,ElemTypee,inti)/*插入*/

{

intk;

if((i<1)||(i>sq.last+2))

{

printf("插入位置i值不合法");

returnerror;

}

if(sq.last>=MAXSIZE-1)

{

printf("表已满,无法插入");

returnerror;

}

for(k=sq.last;k>=i-1;k--)

sq.elem[k+1]=sq.elem[k];

sq.elem[i-1]=e;

sq.last++;

returnok;

}

intDelList(SqList&sq,inti,ElemType*e)/*删除*/

{

intk;

if((i<1)||(i>sq.last))

{

printf("删除位置不合法");

returnerror;

}

else

{

*e=sq.elem[i-1];

for(k=i;k<=sq.last;k++)

sq.elem[k-1]=sq.elem[k];

sq.last--;

returnok;

}

}

voidmain()

{

SqListsq;

ElemTypex,r;

intm,n,q,t,w,e,v;

InitList(sq);/*初始化顺序表sq*/

InputList(sq);

DispList(sq);

printf("输入待查找的元素:

");

scanf("%d",&x);

printf("输入待插入的元素:

");

scanf("%d",&e);

printf("输入待插入的位置:

");

scanf("%d",&q);

m=Locate(sq,x);

if(m==-1)

printf("线性表中没有元素%d!

\n",x);

else

printf("%d是线性表的第%d个元素!

\n",x,m);

v=InsList(sq,e,q);

if(v==ok)

DispList(sq);

else

printf("待插入位置不合法:

");

printf("输入待删除的位置:

");

scanf("%d",&t);

w=DelList(sq,t,&r);

if(w==ok)

{

DispList(sq);

printf("%d\n",r);

}

else

printf("删除位置不合法");

 

}

运行结果:

实验程序.#include

#include

typedefcharElemType;

typedefstructnode

{

ElemTypedata;/*数据域*/

structnode*next;/*指针域*/

}SLink;

voidInitList(SLink*&L)/*L作为引用型参数*/

{

L=(SLink*)malloc(sizeof(SLink));/*创建头结点*L*/

L->next=NULL;

}

voidDispList(SLink*L)/*输出单链表*/

{

SLink*p=L->next;

while(p!

=NULL)

{

printf("%c",p->data);

p=p->next;

}

printf("\n");

}

voidCreateFromTail(SLink*&L)/*输入单链表,当输入$时结束*/

{SLink*r,*s;

charc;

intflag=1;

r=L;

while(flag)

{c=getchar();

if(c!

='$')

{s=(SLink*)malloc(sizeof(SLink));

s->data=c;

r->next=s;

r=s;

}

else

{flag=0;

r->next=NULL;

}

}/*while*/

}/*CreateFromTail*/

SLinkMergeLinkList(SLink*LA,SLink*LB)

{

SLink*pa,*pb;

SLink*LC,*r;

pa=LA->next;

pb=LB->next;

LC=LA;

LC->next=NULL;r=LC;

while(pa!

=NULL&&pb!

=NULL)

{

if(pa->data<=pb->data)

{r->next=pa;r=pa;pa=pa->next;

}

else

{r->next=pb;r=pb;pb=pb->next;}

}

if(pa)

r->next=pa;

else

r->next=pb;

free(LB);

return(*LC);

}

voidmain()

{

SLink*LA,*LB;

InitList(LA);

InitList(LB);/*初始化单链表L*/

printf("输入单链表LA中的元素(字符型),$符号是结束标志!

\n");

CreateFromTail(LA);

printf("输入单链表LB中的元素(字符型),$符号是结束标志!

\n");

CreateFromTail(LB);

printf("线性表:

");

DispList(LA);

DispList(LB);

MergeLinkList(LA,LB);

DispList(LA);

}

运行结果:

五、实验总结(对本实验结果进行分析,实验心得体会及改进意见)

通过本次的实验,我学习了顺序表的创建(输入)、输出、查找、插入和删除功能;单链表的查找、插入和删除等基本操作以及两个有序单链表的合并。

在实验过程中,通过这次的程序设计,发现一个程序设计就是算法与数据结构的结合体,自己也开始对程序产生了前所未有的兴趣,以前偷工减料的学习也不可能一下子写出一个程序出来,于是我就认真看老师写的程序,发现我们看懂了一个程序其实不难,难的是对于一个程序的思想的理解,我们要掌握一个算法,不仅仅限于读懂,主要的是要理解老师的思路,学习老师的解决问题的方法。

六、本次实验得分

95

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

当前位置:首页 > 教学研究 > 教学案例设计

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

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