如何为简书网站创建与维护专业笔记?
摘要:做网站教程 简书,网站建设与维护笔记,seo兼职58,想做一个自己的网站怎么做文章目录 前言双向链表的结构功能的解析及实现1. 双向链表的创建2. 创建头节点(初始化)3. 创建新
做网站教程 简书,网站建设与维护笔记,seo兼职58,想做一个自己的网站怎么做文章目录 前言双向链表的结构功能的解析及实现1. 双向链表的创建2. 创建头节点#xff08;初始化#xff09;3. 创建新结点4. 尾插5. 尾删6. 头插7. 头删8. 查找9. 在pos位置前插入10. 删除pos位置的结点11. 销毁 代码实现1.ListNode.h2. ListNode.c3. test.c 总结 前言 前面… 文章目录 前言双向链表的结构功能的解析及实现1. 双向链表的创建2. 创建头节点初始化3. 创建新结点4. 尾插5. 尾删6. 头插7. 头删8. 查找9. 在pos位置前插入10. 删除pos位置的结点11. 销毁 代码实现1.ListNode.h2. ListNode.c3. test.c 总结 前言 前面我们学习了单链表的实现我们发现它在进行从后往前查找的时候有很大的不便为了解决这个问题双向链表油然而生。它可以很好的解决单链表无法从后往前查找的困难。
双向链表的结构 如图所示它是有两个指针域一个指向后一个结点一个指向前一个结点。它存储了前一个结点的地址与后一个结点的地址所以可以很方便的进行向前遍历或者向后遍历。同时它还是一个循环链表可以通过第一个结点直接找到最后一个结点。
功能的解析及实现
1. 双向链表的创建 就像前文所说它包含了两个指针域和一个数据域用来存放它前一个结点的地址和后一个结点的地址以及本身的数据。
typedef struct LTNode
{LTDataType data;struct LTNode* prev;struct LTNode* next;
}LTNode;2. 创建头节点初始化 此次双向链表的结构我是采用了带头结点的结构好处就是头节点是malloc出来的是在堆区上存放不会因为出了函数就被销毁也意味着后续的各种操作我们只需要传递一级指针就会有实现单链表时传递二级指针的效果。
LTNode* ListInit()
{LTNode* phead (LTNode*)malloc(sizeof(LTNode));if (phead NULL){return NULL;}phead-prev phead;phead-next phead;return phead;
}3. 创建新结点 每次插入新的数据都需要开辟新的结点因此把它单独拿出来放到一个函数中实现。
LTNode* BuyListNode(LTDataType x)
{LTNode* newnode (LTNode*)malloc(sizeof(LTNode));if (newnode NULL){return NULL;}newnode-data x;newnode-prev NULL;newnode-next NULL;return newnode;
}4. 尾插 因为是循环链表我们可以通过第一个头节点直接找到尾结点而在连接的时候需要将新结点分别连接到头节点的prev以及尾结点的next同时自身的prev存放尾结点的地址next存放头节点的地址。如图
void ListPushBack(LTNode* phead, LTDataType x)
{assert(phead);LTNode* tail phead-prev;LTNode* newnode BuyListNode(x);newnode-data x;newnode-next phead;phead-prev newnode;newnode-prev tail;tail-next newnode;
}5. 尾删 在创建头节点时我们是将头节点的prev与next都指向了它自身因此我们可以通过头节点的next指向的是不是自身来判断是否为存放了数据。(头节点自身不存放数据)。与尾插类似如图
void ListPopBack(LTNode* phead)
{assert(phead);if (phead-next phead)//判断链表是否存放了数据{return;}LTNode* tail phead-prev;LTNode* prev tail-prev;prev-next phead;phead-prev prev;free(tail);tail NULL;
}6. 头插 与尾插类似只不过这个放到了最前面。在尾插是我们是有tail与phead来与新结点连接头插也一样。先保存当前的第一个结点地址然后再将新结点连接到头节点与原第一个结点的中间即可。
