循环双链表
前言
循环双链表的头插法、尾插法、删除节点和遍历打印
一、双链表的结构和初始化
typedef struct Node { //Node结构体
int data; //data数据域
struct Node* pre; //pre指针域
struct Node* next; //next指针域
}Node;
Node* initList(void) //初始化链表
{
Node* list = (Node*)malloc(sizeof(Node)); //开辟list
list->data = 0; //链表长度为0
list->pre = list; //list的前指针指向本身
list->next = list; //list的后指针指向本身
return list;
}
二、插入节点
1.头插法
代码如下(示例):
void headInsert(Node* list, int data) //头插法
{
Node* node = (Node*)malloc(sizeof(Node)); //node
node->data = data; //data
node->pre = list; //node的前指针指向list
node->next = list->next; //node的后指针指向list的后一个指针
list->next->pre = node; //list的后指针指向的前指针指向node
list->next = node; //list的后指针指向node
list->data++; //头部data++
}
2.尾插法
代码如下(示例):
void tailInsert(Node* list, int data) //尾插法
{
Node* node = list; //node
Node* n = (Node*)malloc(sizeof(Node)); //n
n->data = data; //data
while (node->next != list) //循环直到最后一个节点
{
node = node->next;
}
n->pre = node; //n的前指针指向node
n->next = list; //n的后指针指向list
node->next = n; //node的后指针指向n
list->pre = n; //list的前指针指向n
list->data++; //头部data++
}
3.删除节点
代码如下(示例):
int deleteList(Node* list, int data) //删除节点
{
Node* node = list->next; //node
while (node != list) //当node等于本身则退出循环
{
if (node->data==data) //当遇到删除节点
{
node->pre->next = node->next; //node的前指针的后指针指向node的后指针
node->next->pre = node->pre; //node的后指针的前指针指向node的前指针
free(node); //释放node
list->data--; //头部的data节点长度--
return TRUE; //
}
node = node->next; //
}
return FALSE;
}
总结
若有错误,请指出,谢谢。