线性表是最常用最简单的一种线性数据结构,它是具有相同类型的n(n≥0)个数据元素组成的有限序列。通常我们见到的有:数组,链表。而链表又分为单链表、双链表等不同种类。
单向链表
单向链表(单链表)是链表的一种,它由节点组成,每个节点都包含下一个节点的指针。
typedef struct node {
datatype data;
struct node * next;
}listnode;
单链表创建
通常我们创建一个空链表的时候指的是我们创建了一个头结点,这个节点指向了链表的第一个节点。
listnode * list_create() {
listnode * H;
H = (listnode *)malloc(sizeof(listnode));
if (H == NULL) {
printf("malloc failed!\n");
return NULL;
}
H->data = 0;
H->next = NULL;
return H;
}
单链表的操作
链表的操作通常有增删改查等:
具体的实现代码在这里不再呈现,相应的操作逻辑是:
增:在指定的节点A后添加节点B是创建一个新的节点B,将此B节点的指针指向指定位置节点A的下个节点,再将指定位置节点A的指针指向节点B。
删:删除指定节点A首先找到A的上个节点B,将B节点的指针指向A的下个节点C,随后释放A节点空间。
双向链表
双向链表(双链表)是链表的一种。和单链表一样,双链表也是由节点组成,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表。
template<class T>
struct DuLNode
{
T data;
DuLNode *prev;
DuLNode *next;
};
双向链表的相应操作
创建:双向链表的创建同样是创建了一个空节点,此时链表指针指向和此节点的头尾指针均指向当前节点
template<class T>
DoubleLink<T>::DoubleLink() : count(0)
{
// 创建“表头”。注意:表头没有存储数据!
phead = new DNode<T>();
phead->prev = phead->next = phead;
// 设置链表计数为0
//count = 0;
}
增:在指定的节点A,B中间添加节点C是创建一个新的节点C,将此C节点的头指针指向节点A尾指针指向B,再将A的尾指针B的头指针指向C。
删:删除AC节点中间的B节点是将A节点的尾指针指向C,将C节点头指针指向A,释放B节点
栈
Stack是一种常用的线性结构,主要有以下两个特点: