线性结构即将告一段落,来个简单总结一下。
连续存储(数组)
//定义一个数组结构体
struct Arr
{
int * pBase; //保存数组的指针
int len; //保存数组的长度
int cnt; //数组元素的有效个数
};
对数组的操作,主要体现在数据的移动上。比如在插入一个元素和删除一个元素的时候,改位置之后的元素要相对应的前移或后移。结构体内需要三个数组的指针,数组的长度,数组中有效元素的个数,通过这三个参数完成对数组的增添,删除和输出。
离散存储(链表)
//创建一个结构体
struct Node
{
int data;
struct Node * pNext;
};
相对于数组来说,链表在存储删除过程更加的灵活,增添元素和删除元素,不再需要对其后的元素进行移动,减少了时间复杂度。创建链表需要多创建一个头指针和头节点,这样方便了对链表的操作。
栈
//节点结构体
typedef struct Node
{
int data;
struct Node * pNext;
}NODE,*PNODE;
//栈结构体
typedef struct Stack
{
PNODE pTop;
PNODE pBottom;
}STACT,*PSTACT;
栈的特性是“先进后出”,所有相对于链表来说,栈的功能受到了限制,比如说不能从中间插入和删除。栈的结构体中有两个元素,指针栈顶和指针栈底,栈底永远指向一个无没有实际意义的元素,这就好像链表中的头节点,都是方便了操作。
队列
//定义机构体
typedef struct Queue
{
int * pBash; //存放数组
int front; //队列第一个元素下标
int rear; //队列最后一个元素的下一个元素的下标
}QUEUE,* PQUEUE;
队列的操作要比之前的三种方式都复杂一些,尤其是要用数组实现静态队列的时候,必须是一个循环队列。结构体中包含三个元素,第一个指针变量保存的是数组的首地址,front是队列头部的下标,rear保存的是队列尾部的下标,队列的特性是"先进先出",需要注意的是,在判断静态队列是否已满的情况,更常用的做法是,空出一个存储单元不使用,判断【queue -> front == (queue -> rear + 1)%数组长度】即可。同样的,队列也不允许在数组的中间进行插入和删除。
学PHP的小蚂蚁 博客 http://my.oschina.net/woshixiaomayi/blog
来源:oschina
链接:https://my.oschina.net/u/1423209/blog/597888