- 创建双链表之:尾删,所谓尾删就是删除上一个空间的尾部,:
尾删所对应的List.h,为:
cs
void LTPushBack(LTNode* phead);
他所对应的List.c,的代码为:
cs
void LTPushBack(LTNode* phead)
{
//链表必须有效且链表不能为空
assert(phead && phead->next != phead);
LTNode* del = phead->prev;
del->prev->next = phead;
phead->prev = del->prev;
//删除del节点
free(del);
del = NULL;
}
- 有尾删必须有头删,它的原理和尾删其实都是一样的,只不过头删是删掉后一个空间的头部,
头删所对应的List.h,为:
cs
void LTPushFront(LTNode* phead);
他所对应的List.c,的代码为:
cs
void LTPushFront(LTNode* phead)
{
assert(phead && phead->next != phead);
LTNode* del = phead->next;
phead->next = del->next;
del->next->prev = phead;
//删除del节点
free(del);
del = NULL;
}
- 在pos位置之后插入数据:为什么要在pos之后插入数据呢?这是因为,现实的操作中,不只是头和尾的相关操作,它还有可能是,在某一个中间插入一个数据,这就需要算法来实现的,
在pos位置之后插入数据的List.h的代码:
cs
//在pos位置之后插入数据
void LITNEST(LTNode* pos, LTDataType x);
在pos位置之后插入数据的List.c的代码:
cs
void LITNEST(LTNode* pos, LTDataType x)
{
assert(pos);
LTNode* newnode = LTBuyNode(x);
newnode->next = pos->next;
newnode->prev = pos;
pos->next->prev = newnode;
pos->next = newnode;
}
它其实大致的思想和头删,尾删基本一致,无非就是位置改变了而已。
- 有在pos上的插入就有在pos上的删除,删除pos的节点:
删除pos的节点的List.h:
cs
//删除pos的节点
void LTTford(LTNode* pos);
void LTFind(LTNode* phead, LTDataType x);
删除pos的节点的List.c:
cs
//在pos上删除
void LTTford(LTNode* pos)
{
assert(pos);
pos->next->prev = pos->prev;
pos->prev->next = pos->next;
free(pos);
pos = NULL;
}
void LTFind(LTNode* phead, LTDataType x)
{
assert(pos);
LTNode* pcur = phead->next;
while (pcur!=phead)
{
LTNode* next = pcur->next;
free(pcur);
pcur = NULL;
}
//此时pcur指向phead,而phead还没有被销毁
free(phead);
phead = NULL;
}
- 对于,双链表的创建和实现,其实还有内容,但这是最核心的内容了。