数据结构学习报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
输入源代码
调试,执行。
完成,下例程序都按此步骤进行。
2.链表的插入,删除,查找,排序。
#include "stdio.h"
#include "stdlib.h"
#include "io.h"
#include "math.h"
#include <iostream>
#include "time.h"/*The Data Structure of Link List*/
return OK;
}
/*删除元素(删除第n个元素)*/
Status Delete(SeqList *seqList,int n,ElemType *e)
{
int k;
//判断数组是否为空
if (seqList->length==0) return ERROR;
//判断n的位置是否合法
if (n<1||n>seqList->length) return ERROR;
{
int k;
//检查数组是否已满
if (seqList->length>=MAXSIZE) return ERROR;
//检查n的位置是否超出范围
if (n<1||n>seqList->length+1) return ERROR;
//若插入数据位置不在表尾
if (n<=seqList->length)
最小生成树:此生成树的边的权重之和是所有生成树中最小的;
AOV网:结点表示活动的网;
AOE网:边表示活动的持续时间的网;
图也有广度来自百度文库先遍历和深度优先遍历。
最小生成树:prime算法和克鲁斯卡尔算法。
最短路径:迪克斯特拉算法。
二叉搜索树:专门应用于查找的二叉树。二叉搜索树的每个结点值不小于左子树节点值,不大于右子树节点值。
{
printf("%d\n",c);
return OK;
}
void main()
{
//声明变量
SeqList seqList; //创建顺序表
int j,k;
Status i;
ElemType elem;
printf("\n*****************初始化************************\n");
稠密图:边很多的图;
权重:图中的边可能会带有一个权重,为了区分边的长短;
网:带有权重的图;
度:与特定顶点相连接的边数;
出度、入度:对于有向图的概念,出度表示此顶点为起点的边的数目,入度表示此顶点为终点的边的数目;
环:第一个顶点和最后一个顶点相同的路径;
简单环:除去第一个顶点和最后一个顶点后没有重复顶点的环;
{
i=Insert(&seqList,1,j);//在表头依次插入1~5
}
Display(&seqList);
printf("\n*****************删除一条数据************************\n");
i=Delete(&seqList,1,&elem);
if (i==OK) printf("删除成功\n");
适配器:以某种既有容器作为底部结构,定义新接口,以满足某种特殊用途的容器。
链栈:用链表类模板List作为底部结构,插入和删除都在链表一端的适配器。
链队列:用链表类模板List作为底部结构,插入在链表一端,删除在链表另一端的适配器。
优先级链队列:以优先级最高的元素为出队元素的队列。
二叉树:二叉树(B树)是具有n(n>=0)个结点的集合,每个结点最多有一个前驱,两个后继。只有一个结点无前驱,这个结点称为根。没有后继的结点称为叶子。叶子以外的结点称为分支结点。一个结点的后继称为该结点的孩子,孩子又分为左孩子与右孩子。一个结点的前驱称为该结点的双亲。
排序方法:直接插入排序,折半插入排序,希尔排序,起泡排序,快速排序,直接选择排序和堆排序等。
以上为概念的简单罗列,下面结合算法给出实例。String类和Vector类将在C++中介绍,这里不再赘述。
第二章 程序实例
1.顺序表的插入,删除,查找,求长度。
/*包含头文件*/
#include "stdio.h"
*e=seqList->data[n-1];
//如果删除不是最后位置
if (n<seqList->length)
{
//将删除位置后继元素依次前移
for (k=n;k<seqList->length;k++)
{
seqList->data[k-1]=seqList->data[k];
}
}
//表长减1
seqList->length--;
{
//将要插入位置之后元素依次向后移动一位
for (k=seqList->length-1;k>=n-1;k--)
{
seqList->data[k+1]=seqList->data[k];
}
}
//将新元素插入到腾出的位置,并将表长加1
seqList->data[n-1]=e;
seqList->length++;
树:树是具有n(n>=0)个结点的集合,每个结点最多有一个前驱,可以有多个后继。只有一个结点无前驱,这个结点称为根。没有后继的结点称为叶子。叶子以外的非根结点称为分支结点。一个结点的后继称为该结点的孩子,孩子不分顺序。一个结点的前驱称为该结点的双亲。
树的表示法:广义表示法、双亲表示法、左孩子—右兄弟表示法和孩子链表示法。
连通图:任意两个顶点都相互连通的图;
极大连通子图:包含竟可能多的顶点(必须是连通的),即找不到另外一个顶点,使得此顶点能够连接到此极大连通子图的任意一个顶点;
连通分量:极大连通子图的数量;
强连通图:此为有向图的概念,表示任意两个顶点a,b,使得a能够连接到b,b也能连接到a 的图;
生成树:n个顶点,n-1条边,并且保证n个顶点相互连通(不存在环);
void Display(SeqList *seqList)
{
int i;
printf("\n********展示数据********\n");
for (i=0;i<seqList->length;i++)
{
Visit(seqList->data[i]);
}
printf("\n");
}
Status Visit(ElemType c)
#include "stdlib.h"
#include "io.h"
#include "math.h"
#include "time.h"
/*定义常量,类似于C#中的const*/
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define MAXSIZE 20
Display(&seqList);
printf("\n*****************查找元素by位置************************\n");
k=GetDataByIndex(&seqList,2);
printf("第2个元素为%d\n",k);
printf("\n*****************获取表的当前长度************************\n");







朱春山
2016.3.26
第一章 概念
顺序表:顺序表是在计算机内存中以数组的形式保存的线性表,是指用一组地址连续的存储单元依次存储数据元素的线性结构。线性表采用顺序存储的方式存储就称之为顺序表。
栈:后进先出的线性表,只在表尾进行删除和插入操作。
队列:队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。
i=InitSeqList(&seqList);//&表示地址
printf("初始化后表的长度为:%d\n",seqList.length);
printf("\n*****************插入五条数据************************\n");
for (j=1;j<=5;j++)
using namespace std;
typedef int DataType;
typedef struct LinkNode
{
DataType data;
struct LinkNode *next;
无向边:边是没有方向的,写为(a,b)
有向边:边是有方向的,写为<a,b>
有向边也成为弧;开始顶点称为弧尾,结束顶点称为弧头;
简单图:不存在指向自己的边、不存在两条重复的边的图;
无向完全图:每个顶点之间都有一条边的无向图;
有向完全图:每个顶点之间都有两条互为相反的边的无向图;
稀疏图:边相对于顶点来说很少的图;
return OK;
}
/*查找第n个元素*/
int GetDataByIndex(SeqList *seqList,int n)
{
//检查位置是否超出范围
if (n<1||n>seqList->length) return ERROR;
return seqList->data[n-1];
}
/*打印结果*/
(2)深度为k的二叉树至多有2k+1-1个结点;
(3)具有n个结点的完全二叉树其深度为[log2n]。
二叉树的存储结构:顺序存储结构和链式存储结构。顺序存储可以转换成链式存储。
二叉树的层次遍历:出队之前访问和出队之后访问。
二叉树的遍历顺序:(1)先序遍历:首先访问根,再先序遍历左(右)子树,最后先序遍历右(左)子树。
k=GetSeqListLen(&seqList);
printf("当前表中有%d个元素\n",k);
getchar();
}
程序测试:打开Visual C++,打开新建项目
选择win32控制台程序,确定项目名称和项目位置,点击确认。
单击下一步
选择空项目,点击完成。
在项目中新建文件
选择c++文件,确定文件名,点击添加。
链表:链表即链式存储结构,链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理。但是链表失去了数组随机读取的优点,同时链表由于增加了结点的指针域,空间开销比较大。链表最明显的好处就是,常规数组排列关联项目的方式可能不同于这些数据项目在记忆体或磁盘上顺序,数据的存取往往要在不同的排列顺序中转换。链表允许插入和移除表上任意位置上的节点,但是不允许随机存取。链表有很多种不同的类型:单向链表,双向链表以及循环链表。
{
seqList->length=0;
return OK;
}
/*求顺序表的长度*/
int GetSeqListLen(SeqList *seqList)
{
return seqList->length;
}
/*插入元素(在第n个元素之前的位置插入新元素)*/
Status Insert(SeqList *seqList,int n,ElemType e)
特殊二叉树:(1)若设二叉树的高度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第h层有叶子结点,并且叶子结点都是从左到右依次排布,这就是完全二叉树。
(2)除了叶结点外每一个结点都有左右子叶且叶子结点都处在最底层的二叉树。
二叉树基本性质:(1)二叉树第i层上的结点数目最多为2i;
/*定义类型的同义字*/
typedef int Status;
typedef int ElemType;
typedef struct //定义顺序表
{
ElemType data[MAXSIZE];
int length;
}SeqList;
/*初始化*/
Status InitSeqList(SeqList *seqList) //*L表示指向顺序表SeqList的指针
树的遍历主要有广度优先遍历、深度优先遍历和后根遍历。
广度优先遍历:从树的第一层开始,逐层的、从左至右逐个访问结点。
深度优先遍历:(1)访问根结点;
(2)依次深度优先遍历以该结点的孩子为根。
图:由有穷、非空点集和边集合组成,简写成G(V,E);
无向图:图中每条边都没有方向;
有向图:图中每条边都有方向;
(2)中序遍历:首先中序遍历左(右)子树,再访问根,最后中序遍历右(左)子树
(3)后序遍历:首先后序遍历左(右)子树,再后序遍历右(左)子树,最后访问根。
堆:堆是一种按照层次顺序连续存储的、特殊的二叉树,一般分大根堆和小根堆。小根堆的特点是每一个结点的键都不大于其左右孩子的键;大根堆的特点是每一个结点的键都不小于其左右孩子的键。
相关文档
最新文档