这篇博文主要总体上讲下常用的数据结构分类以及结构体表示。接下来的博文会针对每个数据结构介绍其基本操作及应用。
数据结构又叫抽象数据结构(ADT),顾名思义,它是一种抽象的概念,是一个事物的基本属性的结合,通常用结构体(struct)来表示这个属性集合。
数据结构可以分为线性结构和非线性结构。
一 线性结构
线性结构中的数据元素之间是一种线性关系,数据元素一个接一个地排列。如排除的队列、表格中一行行的记录等。线性表的数学表示模型:a1,a1,a2,...a(n)。其中线性表与计算机内存中数据组织、存储方式类似,它在内存中开辟一片存储空间,元素依次存放在内存上,数据元素间的前驱和后继关系表现在存放位置的前后关系上。栈和队列只是属于逻辑上的概念。
注:下面介绍的数据结构中数据域里面的数据类型都是整型
1 线性表
线性表可以分为顺序表和链表。最主要的区别是顺序表使用的内存空间必须是连续的,链表适用的内存空间可以不连续。如上图,就是一块连续的内存地址。
(1)顺序表抽象数据结构(ADT):
顺序表的基本属性是其存放的数据(data),所以, 如果我们完全用结构体概念表示的化,它的抽象数据结构为:
typedef struct Node
{
int data[20];
};
显而意见,有点多此一举,仅仅是便于理解。
(2)链表的抽象数据结构(ADT):

typedef struct Node
{
int data;
struct Node *next;
};
队列的特点是先入先出(First In First Out, FIFO),它也是一种线性表,只允许在表的前端(front)进行删除操作,即Dequeue(出队),后端(rear)进行插入操作,即Enqueue(入队)。
故其抽象数据结构为:
typedef struct queueNode
{
int data[MAXSIZE]; //队列空间大小是MAXSIZE
int front;
int rear;
};
http://blog.youkuaiyun.com/zhuimengfuyun/article/details/9423825
栈这种线性表的特点是先进后出(Last In First Out, LIFO),只准需在表的末端进行压栈(push) 和弹栈(pop)操作,形象地我们称该位置为栈顶(top)。

故其抽象数据结构:顺序存储方式
typedef struct stackNode
{
int data[MAXSIZE]; //栈的空间大小是maxsize
int top;
};
参考:
http://zh.wikipedia.org/wiki/%E5%A0%86%E6%A0%88
1 二叉树
二叉树与树的差别是,二叉树中任意节点的度不超过2。二叉树是一种有序树,即左右子树之间有顺序关系,规定为左前右后。
二叉树的抽象数据结构:
typedef strcut binaryTree
{
int date;
struct binaryTree *lchild;
strcut binaryTree *rchild;
};
树是由n(n>=1)个有限结点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。

树的基本属性是一个数据域(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)
图的特点是有有回路,它有两种存储方式邻接表存储方式和邻接矩阵
(1) 邻接表
邻接表(Adjacency List)是图的一种顺序存储与链式存储结合的存储方法。邻接表表示法类似于树的孩子链表表示法。就是对于图G 中的每个顶点vi,将所有邻接于vi 的顶点vj 链成一个单链表,这个单链表就称为顶点vi 的邻接表,再将所有点的邻接表表头放到数组中,就构成了图的邻接表。
邻接矩阵(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://see.xidian.edu.cn/cpp/html/992.html
http://see.xidian.edu.cn/cpp/html/991.html