C语言单链表的实现(增删改查和一些其他接口)

1.链表的概念

概念:链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的 。单链表的结构如下:

在这里插入图片描述

2.头文件

#include <stdio.h>
#include <stdlib.h>

3.单链表的创建

typedef struct SListNode
{
	int data;//存储数据
	SListNode* next;//指向下一个节点的指针
}SListNode;
typedef SListNode* List;

4.初始化单链表

// 动态申请一个节点
SListNode* InitList(List plist)
{
	plist->next = NULL;//将头结点的next指针置空,并且头结点不存放数据
	return plist;
}

5.插入

5.1头插

将一个新的数据节点插入到头结点之后,代码如下:

//头插
bool Insert_Front(List plist, int val)
{
	SListNode* p = (SListNode*)malloc(sizeof(SListNode));//开辟新节点的存储空间
	p->data = val;
	//下面两行代码的顺序不可调换,否则头结点之后的所有数据都将丢失并造成内存泄露
	p->next = plist->next;
	plist->next = p;
	return true;
}
5.2尾插

将一个新的数据节点插入到单链表的最后,代码如下:

//尾插
bool Insert_Back(List plist, int val)
{
	SListNode* p = (SListNode*)malloc(sizeof(SListNode));//开辟新节点的存储空间
	p->data = val;
	//遍历单链表
	SListNode* q;
	for (q = plist;q->next != NULL;q = q->next);
	p->next = q->next;
	q->next = p;
	return true;
}

6.查找

//查找
SListNode* Search(List plist, int val)
{
	SListNode* p = (SListNode*)malloc(sizeof(SListNode));
	//遍历链表
	for (p = plist->next;p->next != NULL;p = p->next)
	{
		//判断数据是否相等,如果查找到则返回节点,否则要释放开辟的空间并返回空
		if (p->data == val)
		{
			return p;
		}
	}
	free(p);
	return NULL;
}

7.删除

7.1头删
//头删
bool Delete_Front(List plist)
{
	SListNode* p = plist->next;//存储头结点的下一个节点
	plist->next = plist->next->next;//将头结点的下一个节点指向下个节点的下个节点
	free(p);//释放原来头结点的下个节点
	return true;
}
7.2尾删
//尾删
bool Delete_Back(List plist)
{
	SListNode* q = NULL;
	SListNode* p = plist;
	while (p->next != NULL)
	{
		q = p;
		p = p->next;
	}
	q->next = NULL;
	free(p);
	return true;
}
7.3删除数据
//删除数据
bool Delete(List plist, int val)
{
	for (SListNode *p = plist->next;p->next != NULL;p = p->next)
	{
		if (p->next->data == val)
		{
			//使用覆盖删除,并释放对应数据的空间
			SListNode* q = p->next;
			p->next = p->next->next;
			q->next = NULL;
			free(q);
			return true;
		}
	}
	return false;
}

8.修改

bool SetVal(List pilist,int val,int newval)
{
	for (SListNode *p = plist->next;p->next != NULL;p = p->next)
	{
		if (p->next->data == val)
		{
			p->next->data = newval;
			return true;
		}
	}
	return false;
}

9.功能性接口

9.1打印单链表数据
//输出数据
void Show(List plist)
{
	for (SListNode* p = plist->next;p->next != NULL;p = p->next)
	{
		printf("%d ", p->data);
	}
	printf("\n");
}
9.2获取有效数据个数
//获取数据长度
int GetLength(List plist)
{
	int count = 0;
	for (SListNode* p = plist->next;p->next != NULL;p = p->next)
	{
		count++;
	}
	return count;
}
9.3销毁
//销毁内存,删除第一个节点的方法
void Destroy(List plist)
{
	SListNode* p;
	while (plist->next != NULL)
	{
		p = plist->next;
		plist->next = p->next;
		free(p);
	}
}
9.4判空
//判空
bool IsEmpty(List plist)
{
	if (plist->next == NULL)
	{
		return true;
	}
	return false;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值