# 初阶数据结构 带头双链表

### 二. 代码实现

typedef int LTDateType;

typedef struct ListNode
{
struct ListNode* next;
struct ListNode* prev;
LTDateType date;
}LTNode;

### 三. 初始化双链表

LTNode* BuyListNode(LTDateType x)
{
LTNode* node = (LTNode*)malloc(sizeof(LTNode));
if (node == NULL)
{
perror("malloc fail");
//return NULL;
exit(-1);
}
node->next = NULL;
node->prev = NULL;
node->date = x;
return node;
}
LTNode* LTInit()
{
LTNode* phead = BuyListNode(-1);
phead->next = phead;
phead->prev = phead;

return phead;
}

### 四. 尾插数据

void LTPushBack(LTNode* phead, LTDateType x)
{
assert(phead);
LTNode* newnode = BuyListNode(x);
LTNode* tail = phead->prev;

tail->next = newnode;
newnode->prev = tail;
newnode->next = phead;
phead->prev = newnode;
/*LTInsert(phead, x);*/
}

### 五. 打印数据

void LTPrint(LTNode* phead)
{
assert(phead);
printf("<=head=>");
LTNode* cur = phead->next;
while (cur != phead)
{
printf("%d<=>", cur->date);
cur = cur->next;
}
printf("\n");
}

### 六. 尾删数据

void LTPopBack(LTNode* phead)
{
assert(phead);
assert(!LTEmpty(phead));
LTNode* tail = phead->prev;
LTNode* tailPrev = tail->prev;
tailPrev->next = phead;
phead->prev = tailPrev;
free(tail);
tail = NULL;
}

### 七. 头插数据

void LTPustFront(LTNode* phead, LTDateType x)
{
assert(phead);
LTNode* newnode = BuyListNode(x);
LTNode* first = phead->next;
phead->next = newnode;
newnode->prev = phead;

newnode->next = first;
first->prev = newnode;
//不能随便换顺序
//newnode->next = phead->next;
//phead->next->prev = newnode;
//
//phead->next = newnode;
//newnode->prev = phead;
/*LTInsert(phead->next, x);*/
}

### 八. 头删数据

void LTPopFront(LTNode* phead)
{
assert(phead);
assert(!LTEmpty(phead));
LTNode* first = phead->next;
phead->next = first->next;
first->next->prev = phead;
free(first);
first = NULL;
}

### 九. 查找指定位置

LTFind(LTNode* phead, LTDateType x)
{
assert(phead);
LTNode* cur = phead->next;
while (cur!=phead)
{
if (cur->date == x)
{
return cur;
}
cur = cur->next;
}
return NULL;
}

### 十. 指定位置前插入数

void LTInsert(LTNode* pos, LTDateType x)
{
assert(pos);
LTNode* prev = pos->prev;
LTNode* newnode = BuyListNode(x);
newnode->next = pos;
pos->prev = newnode;

prev->next = newnode;
newnode->prev = prev;
}

### 十一. 删除指定位置的数

Pos指针不能为空

void LTErase(LTNode* pos)
{
assert(pos);
LTNode* prev = pos->prev;
LTNode* next = pos->next;
prev->next = next;
next->prev = prev;
free(pos);
pos = NULL;
}

|
19天前
|

【数据结构/C语言】深入理解 双向链表
【数据结构/C语言】深入理解 双向链表
20 0
|
19天前
|

【数据结构与算法 刷题系列】合并两个有序链表
【数据结构与算法 刷题系列】合并两个有序链表
14 0
|
4天前
【数据结构OJ题】合并两个有序链表

24 8
|
6天前
【数据结构OJ题】移除链表元素

10 2
|
6天前
【数据结构OJ题】链表中倒数第k个结点

9 1
|
6天前
|

【数据结构】双链表

14 1
|
3天前
【数据结构OJ题】链表分割

3 0
|
4天前
【数据结构OJ题】链表的回文结构

6 0
|
6天前
【数据结构OJ题】链表的中间结点

9 0
|
6天前
【数据结构OJ题】反转链表

10 0