好了,各位老铁!!现在开始本期讨论话题:<--头删数据----头插数据-->
直接上手代码:
头文件“List.h”
#include <stdio.h>
#inculde <stdlib.h> //扩容函数malloc库
#include <assert.h> //断言检验函数
#include <stdbool.h> //布尔函数
typedef int LTDataType;
typedef struct ListNode
{
struct ListNode* prev; //前指针
struct ListNode* next; //后指针
LTDataType data;
};
//初始化
ListNode* LTInitial();
//开辟空间
ListNode* LT_BUY(LTDataType x);
//打印
void LTPrint(LTNode* phead);
//布尔判断真假
bool boolEmpty(LTNode* phead);
//尾插数据
void LTPushBack(LTNode* phead, LTDataType x);
//尾删数据
void LTPopBack(LTNode* phead);
//头插数据
void LTPushFront(LTNode* phead, LTDataType x);
//头删数据
void LTPopFront(LTNode* phead);
-----> 代码实现环节“List.c”
#include "List.h"
//初始化
ListNode* LTInitial()
{
ListNode* phead = LT_BUY(-1); //设置哨兵位
phead ->next = phead;
phead ->prev = phead;
return phead;
}
//开辟空间
ListNode* LT_BUY(LTDataType x)
{
ListNode* newnode = (ListNode*) malloc(sizeof(ListNode));
if(newnode == NULL)
{
perror("malooc::fail");
return NULL;
}
newnode ->next = NULL;
newnode ->prev = NULL;
newnode ->data = x;
return newnode;
}
//打印
void LTPrint(LTNode* phead)
{
printf("<=phead=>");
LTNode* cur = phead ->next;
while(cur != phead)
{
printf("<=%d=>", cur ->data);
cur = cur ->next;
}
printf("\n");
}
//布尔函数判断真假
//注意包含布尔头文件,别忘了
bool boolEmpty(LTNode* phead)
{
if(phead == NULL )
{
return true;
}
else
return false;
}
//尾插数据
void LTPushBack(LTNode* phead, LTDataType x)
{
assert(phead);
LTNode* newnode = LT_BUY(x);
LTNode* tail = phead ->prev;
tail ->next = newnode;
newnode ->prev = tail;
newnode ->next = phead;
phead ->prev = newnode;
}
//尾删数据
void LTPopBack(LTNode* phead)
{
assert(phead);
//还可以用布尔函数进行断言
assert(!boolEmpty(phead));
LTNode* tail = phead ->prev;
LTNode* tailprev = tail ->prev;
tailprev ->next = phead;
phead ->prev = tailprev;
free(tail);
tail = NULL;
}
/*--------------优化环节--------------*/
//头插数据
void LTPushFront(LTNode* phead, LTDataType x)
{
assert(phead); //必不可少的断言环节
LTInsert(phead ->next, x); //封装一个插入函数进行优化
}
//头删数据
void LTPopFront(LTNode* phead)
{
assert(phead);
LTErase(phead ->next); //封装一个删除函数进行优化
}
//指定位置pos的插入函数
void LTInsert(LTNode* pos, LTDataType x)
{
assert(phead);
LTNode* newnode = LT_BUY(x);
LTNode* prev = pos ->prev;
prev ->next = newnode;
newnode ->prev = prev;
newnode ->next = pos;
pos ->prev = newnode;
}
//指定位置pos的删除数据
void LTErase(LTNode* pos)
{
assert(phead);
LTNode* prev = pos ->prev;
LTNode* next = pos ->next;
prev >next = next;
next ->prev = prev;
free(pos);
}
补充头文件“List.h”
#include <stdio.h>
#inculde <stdlib.h> //扩容函数malloc库
#include <assert.h> //断言检验函数
#include <stdbool.h> //布尔函数
typedef int LTDataType;
typedef struct ListNode
{
struct ListNode* prev; //前指针
struct ListNode* next; //后指针
LTDataType data;
};
//初始化
ListNode* LTInitial();
//开辟空间
ListNode* LT_BUY(LTDataType x);
//打印
void LTPrint(LTNode* phead);
//布尔判断真假
bool boolEmpty(LTNode* phead);
//尾插数据
void LTPushBack(LTNode* phead, LTDataType x);
//尾删数据
void LTPopBack(LTNode* phead);
//头插数据
void LTPushFront(LTNode* phead, LTDataType x);
//头删数据
void LTPopFront(LTNode* phead);
//指定位置pos的插入函数
void LTInsert(LTNode* pos, LTDataType x);
//指定位置pos的删除数据
void LTErase(LTNode* pos);
现在进入测试环节“Test.c”
#include "List.h"
void test_01()
{
LTNode* plist = LTInitial();
LTPushFront(plist, 11);
LTPushFront(plist, 13);
LTPushFront(plist, 15);
LTPushFront(plist, 29);
LTPushFront(plist, 31);
LTPrint(plist);
LTPopFront(plist);
LTPopFront(plist);
LTPrint(plist);
}
int main()
{
test_01();
}
----->优化头删 头插的执行结果 :>
以上就是优化的过程,希望可以对各位老铁有所帮助!!
另外,部分代码的理解需要结合图示,如下 :>
此图可以方便理解,刚刚上述的头删 头插代码过程!!具以补充!!
本文末,链表算是告一段落了!!
其实,学会书写链表的代码,往往不足以展现自己对链表的实际理解情况!!
还需要进行检验以及运用到实际情况当中!!而OJ题的练习,则可以反映掌握的标准!!
那么接下来,就是有关链表OJ题的讲解过程了!!估计,又会有好几个专题再等着自己呢!!
真是让人热血沸腾啊!!充满干劲儿!!
本期就到这里了!!感谢各位老铁的阅读!!
标签:---,ListNode,--,void,next,链表,LTNode,phead,prev From: https://blog.51cto.com/u_15808800/6140760