资讯专栏INFORMATION COLUMN

【C语言】一篇文章带你彻底了解单向链表的增删查改

ckllj / 1846人阅读

摘要:并且我们在网上进行链表的时,题目基本也是不带头的单向链表,而且也是互联网大厂面试中最容易考的。

文章目录


前言

  链表是线性表的链式存储结构,它可以以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");	}}

总结

本篇文章主要是针对单向链表一些基本操作的代码实现,若有写的错误或值得改进的地方,请大家多多留言指出。

最后,也请大家多多支持,求关注!!!

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/121376.html

相关文章

  • 数据结构大总结(链表篇)

    摘要:实际中更多是作为其他数据结构的子结构,如哈希桶图的邻接表等等。实际中使用的链表数据结构,都是带头双向循环链表。 文章目录 一.算法的时间复杂度和空间复杂度1.算法...

    不知名网友 评论0 收藏0
  • 5分钟快速实现个哈希表

    摘要:它通过计算一个键的哈希值来快速定位键值在哈希表的位置。实现一个好的哈希表的关键是一个好的哈希算法与一个处理哈希冲突的方法。而内核中的哈希表处理冲突使用的也是拉链法。 哈希表(Hash table,也叫散列表),是根据键(Key)而直接访问在内存存储位置的数据结构。 也就是说,它通过计算一个关于键值的函数,将所需查询的数据映射到表中一个位置来访问记录,这加快了查找速度。 这个映射函数称做...

    princekin 评论0 收藏0
  • JavaSE与数据结构基础知识系列——专栏导航

    ⭐️前面的话⭐️ 大家好!这是Java基础知识与数据结构博文的导航帖,收藏我!学习Java不迷路! ?博客主页:未见花闻的博客主页 ?欢迎关注?点赞?收藏⭐️留言? ?本文由未见花闻原创,CSDN首发! ?首发时间:?2021年11月11日? ✉️坚持和努力一定能换来诗与远方! ?参考书籍:?《Java核心技术卷1》,?《Java核心技术卷2》,?《Java编程思想》 ?参考在线编程网站:?牛...

    Cc_2011 评论0 收藏0
  • 【数据结构 Java 版】玩转链表(3)双链表

    摘要:文章目录一引子二双链表概念结构基操的实现三总结一引子前面已经了解了顺序表和单链表,而在面试当中这些也是经常被提起的在继续接下来的学习前,我们要搞清以下几个问题数组和链表的区别顺序表和链表的区别和的区别大家发现没上述问题 ...

    G9YH 评论0 收藏0
  • 轻松认清顺序表和链表-------------快乐人的java初学日记[6]

    摘要:链表总共有八种,但是我们主讲,无头单向非循环链表和无头双向链表。无头单向非循环链表结构简单,一般不会单独用来存数据。例如这个就是单链表的构造形式结果是因为先插入了然后插入了此外还有一些功能我们留一个课下作业。 ...

    不知名网友 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<