这篇文章主要介绍了C语言中如何实现单向链表的增删查改操作,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。
链表是线性表的链式存储结构,它可以以O(1)的时间复杂度进行插入或者删除,同时由于是链式结构相比顺序表而言,不会存在空间浪费的情况。而链表又分为带头单向链表,不带头单向链表,带头循环链表,不带头循环链表,带头双向循环链表,不带头双向循环链表,带头双向链表,不带头双向链表,总共有八种,其中结构最简单的是不带头单向链表,也是实现起来最容易出错的。并且我们在网上进行链表的oj时,题目基本也是不带头的单向链表,而且也是互联网大厂面试中最容易考的。
typedef int SLTDadaType;//存放的数据类型 struct SListNode { SLTDadaType _data;//存放的数据 struct SListNode* _next;//指向下一个节点的指针 }; typedef struct SListNode SListNode;
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修改
SListNode* BuyListNode(SLTDadaType x) { SListNode* newnode = (SListNode*)malloc(sizeof(SListNode)); newnode->_data = x; newnode->_next = NULL; return newnode; }
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; } }
SListNode* SListPushFornt(SListNode* head, SLTDadaType x) { SListNode* newnode = BuyListNode(x); newnode->_next = head; head = newnode; return head; }
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; } }
SListNode* SListPopFornt(SListNode* head) { if (head == NULL) { return head; } else { SListNode* cur = head->_next; free(head); head = cur; return head; } }
SListNode* SListFind(SListNode* head, SLTDadaType x) { SListNode* cur = head; while (cur) { if (cur->_data == x) { return cur; } else { cur = cur->_next; } } return NULL; }
void SListModify(SListNode* head, SLTDadaType x, SLTDadaType y)//x修改 { SListNode* find = SListFind(head, x); if (find) { find->_data = y; } else { printf("对不起,您要修改的值不存在\n"); } }
感谢你能够认真阅读完这篇文章,希望小编分享的“C语言中如何实现单向链表的增删查改操作”这篇文章对大家有帮助,同时也希望大家多多支持亿速云,关注亿速云行业资讯频道,更多相关知识等着你来学习!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。