C语言 单向链表的增删查改快速掌握

 更新时间:2021年11月17日 14:04:13   作者:、薛定谔的猫~  
单向链表特点是链表的链接方向是单向的,访问要通过顺序读取从头部开始。链表是使用指针构造的列表,是由一个个结点组装起来的,又称为结点列表。其中每个结点都有指针成员变量指向列表中的下一个结点,head指针指向第一个结点称为表头,而终止于最后一个指向nuLL的指针

前言

链表是线性表的链式存储结构,它可以以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语言 单向链表的增删查改快速掌握的文章就介绍到这了,更多相关C语言 单向链表内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C语言实现超市计价收款系统

    C语言实现超市计价收款系统

    这篇文章主要为大家详细介绍了C语言实现超市计价收款系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • C++实现图形界面双人五子棋游戏

    C++实现图形界面双人五子棋游戏

    这篇文章主要为大家详细介绍了C++实现图形界面双人五子棋游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-05-05
  • C语言代码实现通讯录管理系统

    C语言代码实现通讯录管理系统

    这篇文章主要为大家详细介绍了C语言代码实现通讯录管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06
  • C语言库函数qsort的使用详解

    C语言库函数qsort的使用详解

    C语言库函数中的qsort的是一个回调函数,回调函数就是一个通过函数指针调用的函数,这篇文章主要介绍了C语言库函数qsort的使用,需要的朋友可以参考下
    2022-06-06
  • OpenCV实现图像拼接案例

    OpenCV实现图像拼接案例

    这篇文章主要介绍了OpenCV实现图像拼接案例,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的朋友可以参考一下
    2022-08-08
  • C++ 类和对象基础篇

    C++ 类和对象基础篇

    类是创建对象的模板,一个类可以创建多个对象,每个对象都是类类型的一个变量;创建对象的过程也叫类的实例化。每个对象都是类的一个具体实例(Instance),拥有类的成员变量和成员函数
    2020-01-01
  • 解析内存对齐 Data alignment: Straighten up and fly right的详解

    解析内存对齐 Data alignment: Straighten up and fly right的详解

    对于所有直接操作内存的程序员来说,数据对齐都是很重要的问题.数据对齐对你的程序的表现甚至能否正常运行都会产生影响
    2013-05-05
  • C语言 单向链表的增删查改快速掌握

    C语言 单向链表的增删查改快速掌握

    单向链表特点是链表的链接方向是单向的,访问要通过顺序读取从头部开始。链表是使用指针构造的列表,是由一个个结点组装起来的,又称为结点列表。其中每个结点都有指针成员变量指向列表中的下一个结点,head指针指向第一个结点称为表头,而终止于最后一个指向nuLL的指针
    2021-11-11
  • C语言程序如何求学生总成绩和平均成绩

    C语言程序如何求学生总成绩和平均成绩

    这篇文章主要介绍了C语言程序如何求学生总成绩和平均成绩,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • 学习C和C++的9点经验总结

    学习C和C++的9点经验总结

    本文给大家总结了一下我们在学习C和C++的时候的一些经验和需要注意的事项,希望能给大家一些帮助,少走些弯路
    2015-12-12

最新评论