数据结构实验指导(初学内容)

实验一  线性表的顺序表示与实现

1.实验目的

(1)   掌握线性表的顺序存储结构;

(2)   验证顺序表及其基本操作的实现;

(3)   掌握数据结构及算法的程序实现的基本方法。

2.实验内容

(1)    建立含有若干个元素的顺序表;

(2)    对已经建立的顺序表实现插入、删除、查找、合并等基本操作。

3.实现算法

首先,定义顺序存储结构如下:

Typedef  struct {

Elemtype *elem;

Int  length;

Int  listsize;

}sqlist;

其次,建立含有n个元素的顺序表,算法如下:

Status InitList_Sq( SqList
&
L ) {   // 构造一个空的顺序表

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

if (!L.elem)  exit(OVERFLOW);

L.length = 0;

L.listsize = LIST_INIT_SIZE

return OK;}

最后,对建立的顺序表设计插入、删除、查找等基本操作的算法如下:

Status ListInsert_Sq(SqList
&L, int i, ElemType e) {

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

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

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;  
return OK;}

Status ListDelete_Sq (SqList
&L, int i, ElemType &e)
{
//删除算法

if ((i < 1) || (i > L.length)) 
return ERROR;

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

e = *p;

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

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

--L.length;

return OK;}

int  locate_sq(SqList  L ,elemtype x)  //查找算法

{    for(i=0;i<L.length;i++)

If(L.elem[i]==x)  return i+1;

return 0;

}

4.根据上面设计的算法,用C/C++语言实现,调试通过并输出正确的结果。

实验二  线性表的链式表示与实现

1.实验目的

(1)   掌握线性表的链接存储结构;

(2)   验证单链表及其基本操作的实现;

(3)   进一步掌握数据结构及算法的程序实现的基本方法。

2.实验内容

(1)   
用头插法和尾插法建立含有若干个元素的带头结点的单链表;

(2)   
对已经建立的单链表实现插入、删除、查找等基本操作。

3.实现算法见课本算法2.8至算法2.11

4.根据上面设计的算法,用C/C++语言实现,调试通过并输出正确的结果。

实验三栈及其应用(注意:如只有七次实验则三、四实验合成一次完成)

1.实验目的

(1)   掌握栈的顺序存储结构;

(2)   掌握栈的操作特性;

(3)   掌握基于顺序栈的基本操作的实现方法。

2.实验内容

(1)   
建立一个空栈;

(2)   
对已经建立的栈实现入栈、出栈、取栈顶元素等基本操作。

3.实现算法见课本

4.根据上面设计的算法,用C/C++语言实现,调试通过并输出正确的结果。

实验四  队列及其应用

1.实验目的

(1)   掌握队列的链式存储结构;

(2)   掌握队列的操作特性;

(3)   掌握链队列的基本操作的实现方法。

2.实验内容

(1)   
建立一个空队列;

(2)   
对已经建立的队列实现插入、删除等基本操作

3.实现算法见课本

4.根据上面设计的算法,用C/C++语言实现,调试通过并输出正确的结果。

实验五二叉树的应用

1.实验目的

(1)    掌握二叉树的逻辑结构;

是n(n>=0)个结点的有限集,其子树分为互不相交的两个集合,分别称为左子树和右子树,左子树和右子树也是二叉树。

(2) 
掌握二叉树的二叉链表存储结构;

二叉链表

结点除包括元素自身的信息外,还包括指向其左、右子树的指针。即结点要包括数据域,左子树指针域和右子树指针域。

(3) 
掌握基于二叉链表存储的二叉树的遍历操作的实现。

先序遍历,中序遍历,后序遍历

2.实验内容

(1)   
建立一棵含有n个结点的二叉树;

(2)   
前序(或中序、后序)遍历该二叉树;

(3) 
求该树叶子结点个数。

3.实现算法见课本

1)建立二叉树算法

void CreateBiTree(BiTree &T){

// 按先序序列输入二叉树中结点的值(一个字符),空格表示空树,

// 构造二叉链表表示的二叉树T。

       scanf(&ch) ;

       if(ch == ‘ ’) T=NULL;           //
建空树

       else {

if(!(T=(BiTNode *)malloc(sizeof(BiTNode)))) eixt(OVERFLOW);

T->data = ch;                     // 生成根结点

CreateBiTree(T->Lchild);   // 递归建(遍历)左子树

CreateBiTree(T->Rchild);  // 递归建(遍历)右子树

} // else

       return OK;

} // CreateBiTree

2)先序遍历二叉树

Status PreOrderTraverse(BiTree T,Status(*visit)(TElemType e)){

// 采用二叉链表存储结构,visit是对元素操作的应用函数,

// 先序遍历二叉树T的递归算法,对每个数据元素调用函数visit。

// 最简单的visit函数是输出元素的值。

    if (T) {    

       visit(T->data);

       PreOrderTraverse(T->lchild, visit);

          PreOrderTraverse(T->rchild, visit);

    }//if

}// PreOrderTraverse

3) 
求该树叶子结点个数。

算法思想:对二叉树“遍历”一遍,并在遍历过程中对“叶子结点计数”
即可。为了在遍历的同时进行计数,在算法的参数中设         
一个“计数器”。这个遍历的次序可以随意,即先序或中序或后序均可。

void CountLeaf (BiTree T, int& count){

// 先序遍历二叉树,以 count 返回二叉树中叶子结点的数目

  if ( T ) {

      if ((!T->Lchild) && (!T->Rchild)) count++;

      CountLeaf( T->Lchild, count);

      CountLeaf( T->Rchild, count);

   }// if

}// CountLeaf

4.根据上面设计的算法,用C/C++语言实现,调试通过并输出正确的结果。

5. 扩展求二叉树的深度

实验六  图的遍历与应用

一.实验目的

(1)   掌握图的逻辑结构;

(2)   掌握图的邻接矩阵存储结构和邻接表存储结构;

(3)   掌握图的邻接矩阵存储结构和邻接表存储结构下遍历算法的实现。

二.实验内容

[问题描述]

对给定图,实现图的深度优先遍历和广度优先遍历。

[基本要求]

以邻接表或邻接矩阵为存储结构,实现连通无向图的深度优先和广度优先遍历。以用户指定的结点为起点,分别输出每种遍历下的结点访问序列。

(1)建立无向图的邻接矩阵存储;

(2)对已经建立的无向图进行深度优先和广度优先遍历操作。

(3)建立有向图的邻接表存储;

(4)对已经建立的有向图进行深度优先和广度优先遍历操作。

三、实验前的准备工作

1、掌握图的相关概念。

2、掌握图的逻辑结构和存储结构。

图的数组(邻接矩阵)存储表示

#define  INFINITY        INT_MAX;           // 最大值∞

#define  MAX_VERTEX_NUM 20;           // 最大顶点个数

typedef enum {DG,DN,UDG,UDN} GraphKind;// {有向图,有向网,无向图,无向网}

typedef struct ArcCell {

VRType     adj;      // VRType是顶点关系类型。对无权图,用1或0

// 表示相邻否;对带权图,则为权值类型。

InfoType   *info;        // 该弧相关信息的指针

} ArcCell, AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];

typedef struct {

VertexType    vexs[MAX_VERTEX_NUM];    // 顶点信息

AdjMatrix arcs;            // 邻接矩阵

int        vexnum, arcnum;       // 图的当前顶点数和弧(边)数

GraphKind kind;            // 图的种类标志

} MGraph;

图的邻接表存储表示:

#define MAX_VERTEX_NUM  20;

typedef struct ArcNode {

int           adjvex;   // 该弧所指向的顶点的位置

struct ArcNode    *nextarc;  // 指向下一条弧的指针

InfoType      *info;    // 该弧相关信息的指针

} ArcNode;

typedef struct VNode {

VertexType    data;       // 顶点信息

ArcNode    *firstarc;     // 指向第一条依附该顶点的弧

} AdjList[MAX_VERTEX_NUM];

typedef struct {   

AdjList vertices;        // 顶点数组

int vexnum, arcnum;       // 图的当前顶点数和弧数

int kind;              // 图的种类标志

} ALGraph;

3、掌握图的两种遍历算法的实现

深度优先遍历算法

 

具体算法:

Boolen visited[MAX];                //访问标志数组

Status (* visitFunc)(int v);         //函数变量

void DFSTraverse(Graph G, Status( * visit)(int v)){

// 对图G作深度优先遍历

       visitFunc=visit;             //使用全局变量visitFunc

//使DFS不必设函数指针参数

       for (v=0; v<G.vexnum; ++v)

visited[v] = FALSE;          //
访问标识数组初始化

       for (v=0; v<G.vexnum; ++v)

if (!visited[v]) DFS(G, v);        // 对尚未访问的

//顶点调用DFS

}

void DFS(Graph G, int v){

// 从第v个顶点出发递归地对图G进行深度优先搜索

       visitFunc( v );
                  // 访问第 v
个顶点

       visited[v] = TRUE;
       // 设访问标志

       for ( w=FirstAdjVex(G,v); w>=0;w=NextAdjVex(G,v,w))

              if (!visited[w]) DFS(G, w);   //
对v
的尚未访问过的邻接

//顶点w递归调用DFS

} // DFS

广度优先遍历算法:

具体算法:

void BFSTraverse(Graph G, Status( * visit)(int v)){

// 对图G进行广度优先搜索遍历

       for (v=0; v<G.vexnum; ++v) visited[v] = FALSE;

       InitQueue(Q);                         //
设置空队列 Q

       for ( v=0; v<G.vexnum; ++v )

          if ( !visited[v]){
                           // v未被访问

visited[v] = TRUE; Visit (v);           //
访问v

EnQueue(Q, v);                    // v
入队列

while (!QueueEmpty(Q)) {

DeQueue(Q, u);           //
队头元素出队并置为 u

for ( w=FirstAdjVex(G,u); w>=0; w=NextAjdVex(G,u,w))

if (! visited[w] ) {

       visited[w] = TRUE; Visit(w);  //
访问第 w 个顶点

EnQueue(Q, w);         

} // if

} // while

} // if

    DestroyQueue(Q);

} // BFSTraverse

4.根据上面设计的算法,用C/C++语言实现,调试通过并输出正确的结果。

 

四、实验报告要求

1、实验报告要按照实验报告格式规范书写。

2、实验上要写出多批测试数据的运行结果。

3、结合运行结果,对程序进行分析。

实验七 
查找技术

1. 
实验目的

(1)    掌握顺序查找和折半查找算法的基本思想;

(2)    掌握顺序查找和折半查找算法的实现方法;

(3)    掌握顺序查找和折半查找算法的时间性能。

2. 
实验内容

对给定的长度为n的数组,分别使用顺序查找、折半查找查找数组中与给定值k相等的元素。

3. 
实现算法见课本

4.根据上面设计的算法,用C/C++语言实现,调试通过并输出正确的结果。

实验八  
内部排序

1. 
实验目的

(1)    掌握直接插入排序、冒泡排序和简单选择排序的基本思想;

(2)    掌握直接插入排序、冒泡排序和简单选择排序的实现方法;

(3)    掌握快速排序的基本思想和实现方法。

2. 
实验内容

对一组数据进行直接插入排序、冒泡排序、简单选择排序和快速排序。(升序)

3. 
实现算法见课本

4.根据上面设计的算法,用C/C++语言实现,调试通过并输出正确的结果。

时间: 2024-10-12 12:02:27

数据结构实验指导(初学内容)的相关文章

操作系统实验指导书(完整版)

操作系统实验指导书 烟台大学计算机学院 操作系统课程组 2008-9-20 第一部分  操作系统上机指导   Linux操作系统环境: RedHat Enterprise Linux ES release 3 (Taroon Update 1) (2.4.21-9.EL) Red Flag Linux release 4.0 (HOT) (2.4)   登录到系统 常用命令练习: 用root账号(超级用户)注册,口令为computer(注意大小写).注册成功出现#号(超级用户系统提示符,普通用户

lingo运筹学上机实验指导

<运筹学上机实验指导>分为两个部分,第一部分12学时,是与运筹学理论课上机同步配套的4个实验(线性规划.灵敏度分析.运输问题与指派问题.最短路问题和背包问题)的Excel.LONGO和LINDO求解方法和3个大综合作业,并配有解答和操作的视频:第二部分16学时,介绍LINGO求解运筹学中线性.整数等问题,主要侧重介绍解决大规模的运筹学问题,包含10个实验和1个综合大实验,并附有求解过程.答案及相应的视频,且答案经过上课检验全部正确.建议在上完“运筹学”的理论课和基本了解Excel.LONGO和

SDUT 3361 数据结构实验之图论四:迷宫探索

数据结构实验之图论四:迷宫探索 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss Problem Description 有一个地下迷宫,它的通道都是直的,而通道所有交叉点(包括通道的端点)上都有一盏灯和一个开关:请问如何从某个起点开始在迷宫中点亮所有的灯并回到起点? Input 连续T组数据输入,每组数据第一行给出三个正整数,分别表示地下迷宫的结点数N(1 < N <= 1000).边数M(M <= 30

SDUT 2141 【TEST】数据结构实验图论一:基于邻接矩阵的广度优先搜索遍历

数据结构实验图论一:基于邻接矩阵的广度优先搜索遍历 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss Problem Description 给定一个无向连通图,顶点编号从0到n-1,用广度优先搜索(BFS)遍历,输出从某个顶点出发的遍历序列.(同一个结点的同层邻接点,节点编号小的优先遍历) Input 输入第一行为整数n(0< n <100),表示数据的组数.对于每组数据,第一行是三个整数k,m,t(0<

SDUT 3343 数据结构实验之二叉树四:还原二叉树

数据结构实验之二叉树四:还原二叉树 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 给定一棵二叉树的先序遍历序列和中序遍历序列,要求计算该二叉树的高度. Input 输入数据有多组,每组数据第一行输入1个正整数N(1 <= N <= 50)为树中结点总数,随后2行先后给出先序和中序遍历序列,均是长度为N的不包含重复英文字母(区分大小写)的字符串. Output 输出一个整数,即该二叉树的

数据结构实验之图论二:基于邻接表的广度优先搜索遍历

数据结构实验之图论二:基于邻接表的广度优先搜索遍历 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 给定一个无向连通图,顶点编号从0到n-1,用广度优先搜索(BFS)遍历,输出从某个顶点出发的遍历序列.(同一个结点的同层邻接点,节点编号小的优先遍历) 输入 输入第一行为整数n(0< n <100),表示数据的组数. 对于每组数据,第一行是三个整数k,m,t(0<k<100,0<m<(k-1)*k/2,

SDUT 3346 数据结构实验之二叉树七:叶子问题

数据结构实验之二叉树七:叶子问题 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 已知一个按先序输入的字符序列,如abd,,eg,,,cf,,,(其中,表示空结点).请建立该二叉树并按从上到下从左到右的顺序输出该二叉树的所有叶子结点. Input 输入数据有多行,每一行是一个长度小于50个字符的字符串. Output 按从上到下从左到右的顺序输出二叉树的叶子结点. Example Inpu

SDUT 3347 数据结构实验之数组三:快速转置

数据结构实验之数组三:快速转置 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 转置运算是一种最简单的矩阵运算,对于一个m*n的矩阵M( 1 = < m < = 10000,1 = < n < = 10000 ),它的转置矩阵T是一个n*m的矩阵,且T( i , j )=M( j , i ).显然,一个稀疏矩阵的转置仍然是稀疏矩阵.你的任务是对给定一个m*n的稀疏矩阵( m

SDUT 3342 数据结构实验之二叉树三:统计叶子数

数据结构实验之二叉树三:统计叶子数 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 已知二叉树的一个按先序遍历输入的字符序列,如abc,,de,g,,f,,, (其中,表示空结点).请建立二叉树并求二叉树的叶子结点个数. Input 连续输入多组数据,每组数据输入一个长度小于50个字符的字符串. Output 输出二叉树的叶子结点个数. Example Input abc,,de,g,,f