数据结构与算法实验指导书70459.docx

上传人:b****1 文档编号:13322389 上传时间:2023-06-13 格式:DOCX 页数:27 大小:28.99KB
下载 相关 举报
数据结构与算法实验指导书70459.docx_第1页
第1页 / 共27页
数据结构与算法实验指导书70459.docx_第2页
第2页 / 共27页
数据结构与算法实验指导书70459.docx_第3页
第3页 / 共27页
数据结构与算法实验指导书70459.docx_第4页
第4页 / 共27页
数据结构与算法实验指导书70459.docx_第5页
第5页 / 共27页
数据结构与算法实验指导书70459.docx_第6页
第6页 / 共27页
数据结构与算法实验指导书70459.docx_第7页
第7页 / 共27页
数据结构与算法实验指导书70459.docx_第8页
第8页 / 共27页
数据结构与算法实验指导书70459.docx_第9页
第9页 / 共27页
数据结构与算法实验指导书70459.docx_第10页
第10页 / 共27页
数据结构与算法实验指导书70459.docx_第11页
第11页 / 共27页
数据结构与算法实验指导书70459.docx_第12页
第12页 / 共27页
数据结构与算法实验指导书70459.docx_第13页
第13页 / 共27页
数据结构与算法实验指导书70459.docx_第14页
第14页 / 共27页
数据结构与算法实验指导书70459.docx_第15页
第15页 / 共27页
数据结构与算法实验指导书70459.docx_第16页
第16页 / 共27页
数据结构与算法实验指导书70459.docx_第17页
第17页 / 共27页
数据结构与算法实验指导书70459.docx_第18页
第18页 / 共27页
数据结构与算法实验指导书70459.docx_第19页
第19页 / 共27页
数据结构与算法实验指导书70459.docx_第20页
第20页 / 共27页
亲,该文档总共27页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

数据结构与算法实验指导书70459.docx

《数据结构与算法实验指导书70459.docx》由会员分享,可在线阅读,更多相关《数据结构与算法实验指导书70459.docx(27页珍藏版)》请在冰点文库上搜索。

数据结构与算法实验指导书70459.docx

数据结构与算法实验指导书70459

计算机和信息学院

实验一顺序表

【实验目的】

熟练掌握线性表在顺序存储结构上的基本操作。

【实验平台】

操作系统:

Windows2000或WindowsXP

开发环境:

C或C++

【实验内容及要求】

顺序表的查找、插入和删除。

设计算法,实现线性结构上的顺序表的产生以及元素的查找、插入和删除。

具体实现要求:

1.从键盘输入10个整数,产生顺序表,并输出结点值。

2.从键盘输入1个整数,在顺序表中查找该结点。

若找到,输出结点的位置;若找不到,则显示“找不到”。

3.从键盘输入2个整数,一个表示欲插入的位置i,另一个表示欲插入的数值x,将x插入在对应位置上,输出顺序表所有结点值,观察输出结果。

4.从键盘输入1个整数,表示欲删除结点的位置,输出顺序表所有结点值,观察输出结果。

【参考框架】

#include

#include

//顺序表的定义:

#defineListSize100//表空间大小可根据实际需要而定,这里假设为100

typedefintDataType;//DataType可以是任何相应的数据类型如int,float或char

typedefstruct

{DataTypedata[ListSize];//向量data用于存放表结点

intlength;//当前的表长度

}SeqList;

voidmain()

{

SeqListL;

inti,x;

intn=10;//欲建立的顺序表长度

L.length=0;

voidCreateList(SeqList*L,intn);

voidPrintList(SeqListL,intn);

intLocateList(SeqListL,DataTypex);

voidInsertList(SeqList*L,DataTypex,inti);

voidDeleteList(SeqList*L,inti);

CreateList(&L,n);//建立顺序表

PrintList(L,n);//打印顺序表

printf("输入要查找的值:

");

scanf("%d",&x);

i=LocateList(L,x);//顺序表查找

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

");

scanf("%d",&i);

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

");

scanf("%d",&x);

InsertList(&L,x,i);//顺序表插入

PrintList(L,n);//打印顺序表

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

");

scanf("%d",&i);

DeleteList(&L,i);//顺序表删除

PrintList(L,n);//打印顺序表

}

//顺序表的建立:

voidCreateList(SeqList*L,intn)

{

//在此插入必要的语句

}

//顺序表的打印:

voidPrintList(SeqListL,intn)

{

//在此插入必要的语句

}

//顺序表的查找:

intLocateList(SeqListL,DataTypex)

{

//在此插入必要的语句

}

//顺序表的插入:

voidInsertList(SeqList*L,DataTypex,inti)

{

//在此插入必要的语句

}

//顺序表的删除:

voidDeleteList(SeqList*L,inti)

{

//在此插入必要的语句

}

【实验报告】

《数据结构和算法》实验报告一

学院:

班级:

学号:

姓名:

日期:

程序名:

L2211.CPP

一、上机实验的问题和要求:

顺序表的查找、插入和删除。

设计算法,实现线性结构上的顺序表的产生以及元素的查找、插入和删除。

具体实现要求:

5.从键盘输入10个整数,产生顺序表,并输出结点值。

6.从键盘输入1个整数,在顺序表中查找该结点。

若找到,输出结点的位置;若找不到,则显示“找不到”。

7.从键盘输入2个整数,一个表示欲插入的位置i,另一个表示欲插入的数值x,将x插入在对应位置上,输出顺序表所有结点值,观察输出结果。

8.从键盘输入1个整数,表示欲删除结点的位置,输出顺序表所有结点值,观察输出结果。

二、源程序及注释:

三、运行输出结果:

四、调试和运行程序过程中产生的问题及采取的措施:

实验二链表

【实验目的】

熟练掌握线性表在链式存储结构上的基本操作。

【实验平台】

操作系统:

Windows2000或WindowsXP

开发环境:

C或C++

【实验内容及要求】

单链表的查找、插入和删除。

设计算法,实现线性结构上的单链表的产生以及元素的查找、插入和删除。

具体实现要求:

9.从键盘输入20个整数,产生带表头的单链表,并输出结点值。

10.从键盘输入1个整数,在单链表中查找该结点。

若找到,则显示“找到了”;否则,则显示“找不到”。

11.从键盘输入2个整数,一个表示欲插入的位置i,另一个表示欲插入的数值x,将x插入在对应位置上,输出单链表所有结点值,观察输出结果。

12.从键盘输入1个整数,表示欲删除结点的位置,输出单链表所有结点值,观察输出结果。

13.将单链表中值重复的结点删除,使所得的结果表中个结点值均不相同,输出单链表所有结点值,观察输出结果。

14.删除其中所有数据值为偶数的结点,输出单链表所有结点值,观察输出结果。

15.把单链表变成带表头结点的循环链表,输出循环单链表所有结点值,观察输出结果。

16.(★)将单链表分解成两个单链表A和B,使A链表中含有原链表中序号为奇数的元素,而B链表中含有原链表中序号为偶数的元素,且保持原来的相对顺序,分别输出单链表A和单链表B的所有结点值,观察输出结果。

【参考框架】

#include

#include

//单链表的定义:

typedefintDataType;//DataType可以是任何相应的数据类型如int,float或char

typedefstructnode//结点类型定义

{DataTypedata;//结点的数据域

structnode*next;//结点的指针域

}ListNode;

typedefListNode*LinkList;

voidmain()

{

inti;

DataTypekey,x;

LinkListhead;

ListNode*p;

LinkListCreateList(void);

voidPrintList(LinkListhead);

LinkListLocateNode(LinkListhead,DataTypekey);

LinkListGetNode(LinkListhead,inti);

voidInsertList(LinkListhead,DataTypex,inti);

voidDeleteList(LinkListhead,inti);

voidDeleteManyList(LinkListhead);

voidDeleteEvenList(LinkListhead);

voidChangeCircList(LinkListhead);

voidPrintCircList(LinkListhead);

head=CreateList();//建立单链表

PrintList(head);//打印单链表

printf("输入要查找的值:

");

scanf("%d",&key);

p=LocateNode(head,key);//单链表查找

printf("请输入欲插入元素的位置:

");

scanf("%d",&i);

printf("请输入欲插入的元素:

");

scanf("%d",&x);

InsertList(head,x,i);//单链表插入

PrintList(head);//打印单链表

printf("请输入欲删除结点的位置:

");

scanf("%d",&i);

DeleteList(head,i);//单链表删除

PrintList(head);//打印单链表

DeleteManyList(head);//删除重复值

PrintList(head);//打印单链表

DeleteEvenList(head);//删除偶数值

PrintList(head);//打印单链表

ChangeCircList(head);//修改为循环单链表

PrintCircList(head);//打印循环单链表

/*voidDivideList(LinkListhead,LinkList*A,LinkList*B);

//分割成两个单链表

DivideList(head,&A,&B);

PrintList(A);

PrintList(B);

*/

}

//单链表的建立:

LinkListCreateList(void)

{

//在此插入必要的语句

}

//单链表的打印:

voidPrintList(LinkListhead)

{

//在此插入必要的语句

}

//单链表的查找1:

LinkListLocateNode(LinkListhead,DataTypekey)

{

//在此插入必要的语句

}

//单链表的查找2:

LinkListGetNode(LinkListhead,inti)

{

//在此插入必要的语句

}

//单链表的插入:

voidInsertList(LinkListhead,DataTypex,inti)

{

//在此插入必要的语句

}

//单链表的删除:

voidDeleteList(LinkListhead,inti)

{

//在此插入必要的语句

}

//删除单链表中重复值:

voidDeleteManyList(LinkListhead)

{

//在此插入必要的语句

}

//删除单链表中偶数值:

voidDeleteEvenList(LinkListhead)

{

//在此插入必要的语句

}

//修改为循环单链表:

voidChangeCircList(LinkListhead)

{

//在此插入必要的语句

}

//循环单链表的打印:

voidPrintCircList(LinkListhead)

{

//在此插入必要的语句

}

/*

//分割成两个单链表

voidDivideList(LinkListhead,LinkList*A,LinkList*B);

{

//在此插入必要的语句

}

*/

【实验报告】

《数据结构和算法》实验报告二

学院:

班级:

学号:

姓名:

日期:

程序名:

L2311.CPP

一、上机实验的问题和要求:

单链表的查找、插入和删除。

设计算法,实现线性结构上的单链表的产生以及元素的查找、插入和删除。

具体实现要求:

1.从键盘输入20个整数,产生带表头的单链表,并输出结点值。

2.从键盘输入1个整数,在单链表中查找该结点。

若找到,则显示“找到了”;否则,则显示“找不到”。

3.从键盘输入2个整数,一个表示欲插入的位置i,另一个表示欲插入的数值x,将x插入在对应位置上,输出单链表所有结点值,观察输出结果。

4.从键盘输入1个整数,表示欲删除结点的位置,输出单链表所有结点值,观察输出结果。

5.将单链表中值重复的结点删除,使所得的结果表中个结点值均不相同,输出单链表所有结点值,观察输出结果。

6.删除其中所有数据值为偶数的结点,输出单链表所有结点值,观察输出结果。

7.把单链表变成带表头结点的循环链表,输出循环单链表所有结点值,观察输出结果。

8.(★)将单链表分解成两个单链表A和B,使A链表中含有原链表中序号为奇数的元素,而B链表中含有原链表中序号为偶数的元素,且保持原来的相对顺序,分别输出单链表A和单链表B的所有结点值,观察输出结果。

二、源程序及注释:

三、运行输出结果:

四、调试和运行程序过程中产生的问题及采取的措施:

实验三树

【实验目的】

熟练掌握在链式二叉树在二叉链表存储结构上的基本操作。

【实验平台】

操作系统:

Windows2000或WindowsXP

开发环境:

C或C++

【实验内容及要求】

要求采用二叉链表作为存储结构,完成二叉树的建立,前序、中序和后序遍历的操作,求所有叶子及结点总数的操作等。

具体实现要求:

17.基于先序遍历的构造算法:

输入是二叉树的先序序列,但必须在其中加入虚结点以示空指针的位置。

假设虚结点输入时用空格字符表示。

18.用广义表表示所建二叉树。

19.分别利用前序遍历、中序遍历、后序遍历所建二叉树。

20.求二叉树结点总数,观察输出结果。

21.求二叉树叶子总数,观察输出结果。

22.交换各结点的左右子树,用广义表表示法显示新的二叉树。

23.(★)二叉树采用链接存储结构,其根结点指针为T,设计一个算法对这棵二叉树的每个结点赋值:

(注意要修改DataType类型)

a)叶结点的值为3

b)只有左孩子或右孩子的结点则其值分别等于左孩子或右孩子的值

c)左、右孩子均有的结点,则其值等于左、右孩子结点的值之和

d)用广义表表示法显示所建二叉树

【参考框架】

#include

#include

//二叉树的链式存储表示

typedefcharDataType;//应由用户定义DataType的实际类型

typedefstructnode

{DataTypedata;

structnode*lchild,*rchild;//左右孩子指针

}BinTNode;//结点类型

typedefBinTNode*BinTree;

voidmain()

{

voidListBinTree(BinTreeT);//用广义表表示二叉树

voidDisplayBinTree(BinTreeT);//用凹入表表示二叉树

voidCreateBinTree(BinTree*T);//构造二叉链表

voidPreorder(BinTreeT);//前序遍历二叉树

voidInorder(BinTreeT);//中序遍历二叉树

voidPostorder(BinTreeT);//后序遍历二叉树

intnodes(BinTreeT);//计算总结点数

intleafs(BinTreeT);//计算总叶子数

BinTreeswap(BinTreeT);//交换左右子树

BinTreeT;

printf("请输入先序序列(虚结点用空格表示):

\n");

CreateBinTree(&T);

ListBinTree(T);

printf("\n");

DisplayBinTree(T);

printf("前序遍历:

\n");

Preorder(T);

printf("\n");

printf("中序遍历:

\n");

Inorder(T);

printf("\n");

printf("后序遍历:

\n");

Postorder(T);

printf("\n");

printf("二叉树的总结点数为%d\n",nodes(T));

printf("二叉树的总叶子结点数为%d\n",leafs(T));

T=swap(T);

ListBinTree(T);

printf("\n");

}

//构造二叉链表

voidCreateBinTree(BinTree*T)

{

//在此插入必要的语句

}

//用广义表表示二叉树

voidListBinTree(BinTreeT)

{

//在此插入必要的语句

}

//用凹入表表示二叉树

voidDisplayBinTree(BinTreeT)

{

//在此插入必要的语句

}

//前序遍历二叉树

voidPreorder(BinTreeT)

{

//在此插入必要的语句

}

//中序遍历二叉树

voidInorder(BinTreeT)

{

//在此插入必要的语句

}

//后序遍历二叉树

voidPostorder(BinTreeT)

{

//在此插入必要的语句

}

//计算总结点数

intnodes(BinTreeT)

{

//在此插入必要的语句

}

//计算总叶子数

intleafs(BinTreeT)

{

//在此插入必要的语句

}

//交换左右子树

BinTreeswap(BinTreeT)

{

//在此插入必要的语句

}

【实验报告】

《数据结构和算法》实验报告三

学院:

班级:

学号:

姓名:

日期:

程序名:

L61.CPP

一、上机实验的问题和要求:

要求采用二叉链表作为存储结构,完成二叉树的建立,前序、中序和后序遍历的操作,求所有叶子及结点总数的操作等。

具体实现要求:

i.基于先序遍历的构造算法:

输入是二叉树的先序序列,但必须在其中加入虚结点以示空指针的位置。

假设虚结点输入时用空格字符表示。

ii.用广义表表示所建二叉树。

iii.分别利用前序遍历、中序遍历、后序遍历所建二叉树。

iv.求二叉树结点总数,观察输出结果。

v.求二叉树叶子总数,观察输出结果。

vi.交换各结点的左右子树,用广义表表示法显示新的二叉树。

vii.(★)二叉树采用链接存储结构,其根结点指针为T,设计一个算法对这棵二叉树的每个结点赋值:

(注意要修改DataType类型)

a.叶结点的值为3

b.只有左孩子或右孩子的结点则其值分别等于左孩子或右孩子的值

c.左、右孩子均有的结点,则其值等于左、右孩子结点的值之和

d.用广义表表示法显示所建二叉树

二、源程序及注释:

三、运行输出结果:

四、调试和运行程序过程中产生的问题及采取的措施:

实验四Huffman树

【实验目的】

理解建立Huffman树的算法。

【实验平台】

操作系统:

Windows2000或WindowsXP

开发环境:

C或C++

【实验内容及要求】

阅读理解建立Huffman树的算法,对该算法进行运行及调试。

具体实现要求:

1.调试并运行Huffman算法。

2.(★)求Huffman树的带权路径长度WPL。

【参考框架】

#include

#include

#include

//Huffman树的存储结构

#definen100//叶子数目

#definem2*n-1//树中结点总数

typedefstruct//结点类型

{floatweight;//权值,不妨设权值均大于零

intlchild,rchild,parent;//左右孩子及双亲指针

}HTNode;

typedefHTNodeHuffmanTree[m];//HuffmanTree是向量类型

typedefstruct

{charch;//存储字符

charbits[n+1];//存放编码位串

}CodeNode;

typedefCodeNodeHuffmanCode[n];

voidInitHuffmanTree(HuffmanTreeT);//初始化Huffman树

voidInputWeight(HuffmanTreeT);//输入权值

voidSelectMin(HuffmanTreeT,inti,int*p1,int*p2);

voidmain()

{

voidCreateHuffmanTree(HuffmanTreeT);//构造Huffman树

voidCharSetHuffmanEncoding(HuffmanTreeT,HuffmanCodeH);

HuffmanTreeT;

HuffmanCodeH;

CreateHuffmanTree(T);

CharSetHuffmanEncoding(T,H);

}

voidCreateHuffmanTree(HuffmanTreeT)

{//构造Huffman树,T[m-1]为其根结点

inti,p1,p2;

InitHuffmanTree(T);//将T初始化

InputWeight(T);//输入叶子权值至T[0..n-1]的weight域

for(i=n;i

{SelectMin(T,i-1,&p1,&p2);

//在T[0..i-1]中选择两个权最小的根结点,其序号分别为p1和p2

T[p1].parent=T[p2].parent=i;

T[i].lchild=p1;//最小权的根结点是新结点的左孩子

T[i].rchild=p2;//次小权的根结点是新结点的右孩子

T[i].weight=T[p1].weight+T[p2].weight;

}

}

voidInitHuffmanTree(HuffmanTreeT)

{//初始化Huffman树

inti;

for(i=0;i

{

T[i].weight=0;

T[i].lchild=T[i].rchild=T[i].parent=NULL;

}

}

voidInputWeight(HuffmanTreeT)

{//输入权值

inti;

for(i=0;i

{

printf("请输入第%d个权值:

",i+1);

scanf("%f",&T[i].weight);

}

}

voidSelectMin(HuffmanTreeT,inti,int*p1,int*p2)

{//在T中选择两个权最小的根结点

intj;

floatmin1,min2;

min1=min2=-1;

for(j=0;j<=i;j++)

if(T[j].parent==NULL)

{

if(T[j].w

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

当前位置:首页 > 农林牧渔 > 林学

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

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