单向链表特点是链表的链接方向是单向的,访问要通过顺序读取从头部开始。链表是使用指针构造的列表,是由一个个结点组装起来的,又称为结点列表。其中每个结点都有指针成员变
单向链表特点是链表的链接方向是单向的,访问要通过顺序读取从头部开始。链表是使用指针构造的列表,是由一个个结点组装起来的,又称为结点列表。其中每个结点都有指针成员变量指向列表中的下一个结点,head指针指向第一
单向链表特点是链表的链接方向是单向的,访问要通过顺序读取从头部开始。链表是使用指针构造的列表,是由一个个结点组装起来的,又称为结点列表。其中每个结点都有指针成员变量指向列表中的下一个结点,head指针指向第一
链表是线性表的链式存储结构,它可以以O(1)的时间复杂度进行插入或者删除,同时由于是链式结构相比顺序表而言,不会存在空间浪费的情况。而链表又分为带头单向链表,不带头单向链表,带头循环链表,不带头循环链表,带头双向循环链表,不带头双向循环链表,带头双向链表,不带头双向链表,总共有八种,其中结构最简单的是不带头单向链表,也是实现起来最容易出错的。并且我们在网上进行链表的oj时,题目基本也是不带头的单向链表,而且也是互联网大厂面试中最容易考的。
|
1
2
3
4
5
6
7
|
typedef int SLTDadaType;//存放的数据类型struct SListNode{ SLTDadaType _data;//存放的数据 struct SListNode* _next;//指向下一个节点的指针};typedef struct SListNode SListNode; |
|
1
2
3
4
5
6
7
|
SListNode* BuyListNode(SLTDadaType x);//创建一个节点SListNode* SListPushBack(SListNode* head, SLTDadaType x);//尾插SListNode* SListPopBack(SListNode* head);//头插SListNode* SListPushFornt(SListNode* head, SLTDadaType x);//尾删SListNode* SListPopFornt(SListNode* head);//头删SListNode* SListFind(SListNode* head, SLTDadaType x);//查找一个节点void SListModify(SListNode* head, SLTDadaType x,SLTDadaType y);//x修改 |
|
1
2
3
4
5
6
7
|
SListNode* BuyListNode(SLTDadaType x){ SListNode* newnode = (SListNode*)malloc(sizeof(SListNode)); newnode->_data = x; newnode->_next = NULL; return newnode;} |
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
SListNode* SListPushBack(SListNode* head, SLTDadaType x){ SListNode* newnode = BuyListNode(x);//无论节点是否为空,都先进行创建一个节点 if (head == NULL) //头节点为空 { head = newnode; return head; } else //头节点不为空,直接遍历到链表结尾进行尾插 { SListNode* tail = head; while (tail->_next != NULL) { tail = tail->_next; } tail->_next = newnode; return head; }} |
|
1
2
3
4
5
6
7
|
SListNode* SListPushFornt(SListNode* head, SLTDadaType x){ SListNode* newnode = BuyListNode(x); newnode->_next = head; head = newnode; return head;} |
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
SListNode* SListPopBack(SListNode* head){ //1.空 //2.只有一个节点 //3.有多个节点 if (head == NULL) { return head; } else if (head->_next== NULL) { free(head); head = NULL; return head; } else { SListNode* prev = NULL; SListNode* tail = head; while (tail->_next != NULL) //利用前指针来保存要删除的节点的前一个节点 { prev = tail; tail = tail->_next; } free(tail); if (prev != NULL) prev->_next = NULL; return head; }} |
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
SListNode* SListPopFornt(SListNode* head){ if (head == NULL) { return head; } else { SListNode* cur = head->_next; free(head); head = cur; return head; }} |
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
SListNode* SListFind(SListNode* head, SLTDadaType x){ SListNode* cur = head; while (cur) { if (cur->_data == x) { return cur; } else { cur = cur->_next; } } return NULL;} |
|
1
2
3
4
5
6
7
8
9
10
11
12
|
void SListModify(SListNode* head, SLTDadaType x, SLTDadaType y)//x修改{ SListNode* find = SListFind(head, x); if (find) { find->_data = y; } else { printf("对不起,您要修改的值不存在\n"); }} |
本篇文章主要是针对单向链表一些基本操作的代码实现,若有写的错误或值得改进的地方,请大家多多留言指出。
最后,也请大家多多支持,求关注!!!
到此这篇关于C语言 单向链表的增删查改快速掌握的文章就介绍到这了,更多相关C语言 单向链表内容请搜索米米素材网以前的文章或继续浏览下面的相关文章希望大家以后多多支持米米素材网!
原文链接:https://blog.csdn.net/weixin_52843203/article/details/120510139
发表评论