实验线性表操作.docx

上传人:b****5 文档编号:11706096 上传时间:2023-03-30 格式:DOCX 页数:12 大小:18.40KB
下载 相关 举报
实验线性表操作.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

实验线性表操作

实验一线性表基本操作

一、实验目的

1、理解线性表的数据结构及其应用

2、掌握线性表的顺序存储方式及其基本操作(建表、插入、删除)

3、掌握线性表的链式存储方式以及基本操作(建表、插入、删除)

4、理解链式存储的概念和具体语言环境下的表示方法

二、实验内容

1、顺序表的操作

具体要求:

(1)顺序表的存储结构

typedefstruct{

int*data;//整型数据元素,可以是其它类型

intlength;//顺序表的当前长度(元素个数)

intlistsize;//当前分配的存储容量(已经分配的内存空间大小)

}SqList;

或者

#defineN10;

intdata[N];//用数组来模拟实现顺序表

(2)构造一个空表L

函数:

voidInitList_Sq(SqList*L)

(3)分别建立有n个数据元素的顺序表

函数voidCreatList_Sq(SqList*L,intn)

(4)在第i个元素之前插入一个数据元素

函数voidInsertList_Sq(SqList*L,inte)

(5)删除一个数据元素e

函数intListDelete_Sq(SqList*L,inti)

(6)结果显示:

输出顺序表中的数据元素

函数voidShowList_Sq(SqList*L)

(7)顺序表元素排序:

对顺序表中元素按非递减排序(选做)

函数voidSortList_Sq(SqList*L)

(8)归并两个有序的(非递减排列)顺序表Sq_LA和Sq_LB,新表Sq_Lnew中数据元素非递减排列(选做)

函数voidMergeList_Sq(SqList*La,SqList*Lb,SqList*Lc)

实验步骤:

源程序主函数如下:

 

运行结果:

 

图1.1顺序表进行归并操作前、后的各个表中数据元素

2、建立一个线性链表(单链表),实现单链表上数据元素的插入、删除操作。

具体要求:

(1)单链表的存储结构

typedefstructLNode{

chardata;//数据元素为字符类型,可以为其它类型,例如整型

structLNode*next;//指向后继结点的指针

}LNode,*LinkList;

(2)构造一个空的单链表

函数LinkListInitList_L(void)

(3)建立一个带头节点的具有n个结点的单链表L

函数尾插法LinkListCreatList_L_T(intn)或头插法

LinkListCreatList_L(intn)

(4)在单链表LA上插入一个数据元素i_e,插入位置为i(1

函数LinkListListInsert_L(LinkListL,inti,chari_e)

(5)在单链表LA上删除第i个数据元素,并用r_e来返回删除的数据元素值

函数LinkListListDelete_L(LinkListL,inti)

(6)结果显示:

输出单链表进行插入(删除)操作前、后的数据元素

函数voidShowList(LinkListL)

实验步骤:

源程序主函数如下:

运行结果:

 

图1.2单链表进行插入(删除)操作前、后的数据元素

 

三、问题讨论

 

四、实验心得

附:

程序源代码一(不包含在实验报告里边)

/*顺序表操作*/

#include

#include

#include

#defineLIST_INIT_SIZE50

#defineLISTINCREMENT20

#defineM6//LA中元素个数

#defineN4//LB中元素个数

typedefintElemType;

/*顺序表的当前长度(元素个数)length,当前分配的存储容量(已经分配的内存空间大小)listsize*/

typedefstruct{

int*data;

intlength;

intlistsize;

}SqList;

/*书上算法2.3,初始化线性表,分配存储空间*/

voidInitList_Sq(SqList*L){

L->data=(int*)malloc(LIST_INIT_SIZE*sizeof(int));//分配100个数据元素大小的空间

if(!

L->data)

printf("存储空间分配失败");

L->length=0;//空表长度为0

L->listsize=LIST_INIT_SIZE;//初始存储容量

return;

}//InitList_Sq

/*书上算法2.4,线性表插入元素*/

voidListInsert_Sq(SqList*L,inti,inte){

//在顺序线性表L的第i个元素之前插入新的元素e

//i的合法值为1≤i≤L->length+1

int*p,*q;

if(i<1||i>L->length+1)

printf("i值不合法");

if(L->length>=L->listsize){//当前存储空间已满,增加容量

int*newbase=(int*)realloc(L->data,(L->listsize+LISTINCREMENT)*sizeof(int));

if(!

newbase)

printf("存储分配失败");//存储分配失败

L->data=newbase;//新基址

L->listsize+=LISTINCREMENT;//增加存储容量

}

q=&(L->data[i-1]);//q为插入位置

for(p=&(L->data[L->length-1]);p>=q;--p)

*(p+1)=*p;//插入位置及之后的元素右移

*q=e;//插入e

++L->length;//表长增1

}//ListInsert_Sq

 

intListDelete_Sq(SqList*L,inti){//算法2.5

//在顺序线性表L中删除第i个元素,并用e返回其值。

//i的合法值为1≤i≤ListLength_Sq(L)。

int*p,*q;

inte;

if(i<1||i>L->length)

printf("i值不合法");//i值不合法

p=&(L->data[i-1]);//p为被删除元素的位置

e=*p;//被删除元素的值赋给e

q=L->data+L->length-1;//表尾元素的位置

for(++p;p<=q;++p)

*(p-1)=*p;//被删除元素之后的元素左移

--L->length;//表长减1

returne;

}//ListDelete_Sq

 

/*对顺序表中元素进行非递减排序*/

voidSortList_Sq(SqList*L)

{

/*函数体:

具体功能实现*/

}

//书中算法2.7

voidMergeList(SqList*La,SqList*Lb,SqList*Lc){

//已知线性表La和Lb中的元素按值非递减排列。

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

intLa_len,Lb_len;

intai,bj;

inti=1,j=1,k=0;

La_len=La->length;

Lb_len=Lb->length;

while((i<=La_len)&&(j<=Lb_len)){//La和Lb均非空

ai=La->data[i-1];

bj=Lb->data[j-1];

if(ai<=bj){

ListInsert_Sq(Lc,++k,ai);

++i;

}else{

ListInsert_Sq(Lc,++k,bj);

++j;

}

}

while(i<=La_len){

ai=La->data[i-1];

i++;

ListInsert_Sq(Lc,++k,ai);

}

while(j<=Lb_len){

bj=Lb->data[j-1];

j++;

ListInsert_Sq(Lc,++k,bj);

}

}//MergeList

 

/*创建一个具有n个数据元素的线性表*/

voidCreatList_Sq(SqList*L,intn)

{

inti=0;

InitList_Sq(L);

printf("输入%d个元素建立顺序表:

\n",n);

while(i

{

scanf("%d,",&(L->data[i]));

i++;

}

L->length=n;

return;

}

/*打印顺序表中元素*/

voidShowList(SqList*L)//打印顺序表

{

inti;

for(i=0;ilength;i++)

printf("%d",L->data[i]);

printf("\n");

}

/*释放顺序表*/

voidClearList(SqList*L)

{

if(L->data!

=NULL)

{

free(L->data);

L->length=0;

L->listsize=0;

}

}

voidmain()

{

voidInitList_Sq(SqList*L);

voidCreatList_Sq(SqList*L,intn);

voidListInsert_Sq(SqList*L,inti,inte);

intListDelete_Sq(SqList*L,inti);

voidShowList(SqList*L);

voidSortList_Sq(SqList*L);

voidMergeList(SqList*L1,SqList*L2,SqList*L3);

voidClearList(SqList*L);

inti,k,e;

SqListLA,LB,LC;//顺序表LA,LB,LC

//建立并初始化顺序表LA

CreatList_Sq(&LA,M);

//在LA表中第i个数据元素前面插入一个数据元素e

printf("输入插入的位置:

");

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

printf("输入插入的元素:

");

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

printf("在LA表中第%d个数据元素前插入新元素%d后表:

\n",i,e);

ListInsert_Sq(&LA,i,e);

ShowList(&LA);

/*在LA表中删除第i个数据元素,并显示删除的数据元素*/

printf("输入在表LA中要删除第k个元素:

");

scanf("%d,",&k),

e=ListDelete_Sq(&LA,k);

printf("删除的第%d个元素为:

%d\n",k,e);

ShowList(&LA);

/*LA和LB表归并到LC中并输出其中的数据元素*/

CreatList_Sq(&LB,N);//建立顺序表LB

InitList_Sq(&LC);//初始化LC

MergeList(&LA,&LB,&LC);

printf("LA和LB表归并后表LC中的元素:

\n");

ShowList(&LC);

ClearList(&LA);

ClearList(&LB);

ClearList(&LC);

}

程序二:

/*单链表操作*/

#include

#include

#defineM5//L中元素个数

#defineN6

/*线性链表存储结构*/

typedefstructLNode{

intdata;

structLNode*next;

}LNode,*LinkList;

/*初始化函数,返回头指针*/

LinkListInitList_L(void)

{

LinkListhead;

head=NULL;

return(head);

}

/*从头结点开始依次输出单链表所有元素*/

voidShowList(LinkListL)

{

inti=0,n=0;

LinkListp;

p=L;

if(p!

=NULL)

{

n=p->data;//n为结点数目

printf("单链表结点数:

%d\n",n);

p=p->next;//firstnode

printf("单链表的所有结点依次为:

\n");

/*

while(p&&i

{

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

p=p->next;

}*/

while(p)

{

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

p=p->next;

}

}else

printf("单链表为空\n");

}

/*头插法*/

LinkListCreatList_L(intn)

{

inti;

LinkListh,p1,p2;

h=InitList_L();

p1=(LinkList)malloc(sizeof(LNode));//头结点

p1->data=n;

h=p1;

p1->next=NULL;

printf("头插法—输入单链表的%d个数据元素:

\n",n);

for(i=0;i

{

p2=(LinkList)malloc(sizeof(LNode));

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

p2->next=p1->next;

p1->next=p2;

}

return(h);

}

/*尾插法建立单链表*/

LinkListCreatList_L_T(intn)

{

inti;

LinkListh,p1,p2;

h=InitList_L();

p1=(LinkList)malloc(sizeof(LNode));//头结点

p1->data=n;

h=p1;

printf("尾插法—输入单链表的%d个数据元素:

\n",n);

for(i=0;i

{

p2=(LinkList)malloc(sizeof(LNode));

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

p2->next=NULL;

p1->next=p2;

p1=p2;

}

return(h);

}

/*头插法和尾插法分别创建一个单链表,并依次输出其中元素*/

voidmain()

{

LinkListInitList_L();

LinkListCreatList_L(intn);

voidShowList(LinkListL);

LinkListL,L_T;

L=CreatList_L(M);

ShowList(L);

printf("\n");

L_T=CreatList_L_T(N);

ShowList(L_T);

}

 

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

当前位置:首页 > 幼儿教育 > 育儿知识

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

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