这篇文章主要介绍了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语言中如何实现单向链表的增删查改操作”这篇文章对大家有帮助,同时也希望大家多多支持亿速云,关注亿速云行业资讯频道,更多相关知识等着你来学习!
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。