线性表的顺序表示与链式表示讲解.docx

上传人:b****3 文档编号:11092474 上传时间:2023-05-29 格式:DOCX 页数:28 大小:62.06KB
下载 相关 举报
线性表的顺序表示与链式表示讲解.docx_第1页
第1页 / 共28页
线性表的顺序表示与链式表示讲解.docx_第2页
第2页 / 共28页
线性表的顺序表示与链式表示讲解.docx_第3页
第3页 / 共28页
线性表的顺序表示与链式表示讲解.docx_第4页
第4页 / 共28页
线性表的顺序表示与链式表示讲解.docx_第5页
第5页 / 共28页
线性表的顺序表示与链式表示讲解.docx_第6页
第6页 / 共28页
线性表的顺序表示与链式表示讲解.docx_第7页
第7页 / 共28页
线性表的顺序表示与链式表示讲解.docx_第8页
第8页 / 共28页
线性表的顺序表示与链式表示讲解.docx_第9页
第9页 / 共28页
线性表的顺序表示与链式表示讲解.docx_第10页
第10页 / 共28页
线性表的顺序表示与链式表示讲解.docx_第11页
第11页 / 共28页
线性表的顺序表示与链式表示讲解.docx_第12页
第12页 / 共28页
线性表的顺序表示与链式表示讲解.docx_第13页
第13页 / 共28页
线性表的顺序表示与链式表示讲解.docx_第14页
第14页 / 共28页
线性表的顺序表示与链式表示讲解.docx_第15页
第15页 / 共28页
线性表的顺序表示与链式表示讲解.docx_第16页
第16页 / 共28页
线性表的顺序表示与链式表示讲解.docx_第17页
第17页 / 共28页
线性表的顺序表示与链式表示讲解.docx_第18页
第18页 / 共28页
线性表的顺序表示与链式表示讲解.docx_第19页
第19页 / 共28页
线性表的顺序表示与链式表示讲解.docx_第20页
第20页 / 共28页
亲,该文档总共28页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

线性表的顺序表示与链式表示讲解.docx

《线性表的顺序表示与链式表示讲解.docx》由会员分享,可在线阅读,更多相关《线性表的顺序表示与链式表示讲解.docx(28页珍藏版)》请在冰点文库上搜索。

线性表的顺序表示与链式表示讲解.docx

线性表的顺序表示与链式表示讲解

数据结构课程实验报告

课程名称

数据结构实验

班级

实验日期

2014.4.2

姓名

学号

实验成绩

实验名称

线性表的顺序表示与链式表示

实验目的及要求

【实验目的】

1.加深理解线性表的顺序表示与链式表示的意义和区别,掌握用它们表示时各基本操作的设计与实现。

2.学会定义线性表的顺序存储类型和链式存储类型,实现C程序的

基本结构,对线性表的一些基本操作和具体的函数定义。

3.掌握线性表的基本操作(初始化、建立、插入、删除、遍历等)。

4.掌握对多函数程序的输入、编辑、调试和运行过程。

5.进一步熟练C语言的使用,特别是指针和链表的使用。

6.能在实际应用背景下恰当选择顺序存储和链式存储。

【实验要求】

1.预习C语言中的结构的定义和基本操作方法

2.对线性表的每个基本操作用单独的函数实现

3.编写完整程序完成下面的实验内容并上机运行

4.整理并上交实验报告

实验环境

硬件平台:

普通PC机

软件平台:

Windows操作系统

编程环境:

VC6.0

实验内容

1.分别建立包含10个数据元素的顺序线性表和链式线性表;

2.从键盘输入一个数据元素和插入位置k,将元素插入到线性表中

第k(包含0号位置)个位置;

3.从键盘输入一个数据元素关键字或位置k(包含1号位置),从线性表中删除相应数据元素;

4.能完成查找功能;

给出程序及插入、删除前和插入、删除后线性表结果。

算法描述及实验步骤

//创建顺式线性表

structnumber*creat(void)

{

structnumber*head,*p1;

p1=head=(structnumber*)malloc(SIZE*sizeof(structnumber));scanf("%ld",&p1->num);

for(;p1->num!

=0;L++)

{

p1++;

seanf("%ld",&p1->num);

}return(head);

}

//输出顺式线性表中的元素

voidprint(structnumber*head)

{

structnumber*p;

ints=L;

p=head;

if(p!

=0)

{

printf("\n您输入的数据为:

\n");

for(;s>0;p++,s--)

printf("%ld",p->num);

}

}

//查找顺式线性表中的元素

voidsearch(structnumber*head)

{

structnumber*p;

longnum1;

intn=0,s=0;

p=head;

printf("\n请输入您要查找的数据:

\n");

scanf("%ld",&num1);

if(head!

=0)

for(;p->num!

=0;p++)

{

n++;

if(p->num==num1)

{

s=1;

break;

}

}

if(s==O)

printf("\n没有您所要查找的数据\n");

else

printf("\n找到您所需数据'%ld'在表中第%d(\n",numl,n);

}

//插入顺式线性表的元素

structnumber*insert(structnumber*head)

{

structnumber*p1,*p2;

intn=1;

longnum1;

p1=p2=head;

p2=p2+L-1;

printf("\n请输入您要插入的数据:

\n");

scanf("%ld",&num1);

if(num1num)

{

for(p1=head;p1->num

n++;

for(;p2>=p1;p2--)

(p2+1)->num=p2->num;

}

(p2+1)->num=num1;

L++;

return(head);

}

//删除顺式线性表的元素

structnumber*del(structnumber*head)

{

structnumber*p1,*p2;

longnum1;

intn=1;

p仁p2=head;

printf("\n请输入要删除的数据:

\n");

scanf("%ld",&num1);

p2=p2+L-1;

for(;p1->num!

=num1&&n<=L;p1++)

n=n+1;

if(n>L)

{

printf("\n没有您要删除的数据\n");

return(O);

}

else

{

for(;p1<=p2;p1++)

p1->num=(p1+1)_>num;

L--;

return(head);

}

}

structlist*creat_n()//创建有n个元素的链表

{

structlist*q,*p,*head=NULL;

 

printf("\n输入你所要创建的结点数

scanf("%d",&length);

head=p=(list*)malloc(sizeof(list));//向它

printf("输入该结点的值:

");

scanf("%d",&p->data);

p->next=NULL;

for(inti=length-1;i>=1;i--)

{

q=p;

p=(list*)malloc(sizeof(list));//

printf("输入该结点的值:

");

:

");

创建一个新结点并用头指针指

创建新结点

 

scanf("%d",&p->data);

q_>next=p;

}

printf("输入完毕\n\n");

p->next=NULL;

returnhead;

}

structlist*output。

//输出表长与结点值函数

{

structlist*p;

p=head;

printf("\n当前链表中存有的兀素:

\n");

while(p!

=NULL)

{

printf("%d\n",p->data);

p=p->next;

}

printf("当前的表长是:

%d\n\n",length);//输出当前表长

returnhead;

}

voidinsert()//插入结点函数

{

structlist*k,*p,*q;

intx;

printf("请输入你要在哪个结点值之前插入新结点:

");

scanf("%d",&x);

k=(list*)malloc(sizeof(list));〃创建新结点

printf("请输入新结点的值:

”);

scanf("%d",&k->data);

k->next=NULL;

if(head==NULL)〃若链表为空,则直接入链表

{

head=k;

length=length+1;

printf(”插入成功\n\n");

}

elseif(head->data--x)//在第一个结点前插入新结点

{

k->next-head;

head-k;

printf("插入成功\n\n”);

length-length+1;

}

else

{

q-head;

p-head->next;

while((p!

-NULL)&&(p->data!

-x))//找出值为X的结点的位置

{

q-p;

p-p_>next;

}

if(p--NULL)

{

q->next-k;〃在链表末插入新结点

printf("插入成功\n”);

length-length+1;

}

elseif(p->data--x)//在要求的X结点前插入新结点

{

k_>next-p;

q_>next-k;

printf("插入成功\n\n");

length=length+1;

}

}

output。

}

intdelet()〃删除结点函数

{

structlist*q,*p;

intx,y;

printf(”请输入你所要删除的结点值:

");

scanf("%d",&x);

if(head==NULL)〃表空

{

printf("表空\n");

return0;

}

elseif(x--head->data)〃第一个结点为删除的结点

{

q-head;

head-head->next;

y-q->data;

free(q);

printf("删除成功\n\n");

length-length-1;

output();

return(y);

}

else

{

q=head;

p=head->next;

while((p!

=NULL)&&(p->data!

=x))〃找出值为X的结点

{

q=p;

p=p->next;

}

if(p==NULL)

{

printf(”没有删除对象\n");

}

if(x==p->data)〃删除值为X的结点

{

q_>next=p->next;

y=p->data;

free(p);

printf("删除成功\n\n");

length=length-1;

output。

return(y);

}

else

{

printf("表中没有指定的结点\n");

output();

return0;

}

}

return0;

}

voidfind()

{

structlist*p;

intk,x,i=1;

chary,n;

LOOP:

p=head;

printf(”请输入你要查找的结点值:

”);

scanf("%d",&x);

while(p->data!

=x)

{

p=p->next;

i++;

}

printf("你所查找的结点是表中第%d个结点!

\n\n",i);

printf("是否要继续查找,请输入y/n\n\n");

k=getch();

if(k=='y')

{

i=1;

gotoLOOP;

}

else

return;

}

调试过程及实验结果

T占袖空*rs報结一专人我%丄

--1S345H

MH耳事MKKMKMM?

CMMMMMHJfKMMKMfCM

1

请也.建I帧序義注365787S60

堆淫轲L请骑、号则谙林退曲

2

情谕入您更话凡的数播,

5

继煤抛作悸俞人.否则晡辭出;

5

您槿入的数踞为’

231G5VU?

^G

继績操作请输人•否则请痢退出|

 

请包建I慎序表胡^RF;<»ft7S6F1

继续提作谓输人,否対倩按》退出I

2

请牯扎您要超人的魏际

5

维续操作请辅人”否则谙■按0退出:

E

您梅人的数据为*

继絃操作请鐵人.否则请按《迟討

-KfIL]生I-LI

^q^^^l

的时善A点点点朋结结给垢』甲AAA入入JAlA-”lb-l;EI「■V自n削―.削」削「EI-+」.■l!

*hl,J+.-r+--r"

■■S;S-I;

 

■''C\U?

er?

\AdnirwstrfftoADe&kfc)p\JfSXf^\Cfebu^\Cppl#w'

 

j-】一京口点i点

--12345-W--

4^

12345

我理解到线性表的顺序表示和链式表示方法实际存

通过此次试验,

 

在相当明显的区别,顺序结构的表示方法建立在已存在的固定的空间

区域内,数据超过最大存储空间就会溢出并丢失,无法实现添加或删除操作,线性表可以随机存取表中任意一元素,但在插入或删除操作时需要移动大量元素,但表示方式精简、易操作;而链式结构的表示

方法虽然不如顺序结构简单,却能动态分配存储空间,可以对数据进行添加、删除和修改等操作,功能更为强大,可以提高存储效率。

此外,还熟练掌握了线性表的基本操作一一初始化、建立、插入、删除、遍历等。

掌握了对多函数程序的输入、编辑、调试和运行过程,进一步熟练了指针和链表的使用。

#include#include#defineSIZE100intL=0;

structnumber

{

longnum;};

〃创建顺式线性表structnumber*crea

{

structnumber*head,*p1;

p1=head=(structnumber*)malloc(SIZE*sizeof(structnumber));

scanf("%ld",&p1->num);

for(;p1->num!

=0;L++)

{

p1++;

scanf("%ld",&p1->num);

}

return(head);

}

〃输出顺式线性表中的元素

voidprint(structnumber*head)

{

structnumber*p;

ints=L;

p=head;

if(p!

=0)

{

printf("\n您输入的数据为:

\n");for(;s>0;p++,s--)

printf("%ld",p->num);

}

}

〃查找顺式线性表中的元素

voidsearch(structnumber*head)

{

structnumber*p;

longnum1;

intn=0,s=0;

p=head;

printf("\n请输入您要查找的数据:

\n");

scanf("%ld",&num1);

if(head!

=0)

for(;p->num!

=0;p++)

{

n++;

if(p->num==num1)

{

s=1;

break;

}

}

if(s==O)

printf("\n没有您所要查找的数据\n");else

printf("\n找到您所需数据'%ld'在表中第%d个\n",numl,n);

}

〃插入顺式线性表的元素

structnumber*insert(structnumber*head)

{

structnumber*p1,*p2;

intn=1;

longnum1;

p1=p2=head;

p2=p2+L-1;

printf("\n请输入您要插入的数据:

\n");scanf("%ld",&num1);

if(num1num)

{

for(p1=head;p1->num

n++;

for(;p2>=p1;p2--)

(p2+1)->num=p2->num;

}

(p2+1)->num=num1;

L++;

return(head);

}

〃删除顺式线性表的元素

structnumber*del(structnumber*head)

{

structnumber*p1,*p2;

longnum1;

intn=1;

p1=p2=head;

printf("\n请输入要删除的数据:

\n");

scanf("%ld",&num1);

p2=p2+L-1;

for(;p1->num!

=num1&&n<=L;p1++)

n=n+1;

if(n>l)

printf("\n没有您要删除的数据\n");return(O);

}

else

{for(;p1<=p2;p1++)

p1->num=(p1+1)->num;

L--;

return(head);

}

}

voidmain()

{

structnumber*head,*head1,*head2;inta;

壬(、'\hk*********************************

printf("

*****************\n");

printf("

**1

创建链表

**\n");

printf("

**2

插入节点

**\n");

printf("

**3

查找数据

**\n");

printf("

**4

删除结点

**\n");

printf("

**5

输出**\n");

printf("

**o

退出**\n");

printf("

*****************\n");

**\n");

/*head=creat();print(head);*/

printf('

************************************

**\n");

scanf("%d",&a);

while(a!

=0){

switch(a)

{

case1:

printf("请创建顺序表:

");head=creat();break;

case2:

head1=insert(head);break;

case3:

search(head);break;

case4:

head2=del(head);break;

case5:

print(head);

case0:

break;

}

printf("\n继续操作请输入,否则请按0退出:

\n"):

scanf("%d",&a);

}

}

#include

#include

#includevconio.h>

structlist//结点类型

{intdata;

structlist*next;

};

structlist*head;〃声明结点指针

intstaticlength;〃声明表长变量

structlist*creat_n()〃创建有n个元素的链表

{

structlist*q,*p,*head=NULL;

printf("\n输入你所要创建的结点数:

");scanf("%d",&length);

head=p=(list*)malloc(sizeof(list));//创建一个新结点并用头指针指向它

printf("输入该结点的值:

");

scanf("%d",&p->data);

p->next=NULL;

for(inti=length-1;i>=1;i--)

{

q=p;

p=(list*)malloc(sizeof(list));//创建新结点

printf("输入该结点的值:

");

scanf("%d",&p->data);

q->next=p;

}

printf("输入完毕\n\n");p->next=NULL;

returnhead;

}

structlist*output()〃输出表长与结点值函数

{

structlist*p;

p=head;

printf("\n当前链表中存有的兀素:

\n");

while(p!

=NULL)

{

printf("%d\n",p->data);

p=p->next;

}

printf("当前的表长是:

%d\n\n",length);//输出当前表长returnhead;

}

voidinsert()//插入结点函数

{

structlist*k,*p,*q;

intx;

printf("请输入你要在哪个结点值之前插入新结点:

");

scanf("%d",&x);

k=(list*)malloc(sizeof(list));〃创建新结点

printf("请输入新结点的值:

");

scanf("%d",&k->data);

k->next=NULL;

if(head--NULL)//若链表为空,则直接入链表

{

head=k;

length=length+1;

printf("插入成功\n\n");

}

elseif(head->data==x)//在第一个结点前插入新结点

{

k->next=head;

head=k;

printf("插入成功\n\n");

length=length+1;

}

else

{

q=head;p=head->next;

while((p!

=NULL)&&(p->data!

=x))〃找出值为X的结点的位置{

q=p;

p=p->next;

}

if(p==NULL)

{

q->next=k;〃在链表末插入新结点

printf("插入成功\n");

length=length+1;

}

elseif(p->data==x)//在要求的X结点前插入新结点

{

k->next=p;

q->next=k;

printf("插入成功\n\n");

length=length+1;

}

}

output();

}

intdelet()〃删除结点函数

{

structlist*q,*p;

intx,y;

printf("请输入你所要删除的结点值:

");

seanf("%d",&x);

if(head==NULL)〃表空

{

printf("表空\n");

return0;

}

elseif(x==head->data)〃第一个结点为删除的结点{

q=head;

head=head->next;

y=q->data;

free(q);

printf("删除成功\n\n");

length=length-1;output();

return(y);

}

else

{

q=head;

p=head->next;

while((p!

=NULL)&&(p->data!

=x))〃找出值为X的结点

{

q=p;

p=p->next;

}

if(p==NULL)

{

printf("没有删除对象\n");

}

if(x==p->data)〃删除值为X的结点

{

q->next=p->next;

y=p->data;

free(p);

printf("删除成功\n\n");

length=length-1;

output();

return(y);

}

else

{

printf("表中没有指定的结点\n");

output();

return

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

当前位置:首页 > 小学教育 > 语文

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2