双链表是普通链表的一种进阶表达形式,本文将详细的介绍双链表的原理,结构,以及一系列操作的c/c++代码实现
双链表的原理
双链表的一般形式是由若干个结构体通过指针相互连接,从而形成可以前后访问的数据结构。
双链表一般由表头和表身组成(部分双链表可能有表尾),表头内记录的的数据一般为表身的长度,初始时为0。
双链表的操作主要有以下几种:
1.初始化
生成一个表头,将它的数据域初始化为0,指针域初始化为null,并返回它的地址。
2.头插
将一个数据插入表头和第一段表身之间(如果链表不为空)。
3.尾插
将一个数据接入到链表的最后。
4.删除
从链表中取出元素,并将该元素的前后元素通过指针重新连接。
代码实现
结构体
typedef struct Node {
int data;
struct Node* next;
struct Node* pre;
}Node;
其中data为数据域,可以为其他类型(本文中统一为int)。
pre和next指针分别为前指针和后指针。
初始化
Node* initlist()
{
Node* listhead = (Node*)malloc(sizeof(Node));
listhead->data = 0;
listhead->pre = NULL;
listhead->next = NULL;
return listhead;
}
头插法
void headinsert(Node* list, int data)
{
Node* node = (Node*)malloc(sizeof(Node));
node->data = data;
node->next = list->next;
node->pre = list;
list->next = node;
if(node->next!=NULL)
{
node->next->pre = node;
}
list->data++;
}
尾插法
void tailinsert(Node* list, int data)
{
Node* node = (Node*)malloc(sizeof(Node));
node->data = data;
Node* l = list;
while (l->next != NULL)
{
l = l->next;
}
node->next = NULL;
node->pre = l;
l->next = node;
list->data++;
}
删除
void listdelete(Node* list, int data)
{
Node* l = list->next;
while (l->next != NULL)
{
if (l->data == data)
{
l->pre->next = l->next;
l->next->pre = l->pre;
free(l);
break;
}
l = l->next;
}
list->data--;
}