这篇文章主要介绍了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修改
三、函数实现
1.创建节点
SListNode* BuyListNode(SLTDadaType x){SListNode* newnode = (SListNode*)malloc(sizeof(SListNode));newnode->_data = x;newnode->_next = NULL;return newnode;}
2.尾插节点
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;}}
3.头插
SListNode* SListPushFornt(SListNode* head, SLTDadaType x){SListNode* newnode = BuyListNode(x);newnode->_next = head;head = newnode;return head;}
4.尾删
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;}}
5.头删
SListNode* SListPopFornt(SListNode* head){ if (head == NULL){return head;}else{SListNode* cur = head->_next;free(head);head = cur;return head;}}
6.查找节点
SListNode* SListFind(SListNode* head, SLTDadaType x){SListNode* cur = head;while (cur){if (cur->_data == x){return cur;}else{cur = cur->_next;}}return NULL;}
7.修改
void SListModify(SListNode* head, SLTDadaType x, SLTDadaType y)//x修改{SListNode* find = SListFind(head, x);if (find){find->_data = y;}else{printf("对不起,您要修改的值不存在\n");}}
感谢你能够认真阅读完这篇文章,希望小编分享的“C语言中如何实现单向链表的增删查改操作”这篇文章对大家有帮助,同时也希望大家多多支持编程网,关注编程网行业资讯频道,更多相关知识等着你来学习!