温习链表类型
初始化链表
实现接口:
尾插
头插
头删
尾删
查找
打印
任意插入,在pos的前面插入x
任意删除,删除pos位置的值
释放空间
温习链表类型
首先我们来了解链表的几种类型。
我们之前写过顺序表和单链表,感兴趣的可以看一下这两篇文章。了解完这两篇文章后我们对链表就有了初步的理解,以便于我们挑战的链表最复杂的结构——双向带头循环链表。
为了便于学习我们先复习一下顺序表和单链表的基本结构。
链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表
中的指针链接次序实现的。
而顺序表物理上的结构它是连续的。这是它们形式上的最大区别了,当然还有浪费空间,查找时的时间复杂度为O(N)等等。
我们今天探讨的双链表又和之前学习的单链表又有么不同呢?
我们之前学习的单链表的时候时常苦恼要用双指针结构去查找值,后者说不能找到前一个值,所以我们的实现逻辑上就很复杂。
那么我们现在要学习的双链表又有什么不同呢?
对双链表有了比较直观的理解后我们来深入学习
初始化链表
这里我建议大家要学会创建工程文件,还不会的小伙伴可以看一下这篇文章——
List.h头文件——声明函数
List.c——函数实现
test.c——主函数
创建完成以后我们可以更方便的对程序后期的修改
接着我们在头文件中写入:
typedef int SLTDateType;
//结构
//初始化
typedef struct ListNote
{
//前驱指针
struct ListNote* next;
//后驱指针
struct ListNote* prev;
SLTDateType data;
}ListNote;
这里我们可以对照学习——单链表(一),这里的思想和套路是相近的。
再到List.c中写入:
//初始化
ListNote* ListInit()
{
//申请一块空间
ListNote* phead = BuyListNote(0);
phead->next = phead;
phead->prev = phead;
return phead;
}
实现接口:
接下来进行接口实现。这一步是为了完善链表结构,实现双链表的功能,当然这也是我们对双链表学些的重中之重。
尾插
为了有个直观的印象,我们首先尝试着把原理图先画一下
这里要注意的是,有些书上讲头节点/哨兵位要放入数据大小,这其实很不科学。比如:我们放入的数据类型是一个结构体那么所谓的哨兵位储存的大小又该怎么算呢?所以我们在这里最好不要储存任何东西,我们就把头节点看成一个锚点就行了。
我们始终要思考图示里的头插是所有情况的代表吗?
我们运用单链表(三)里头的套路,思考极限情况。没有数据时可以吗?
我们再来画一个图解
其实不管有没有数据其实时一样的。
接下来我们将思想转换为代码
//尾插
void ListPushBack(ListNote* phead, SLTDateType x)
{
//不能为空
assert(phead);
//找尾
ListNote* tail = phead->prev;
//申请空间
ListNote* newnode = BuyListNote(x);
//原来的尾指向新空间
tail->next = newnode;
newnode->prev = tail;
//指向头
phead->prev = newnode;
newnode->next = phead;
}
接下来我们实现头插
头插
还是老套路我们首先画一下图解
了解原理图将它转换为代码就简单了
//头插
void ListPushFront(ListNote* phead, SLTDateType x)
{
//不能为空
assert(phead);
//找头
ListNote* first = phead->next;
//申请空间
ListNote* newnode = BuyListNote(x);
//哨兵位新空间
phead->next = newnode;
newnode->prev = phead;
//新空间指向原来的第一位
newnode->next = first;
first->prev = newnode;//phead->next->prev = newnode但还是这里要注意能不能找到first的问题
}
这里有一下注意点:
assert不能少
写的顺序问题
- assert不能少
当我们传入空指针进去的时候,头节点本质上不存在,那么这个双链表的基本结构就不存在了,所以一定不能传空指针!
- 写的顺序问题
用我的代码是没有问题的,因为我保存了原来第一个节点的地址——first。但是如果这样表达就要考虑能不能找到first了——phead->next->prev = newnode。
诚然两种写法都行,但是我的这种方法就不需要考虑写的顺序问题了。
时间原因,我把双链表分成上下两期来探讨,还请谅解。
都看到这了不妨点个赞吧!
等我更新了双链表(下)以后我会把链接放到评论区,感兴趣的小伙伴自取哦!