数据结构--链表的基本操作

本文深入讲解了链表的基本操作,包括初始化、插入、删除、查找等,并提供了详细的C语言实现代码,适合初学者和需要复习链表操作的程序员阅读。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.链表的初始化

2.尾插

3.头插

4.尾删

5.头删

6.给定节点删除

7.按值查找

8.按值删除,只删除遇到的第一个

9.按值删除,删除所有

10.销毁 

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

// 值类型 
typedef int DataType;

typedef struct SListNode {
	DataType data; // 值 
	struct ListNode *pNext; // 指向下一个结点 
} SListNode;

// 初始化 
void SListInit(SListNode **ppFirst)
{
	assert(ppFirst != NULL);
	*ppFirst = NULL;
}

// 尾部插入 
void SListPushBack(SListNode** ppFirst, DataType data)
{
	SListNode *newNode = (SListNode*)malloc(sizeof(SListNode));
	assert(newNode);
	newNode->data = data;
	newNode->pNext= NULL;
	if (*ppFirst == NULL)
	{
		*ppFirst = newNode;
		return;
	}
	SListNode *cur = *ppFirst;
	while (cur->pNext != NULL)
	{
		
		cur = cur->pNext;
	}
	cur->pNext = newNode;
}

// 头部插入 
void SListPushFront(SListNode **ppFirst, DataType data)
{
	assert(ppFirst != NULL);
	//特殊情况,链表为空,*ppFirst==NULL:
	SListNode * newNode = (SListNode *)malloc(sizeof(SListNode));
	assert(newNode);
	newNode->data = data;
	newNode->pNext = NULL;

	newNode->pNext = *ppFirst;

	*ppFirst = newNode;
}

// 尾部删除 
void SListPopBack(SListNode **ppFirst)
{
	assert(ppFirst != NULL);
	assert(*ppFirst != NULL);
	if ((*ppFirst)->pNext == NULL)
	{
		free(*ppFirst);
		*ppFirst = NULL;
		return;
	}

	SListNode *del;
	SListNode *cur = *ppFirst;
	while (cur->pNext != NULL)
	{
		cur = cur->pNext;
	}
	del = cur->pNext;
	cur->pNext = NULL;
	free(del);
}

// 头部删除 
void SListPopFront(SListNode **ppFirst)
{
    assert(ppFirst != NULL);
	assert(*ppFirst != NULL);
	SListNode *del = *ppFirst;
	*ppFirst = (*ppFirst)->pNext;
	free(del);
}

// 给定结点插入,插入到结点前 
void SListInsert(SListNode **ppFirst, SListNode *pPos, DataType data)
{
	assert(ppFirst != NULL);
	SListNode * newNode = (SListNode *)malloc(sizeof(SListNode));
	assert(newNode);
	newNode->data = data;
	newNode->pNext = pPos;
	if (*ppFirst == pPos)
	{
		SListPushFront(*ppFirst, data);
		return;
	}
	while ((*ppFirst)->pNext == pPos)
	{
		*ppFirst = (*ppFirst)->pNext;
	}
	(*ppFirst)->pNext = newNode;
	free(newNode);
}

// 给定结点删除 
void SListErase(SListNode **ppFirst, SListNode *pPos)
{
	if (*ppFirst == pPos)
	{
		ListPopFront(ppFirst);
		return;
	}
	SListNode *cur = *ppFirst;
	while (cur->pNext != pPos)
	{
		cur = cur->pNext;
	}
	cur->pNext = pPos->pNext;
	free(pPos);
}

// 按值删除,只删遇到的第一个 
void SListRemove(SListNode **ppFirst, DataType data)
{
	SListNode *pPos;
	assert(ppFirst != NULL);
	pPos = SListFind(*ppFirst, data);
	if (pPos == NULL)
	{
		printf("不存在\n");
	}
	else
	{
		SListErase(ppFirst, pPos);
	}
}

// 按值查找,返回第一个找到的结点指针,如果没找到,返回 NULL 
int SListFind(SListNode *pFirst, DataType data)
{
	for (SListNode *cur = pFirst; cur != NULL; cur = cur->pNext)
	{
		if (data == cur->data)
		{
			return cur;
		}
	}
	return NULL;
}

// 按值删除,删除所有的 
void SListRemoveAll(SListNode **ppFirst, DataType data)
{
	SListNode *pPos, *x;
	assert(ppFirst != NULL);
	x = SListFind(*ppFirst, data);
	if (x == NULL)
	{
		printf("要删除的节点为空\n");
	}
	else
	{
		for (pPos = *ppFirst; pPos != NULL; pPos = pPos->pNext)
		{
			if (pPos->data == data)
			{
				SListErase(ppFirst, pPos);
			}
		}
	}
}

// 销毁 
void SListDestroy(SListNode **ppFirst)
{
	SListNode *y;
	SListNode *cur = *ppFirst;
	for (SListNode *cur = ppFirst; cur != NULL; cur = y)
	{
		y = cur->pNext;
		free(cur);
	}
	*ppFirst = NULL;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值