首页后端开发其他后端知识C语言中单向链表的增删改操作如何实现

C语言中单向链表的增删改操作如何实现

时间2024-03-26 01:12:04发布访客分类其他后端知识浏览1055
导读:这篇文章主要给大家介绍“C语言中单向链表的增删改操作如何实现”的相关知识,下文通过实际案例向大家展示操作过程,内容简单清晰,易于学习,有这方面学习需要的朋友可以参考,希望这篇“C语言中单向链表的增删改操作如何实现”文章能对大家有所帮助。...
这篇文章主要给大家介绍“C语言中单向链表的增删改操作如何实现”的相关知识,下文通过实际案例向大家展示操作过程,内容简单清晰,易于学习,有这方面学习需要的朋友可以参考,希望这篇“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语言中单向链表的增删改操作如何实现”的内容就介绍到这,感谢各位的阅读,相信大家对C语言中单向链表的增删改操作如何实现已经有了进一步的了解。大家如果还想学习更多知识,欢迎关注网络,小编将为大家输出更多高质量的实用文章!

声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!


若转载请注明出处: C语言中单向链表的增删改操作如何实现
本文地址: https://pptw.com/jishu/653161.html
如何理解C++中的内链接与外链接 PHP实现文件上传的方法和步骤是什么?

游客 回复需填写必要信息