双链表
与单链表不同的是,双链表节点具有两个指针,一个指向后面数据,一个指向其前面的数据。其结构如下图所示:
当首尾相连时,链表叫做双循环链表;
其和单链表类似,通过一个头指针来表示;
下面为双循环链表的创建及相关的插入删除函数实现:
#include <stdio.h>
#include <stdlib.h>
//定义链表节点结构
typedef struct node{
int data;
struct node *prior;
struct node *next;
}DlinkList;
//创建一个循环双链表,其中只有一个节点,用一个头节点指针表示
DlinkList *CreateList(int v)
{
DlinkList *head, *p;
p = (DlinkList*)malloc(sizeof(DlinkList));
p->data = v;
p->next = p;
p->prior = p;
head = p;
return head;
}
//在链表的i处插入一个值v
void *InsertList(DlinkList *L,int v,int i)
{
DlinkList *p, *s;
p = L;
while (i)
{
p = p->next;
i--;
}
s = (DlinkList*)malloc(sizeof(DlinkList));
s->data = v;
s->next = p->next;
s->prior = p;
(p->next)->prior = s;
p->next = s;
}
//删除链表i处的值
void *DeleteList(DlinkList *L, int i)
{
DlinkList *p, *s;
p = L;
while (i)
{
p = p->next;
i--;
}
(p->prior)->next = p->next;
(p->next)->prior = p->prior;
s = p;
free(s);
}
int main()
{
int i;
DlinkList *List;
List = CreateList(5); //创建链表
InsertList(List,3,1); //重复插入值,增加链表长度
InsertList(List,4,2);
InsertList(List,6,1);
DeleteList(List,2); //删除链表
}
通过运行,可以在参数窗口看到链表的实际存储结构;