[数据结构]之调研总结

这篇博文主要总体上讲下常用的数据结构分类以及结构体表示。接下来的博文会针对每个数据结构介绍其基本操作及应用。

数据结构又叫抽象数据结构(ADT),顾名思义,它是一种抽象的概念,是一个事物的基本属性的结合,通常用结构体(struct)来表示这个属性集合。

数据结构可以分为线性结构和非线性结构。


一  线性结构

线性结构中的数据元素之间是一种线性关系,数据元素一个接一个地排列。如排除的队列、表格中一行行的记录等。

线性表的数学表示模型:a1,a1,a2,...a(n)。其中线性表与计算机内存中数据组织、存储方式类似,它在内存中开辟一片存储空间,元素依次存放在内存上,数据元素间的前驱和后继关系表现在存放位置的前后关系上。栈和队列只是属于逻辑上的概念。 


注:下面介绍的数据结构中数据域里面的数据类型都是整型

1  线性表

线性表可以分为顺序表和链表。最主要的区别是顺序表使用的内存空间必须是连续的,链表适用的内存空间可以不连续。如上图,就是一块连续的内存地址。
(1)顺序表抽象数据结构(ADT):

顺序表的基本属性是其存放的数据(data),所以, 如果我们完全用结构体概念表示的化,它的抽象数据结构为:

typedef struct Node
{	
	int data[20];
};

显而意见,有点多此一举,仅仅是便于理解。


(2)链表的抽象数据结构(ADT):

链表只需两个属性即可完全表示,分别是数据域(data)和指针域(next)。

故其抽象数据结构为:顺序存储方式
typedef struct Node
{	
	int data;
	struct Node *next;
};


讲到这里,需要提醒注意的是,线性表的存储方式比较接近内存的数据存储方式,由于下面要讲的数据结构都是抽象的概念,内存中并没有相应的存储结构,所以它们都是基于顺序表和链表进行存储的,只是组织方式不同。队列和栈不用说,本身就是线性表,适用顺序表或者链表都可以存储; 树可以仅仅使用顺序表或者链表进行存储;  图及网结构比较复杂,是使用顺序表和链表的组合进行存储。

2  队列(queue)
队列的特点是先入先出(First In First Out, FIFO),它也是一种线性表,只允许在表的前端(front)进行删除操作,即Dequeue(出队),后端(rear)进行插入操作,即Enqueue(入队)。


队列的基本属性是,队头(front), 队尾(rear),以及队内存放的数据(data)。队列的存储形式有两种,一中是适用数组实现,一种适用链表实现。包括后面的数据结构也是如此。简单期间,这篇博文都适用数组实现。

故其抽象数据结构为:
typedef struct queueNode
{
	int data[MAXSIZE];    //队列空间大小是MAXSIZE
	int front;
	int rear;
};

参考:
http://blog.csdn.net/zhuimengfuyun/article/details/9423825

3  栈(stack)
栈这种线性表的特点是先进后出(Last In First Out, LIFO),只准需在表的末端进行压栈(push) 和弹栈(pop)操作,形象地我们称该位置为栈顶(top)。

栈的基本属性是栈内存放的数据(data),及栈顶(top)
故其抽象数据结构:顺序存储方式
typedef struct stackNode
{
	int data[MAXSIZE];  //栈的空间大小是maxsize
	int top;
};

参考:
http://zh.wikipedia.org/wiki/%E5%A0%86%E6%A0%88


二  非线性结构
简单介绍后面三种非线性结构的基本区别,树结构没有回路的图,图结构有回路但是边上没有权值,,网结构有回路且边上有权值的图。所以说网的两种存储方式都是可以应用在树结构和图结构上的。 我的理解就是网是边上的权值为1的图。

1  二叉树
二叉树与树的差别是,二叉树中任意节点的度不超过2。二叉树是一种有序树,即左右子树之间有顺序关系,规定为左前右后。


二叉树的基本属性是一个数据域(data)和两个指针域(*lchild, *rchild);
二叉树的抽象数据结构:
typedef strcut binaryTree
{
	int date;
	struct binaryTree *lchild;
	strcut binaryTree *rchild;
};



2  树
树是由n(n>=1)个有限结点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。
Hzll.jpg

树的存储方式有双亲表示法,孩子表示法,双亲孩子表示法,孩子兄弟表示法。其中孩子链表表示法跟图的邻接表存储方式非常类似,都是采用的是顺序表和链表相结合的方式存储,以单链表将所有父结点相同的孩子结点链接在一起,并将该链表的头指针和父结点构成树中的一个结点,全部父结点以顺序表形式组成构成树结构。

树的基本属性是一个数据域(data)和多个指针域(next);
孩子表示法的抽象数据结构为:
/*树的孩子链表存储表示*/
typedef struct ChildNode
{                                              // 孩子结点
  int child;
  struct ChildNode *next;
} ChildPtr;

typedef struct 
{
  int data;                                // 结点的数据元素
  ChildPtr *firstchild;                     // 孩子链表头指针
} CTBox;

typedef struct 
{
  CTBox nodes[MAX_TREE_SIZE];            //结点个数
  int n, r;                              // 结点数和根结点的位置
} CTree;


参考:
http://see.xidian.edu.cn/cpp/html/986.html
http://zh.wikipedia.org/wiki/%E6%A0%91_(%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84)

3  图 与网
图的特点是有有回路,它有两种存储方式邻接表存储方式和邻接矩阵

(1) 邻接表
邻接表(Adjacency List)是图的一种顺序存储与链式存储结合的存储方法。邻接表表示法类似于树的孩子链表表示法。就是对于图G 中的每个顶点vi,将所有邻接于vi 的顶点vj 链成一个单链表,这个单链表就称为顶点vi 的邻接表,再将所有点的邻接表表头放到数组中,就构成了图的邻接表。

要是图,则权值都一样,不需要表示,边表属性如下:

要是网,各边权值可能不同,所以边表里有属性记录:

下面给出图的邻接表:


(2)邻接矩阵
邻接矩阵(Adjacency Matrix)的存储结构,就是用一维数组存储图中顶点的信息,用矩阵表示图中各顶点之间的邻接关系。假设图G=(V,E)有n 个确定的顶点,即V={v0,v1,…,vn-1},则表示G 中各顶点相邻关系为一个n×n 的矩阵


,矩阵的元素为:

下面给出邻接表的抽象数据结构,与树的孩子链表表示法一致,不难理解,因为树是一种特殊的图。
#define MaxVerNum 100         /*最大顶点数为100*/
typedef struct node             /*边表结点*/
{             
	int adjvex;                      /*邻接点域*/
	struct node * next;      /*指向下一个邻接点的指针域*/
	// int info             /*若要表示网,则应增加一个数据域info*/
}EdgeNode;

typedef struct vnode
{ 
	int data;                        /*顶点域*/
	EdgeNode * firstedge;            /*边表头指针*/
}VertexNode,AdjList[MaxVerNum]


typedef struct
{
	AdjList vertices; 	  /*邻接表数组*/
	int n,e; 		/*顶点数和边数*/
}ALGraph; 			/*ALGraph 是以邻接表方式存储的图类型*/


参考:
http://zh.wikipedia.org/wiki/%E9%82%BB%E6%8E%A5%E8%A1%A8
http://see.xidian.edu.cn/cpp/html/992.html
http://see.xidian.edu.cn/cpp/html/991.html




















  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值