10数据结构实验指导书朱素英.docx

上传人:b****7 文档编号:10428387 上传时间:2023-02-11 格式:DOCX 页数:72 大小:35.75KB
下载 相关 举报
10数据结构实验指导书朱素英.docx_第1页
第1页 / 共72页
10数据结构实验指导书朱素英.docx_第2页
第2页 / 共72页
10数据结构实验指导书朱素英.docx_第3页
第3页 / 共72页
10数据结构实验指导书朱素英.docx_第4页
第4页 / 共72页
10数据结构实验指导书朱素英.docx_第5页
第5页 / 共72页
点击查看更多>>
下载资源
资源描述

10数据结构实验指导书朱素英.docx

《10数据结构实验指导书朱素英.docx》由会员分享,可在线阅读,更多相关《10数据结构实验指导书朱素英.docx(72页珍藏版)》请在冰豆网上搜索。

10数据结构实验指导书朱素英.docx

10数据结构实验指导书朱素英

《—数据结构—》

实验指导书

 

朱素英编写

 

适用专业:

计算机科学与技术

计算机网络工程

 

湖南人文科技学院计算机科学技术系

2008年8月

 

前言

 

《数据结构》课程是计算机科学与技术专业的一门必修的专业基础课。

这门课程的主要特点是实践性很强,不仅要学习基本理论知识,更要注重上机实践,通过上机实践验证算法的正确性,掌握和巩固所学理论知识。

通过对本课程中算法设计和上机实践的训练,培养学生的数据抽象能力和程序设计的能力,为后续课程,特别是软件课程打下坚实的知识基础。

要求学生掌握各种常用数据结构的逻辑结构,存储结构及有关操作的算法。

通过本课程的学习,要求学生了解数据结构及其分类、数据结构与算法的密切关系;熟悉各种基本数据结构及其操作,学会根据实际问题要求来选择数据结构;掌握设计算法的步骤和算法分析方法;掌握数据结构在排序和查找等常用算法中的应用。

为了使学生更好地理解和深刻地把握这些知识,并在此基础上,训练和培养了解数据结构及其分类、数据结构与算法的密切关系;熟悉各种基本数据结构及其操作,学会根据实际问题要求来选择数据结构;掌握设计算法的步骤和算法分析方法;掌握数据结构在排序和查找等常用算法中的应用等方面的技能,设置的以下十二个的具体实验项目,这些实验项目中有验证性实验、综合性实验与设计性实验,在每一个具体实验中都有标明。

各项实验主要了解、掌握的具体知识,在每个实验中都有说明。

本实验指导书对计算机科学与技术专业与网络工程专业均适应。

 

目录(顺序表的基本操作

栈的基本操作

队列的基本操作

串的模式匹配

二叉树的基本操作

哈夫曼树与哈夫曼编码

实验一:

顺序表的基本操作1

实验二:

单链表的基本操作9

实验三:

栈的基本操作14

实验四:

队列的基本操作16

实验五:

串的模式匹配19

实验六:

矩阵的基本运算22

实验七:

二叉树的基本操作29

实验八:

哈夫曼树与哈夫曼编码34

实验九:

图的最短路径算法38

实验十:

哈希表的基本操作40

实验十一:

各种排序算法44

实验十二:

银行模拟48

实验一:

顺序表的基本操作

实验学时:

2

实验类型:

验证

实验要求:

选修

一、实验目的

1.掌握使用VC++进行控制台应用程序编写的基本方法

2.掌握顺序表的初始化、销毁、数据元素的插入和删除以及顺序表的输出等基本操作。

二、实验内容

顺序表的初始化、插入和删除

三、程序清单

1、运行环境

Visualc++6.0的微机一台

2、程序清单

//线性表的顺序结构算法实现

#include"stdio.h"

#include"stdlib.h"

#defineOVERFLOW-2

#defineOK1

#defineERROR0

//数据类型说明

typedefintElemType;

typedefintStatus;

#defineList_init_size100

//线性表存储空间初始分配量

#defineListincrement10

//线性表存储空间分配增量

typedefstruct{

ElemType*elem;//存储空间基址

intlength;//当前长度

intlistsize;//当前分配的存储容量

//(以sizeof(ElemType)为单位)

}sqlist;

//初始化线性表:

StatusInitList(sqlist&L)

{//构造一个空线性表L

L.elem=(ElemType*)malloc(List_init_size*sizeof(ElemType));

if(!

L.elem)exit(OVERFLOW);

L.length=0;

L.listsize=List_init_size;

returnOK;

}

//在一个空的线性表中输入N个数据:

Statussqlistinput(sqlist&L,intn)

{inti=0;

if(n>L.listsize)returnERROR;

for(;i

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

}

L.length=n;

returnOK;

}

//判线性表是否为空

StatusListEmpty(sqlistL)

{if(!

L.length)returnERROR;

elsereturnOK;

}

//求线性表的长度

StatusListLength(sqlistL)

{returnL.length;

}

//将线性表L的数据输出:

Statussqlistoutput(sqlistL)

{inti;

for(i=0;i

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

printf("\n");

returnOK;}

//取线性表的第i个元素,其结果保存在e中

StatusGetElem(sqlistl,inti,ElemType&e)

{

if(i<1||i>l.length+1)returnERROR;

e=l.elem[i-1];

returnOK;

}

//定义两个数据元素相等的比较函数

Statusequal(ElemTypee1,ElemTypee2)

{if(e1==e2)

returnOK;

else

returnERROR;

}

//根据compare()函数在线性表中定位元素e的位置

intLocateElem_sq(sqlistL,ElemTypee,Status(*compare)(ElemType,ElemType))//成功返回位序,否则返回0

{inti=1;

ElemType*p;

p=L.elem;

while(i<=L.length&&!

(*compare)(*p++,e))++i;

if(i<=L.length)returni;

elsereturn0;

}//locateElem_sq

//在线性表中求某元素的前趋结点,如存在则返回其前趋结点pre_e的值,否则返回出错信息

StatusPriorElem(sqlistL,ElemTypecur_e,ElemType&pre_e)

{intpos;

pos=LocateElem_sq(L,cur_e,equal);

if(pos==0)returnERROR;

elseif(pos==1)returnOVERFLOW;//overflow表示位于第一个

else{

GetElem(L,pos-1,pre_e);

returnOK;

}

}

//在线性表中求某元素的后继结点

StatusNextElem(sqlistL,ElemTypecur_e,ElemType&next_e)

{intpos;

pos=LocateElem_sq(L,cur_e,equal);

if(pos==0)returnERROR;

elseif(pos==L.length)returnOVERFLOW;//overflow表示最后一个

else{

GetElem(L,pos+1,next_e);

returnOK;

}

}

//在线性表中插入一个元素

StatusListinsert_sq(sqlist&L,inti,ElemTypee){

ElemType*p,*q,*newbase;

if(i<1||i>L.length+1)returnERROR;

if(L.length>=L.listsize){

newbase=(ElemType*)realloc(L.elem,(L.listsize+Listincrement)*sizeof(ElemType));

if(!

newbase)exit(OVERFLOW);

L.elem=newbase;L.listsize+=Listincrement;}

q=&(L.elem[i-1]);

for(p=&(L.elem[L.length-1]);p>=q;--p)*(p+1)=*p;

*q=e;++L.length;

returnOK;

}//listinsert_sq;

//在线性表中删除第i个元素,其结果保留在e中

StatusListdelete_sq(sqlist&l,inti,ElemType&e)

{

ElemType*p,*q;

if(i<1||i>l.length+1)returnERROR;

p=&(l.elem[i-1]);

e=*p;

q=l.elem+l.length-1;

for(++p;p<=q;++p)*(p-1)=*p;

--l.length;

returnOK;

}//listdelete_sq;

//将la和lb线性表归并到lc

voidmergelist_sq(sqlistla,sqlistlb,sqlist&lc)

{ElemType*pa,*pb,*pc,*pa_last,*pb_last;

pa=la.elem;

pb=lb.elem;

lc.listsize=lc.length=la.length+lb.length;

pc=lc.elem=(ElemType*)malloc(lc.listsize*sizeof(ElemType));

if(!

lc.elem)exit(OVERFLOW);

pa_last=la.elem+la.length-1;pb_last=lb.elem+lb.length-1;

while((pa<=pa_last)&&(pb<=pb_last))

if(*pa<=*pb)*pc++=*pa++;else*pc++=*pb++;

while(pa<=pa_last)*pc++=*pa++;

while(pb<=pb_last)*pc++=*pb++;

}//mergelist_sq;

//对线性表的元素进行排序

Statussortsqlist(sqlist&L)

{//冒泡排序

inti,j,len;

ElemTypet;

len=ListLength(L);

for(i=len-1;i>=1;i--)

for(j=0;j

{if(L.elem[j]>L.elem[j+1])

{t=L.elem[j];

L.elem[j]=L.elem[j+1];

L.elem[j+1]=t;

}

}

returnOK;

}

voidmain()

{sqlistla,lb,lc;

intn,m,i,e,k,cur_e,pre_e,next_e;

//建立线性表,并输入输出线性表的数据

InitList(la);InitList(lb);

printf("pleaseinputla'snumbers:

n(请输入线性表la的元素个数n)\n");

scanf("%d",&n);

printf("pleaseinputlannumbers:

(请输入线性表la的n个元素)\n");

sqlistinput(la,n);

sqlistoutput(la);

printf("\n");

//调用插入函数,对线性表进行插入操作

printf("请输入要插入的元素的位置和插入的值\n");

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

Listinsert_sq(la,i,e);

sqlistoutput(la);

//调用删除函数,对线性表进除删操作

printf("请输入要删除的元素的位置\n");

scanf("%d",&i);

Listdelete_sq(la,i,e);

printf("thedeledatais%d\n",e);

sqlistoutput(la);

printf("pleaseinputthegetdata'slocate\n");

scanf("%d",&i);

//调用GetElem()函数,取第I个位置的元素的值。

GetElem(la,i,e);

printf("thegetdatais%d\n",e);

printf("pleaseinputthelocateelem'sdata:

cur_e\n");

//调用LocateElem_sq()函数,求元素cur_e的位置。

scanf("%d",&cur_e);

k=LocateElem_sq(la,cur_e,equal);

printf("thelocateis%d\n",k);

//调用PriorElem()函数,求元素cur_e的前驱。

printf("pleaseinputthecur_edata\n");

scanf("%d",&cur_e);

PriorElem(la,cur_e,pre_e);

printf("thepre_eis%d\n",pre_e);

//调用NextElem()函数,求元素cur_e的后继。

printf("pleaseinputthecur_edata\n");

scanf("%d",&cur_e);

NextElem(la,cur_e,next_e);

printf("thenext_eis%d\n",next_e);

//建立两个线性表并排序然后归并

printf("pleaseinputlb'snumbers:

m\n");

scanf("%d",&m);

printf("pleaseinputlbmnumbers:

\n");

sqlistinput(lb,m);

printf("\n");

sqlistoutput(lb);

sortsqlist(la);

printf("thesortlistlais:

\n");

sqlistoutput(la);

sortsqlist(lb);

printf("thesortlistlbis:

\n");

sqlistoutput(lb);

mergelist_sq(la,lb,lc);

printf("laandlb'smergelistis:

\n");

sqlistoutput(lc);

}

四、思考题

1.如何实现顺序表的逆置

2.每次删除操作时,都会使得大量的数据元素移动,删除多个数据元素时,就需多次移动数据元素。

能否一次进行删除多个数据元素的操作,使得数据元素的移动只进行一次。

实验二:

单链表的基本操作

实验学时:

2

实验类型:

验证

实验要求:

必修

一、实验目的

1.定义单链表的结点类型。

2.熟悉对单链表的一些基本操作和具体的函数定义。

3.通过单链表的定义掌握线性表的链式存储结构的特点。

4.掌握循环链表和双链表的定义和构造方法

二、实验内容

链表的创建、插入与删除操作

三、程序清单

1、运行环境

装有Visualc++6.0的微机一台

2、程序清单

//链表的创建及插入、删除操作

#include"stdio.h"

#include"stdlib.h"

#defineNULL0

#defineerror0

#defineok1

#defineoverflow-2

#defineinfeasible-1

//类型定义

typedefintStatus;

typedefintElemType;

//定义链表的存储结构

typedefstructLNode

{intdata;//数据域

structLNode*next;//指针域

}LNode,*LinkList;//链表的类型

StatusGetElem_l(LinkListL,inti,ElemType&e)

//L为带头结点的单链表,当第i个元素存在时,其值赋给e.

{intj;

LinkListp;

p=L->next;j=1;

while(p&&j

{p=p->next;++j;}

if(!

p||j>i)returnerror;

e=p->data;

returnok;

}

//逆序创建链表

voidCreatList_L1(LinkList&L,intn)//n为元素个数,L为头结点

{inti;

LinkListp;

L=(LinkList)malloc(sizeof(LNode));//生成头结点

L->next=NULL;

for(i=n;i>0;i--)//链头插入法

{p=(LinkList)malloc(sizeof(LNode));

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

p->next=L->next;

L->next=p;

}

}

//正序创建单链表

voidCreatList_L2(LinkList&L,intn)///n为元素个数,L为头结点

{inti;

LinkListp,q;

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

q=L;

for(i=0;i

{p=(LinkList)malloc(sizeof(LNode));

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

q->next=p;

q=p;

}

q->next=NULL;

}

//输出链表

voidprint(LinkListL)

{LinkListp;

p=L->next;

while(p)

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

p=p->next;

}

}

//链表的插入操作

intListInsert(LinkList&L,inti,inte)

{LinkListp,s;

intj;

p=L;j=0;

while(p&&j

{p=p->next;++j;}

if(!

p||j>i-1)returnerror;

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

s->data=e;s->next=p->next;

p->next=s;

returnok;

}

//链表的删除操作

intListDelete(LinkList&L,inti,int&e)

{LinkListp,q;

intj;

p=L;j=0;

while(p->next&&j

{p=p->next;++j;}

if(!

(p->next)||j>i-1)returnerror;

q=p->next;p->next=q->next;

e=q->data;free(q);

returnok;

}

//对链表的元素进行排序

Statussortlinklist(LinkList&L)

{LinkListp,q,r;

ElemTypet;

p=L->next;//p指向链表第一个元素结点

while(p->next!

=NULL)

{q=L->next;//q指向链表第一个元素结点

while(q->next!

=NULL)

{r=q->next;

if(q->data>r->data)//相邻两个元素比较、交换

{t=q->data;q->data=r->data;r->data=t;}

q=q->next;

}

p=p->next;

}

returnok;

}

voidmergelist_l(LinkListla,LinkList&lb,LinkList&lc)

{LinkListpa,pb,pc;

pa=la->next;pb=lb->next;

lc=pc=la;

while(pa&&pb)

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

{pc->next=pa;pc=pa;pa=pa->next;}

else{pc->next=pb;pc=pb;pb=pb->next;}

pc->next=pa?

pa:

pb;

free(lb);

}

//主函数通过调用创建、插入、删除用输出函数完成链表的基本操作

voidmain()

{LinkListL1,L2,L3;

intn,ins,del,i;

//创建一个先进先出单链表

printf("pleaseinputfifolinklist'snodenumbern:

\n");

scanf("%d",&n);

printf("pleaseinputthelinklist%dnodesdata\n",n);

CreatList_L2(L2,n);

print(L2);

printf("\n");

//创建一个后进先出单链表

printf("pleaseinputlifolinklist'snodenumbern:

\n");

scanf("%d",&n);

printf("pleaseinputthelinklist%dnodesdata\n",n);

CreatList_L1(L1,n);

print(L1);

printf("\n");

//对链表进行插入操作

printf("pleaseinputtheinsertnode'slocateiandvaluee\n");

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

ListInsert(L1,i,ins);

print(L1);

printf("\n");

//对链表进行删除操作

printf("pleaseinputthedeletenode'slocatei\n");

scanf("%d",&i);

ListDelete(L1,i,del);

print(L1);

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

//对链表进行排序

sortlinklist(L1);

printf("\ntheL1list'ssortis:

\n");

print(L1);

printf("\ntheL2list'ssortis:

\n");

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

当前位置:首页 > 高等教育 > 军事

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

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