一、双向链表
1) 双向链表: 在单链表的每个结点里在增加一个指向其直接前驱的指针域
2) 双向循环链表: 让头结点的前驱指针指向链表的最后一个结点,让最后一个结点的后继指针指向头结点
3) 双向链表结构的对称性(设指针p指向某一结点):
p->front->next = p = p->next->front;
4) 双向链表的结点类型定义:
typedef int Datatype;
typedef struct Node
{
Datatype data;
struct Node *front, *next; //前驱指针域和后继指针域
}Node,pNode;
5) 双向链表的插入:
void InsertList(pNode *p, int i, Datatype x) //双向链表的插入
{
int length = 0; ///计算表长
pNode pL = (*p);
pNode qL = (*p); //定位到第i个结点
int j = 0;
pNode pnode;
pnode = (pNode)malloc(sizeof(Node));
pnode->data = x; //生成数据域为x的新结点
if ((*p)->next == NULL) //判断链表是否为空
{
printf("链表为空!\n");
return;
}
while (pL->next != NULL)
{
length++; //依次迭代计数
pL = pL->next;
}
if (i<1 || i>length) //判断输入位置是否合理
{
printf("输入位置不合理!\n");
return;
}
while (j < i)
{
qL = qL->next;
j++;
}
pnode->front = qL->front;
qL->front->next = pnode;
pnode->next = qL;
qL->front = pnode;
}
6) 双向链表的删除:
void DeleteList(pNode *p, int i) //双向链表的删除
{
int length = 0; //计算表长
pNode pL = (*p);
pNode qL = (*p); //定位到第i个结点
int j = 0;
if ((*p)->next == NULL) //判断链表是否为空
{
printf("链表为空!\n");
return;
}
while (pL->next != NULL)
{
length++; //依次迭代计数
pL = pL->next;
}
if (i<1 || i>length) //判断输入位置是否合理
{
printf("输入位置不合理!\n");
return;
}
while (j < i)
{
qL = qL->next;
j++;
}
qL->front->next = qL->next;
qL->next->front = qL->front;
free(qL);
}