• 微信公众号：美女很有趣。 工作之余，放松一下，关注即送10G+美女照片！

# 数据结构之双向带头循环链表

5小时前 2次浏览

### 双向带头循环链表

• 一、双向带头循环链表的优劣势
• 二、双向带头循环链表的实现
• 一、定义结构体
• 二、创建节点函数
• 三、初始化链表
• 四、链表的尾插
• 五、链表的头插
• 六、链表的尾删
• 七、链表的头删
• 八、链表的查找
• 九、链表的插入
• 十、链表的打印

# 二、双向带头循环链表的实现

## 一、定义结构体

``````typedef int LTDataType;
typedef struct ListNode
{
LTDataType data;
struct ListNode* next;
struct ListNode* prev;
};

``````

## 二、创建节点函数

``````struct ListNode* BuyListNode(LTDataType x)
{
struct ListNode* Node = (struct ListNode*)malloc(sizeof(struct ListNode));
Node->next = NULL;
Node->prev = NULL;
Node->data = x;
return Node;
}

``````

## 三、初始化链表

``````struct ListNode* ListInit()
{
}

``````

## 四、链表的尾插

``````void  ListPushBack(struct ListNode* phead, LTDataType x)
{
tail->next = newnode;
newnode->prev = tail;
}

``````

## 五、链表的头插

``````void ListPushFront(struct ListNode* phead, LTDataType x)
{
newnode->next = first;
first->prev = newnode;
}

``````

## 六、链表的尾删

``````void ListPopBack(struct ListNode* phead)
{
struct ListNode* second = tail->prev;
free(tail);
tail = NULL;
}

``````

## 七、链表的头删

``````void ListPopFront(struct ListNode* phead)
{
struct ListNode* firstNext = first->next;
free(first);
first = NULL;
}

``````

## 八、链表的查找

``````struct ListNode* ListFind(struct ListNode* phead, LTDataType x)
{
{
if (cur->data == x)
{
return cur;
}
cur = cur->next;
}
return NULL;
}

``````

## 九、链表的插入

``````void ListInsert(struct ListNode* pos, LTDataType x)
{
assert(pos);
struct ListNode* prev = pos->prev;
prev->next = newnode;
newnode->prev = prev;
newnode->next = pos;
pos->prev = newnode;
}

``````

## 十、链表的打印

``````void ListPrint(struct ListNode* phead)
{