C语言实现单链表基础操作--增删查改

7 篇文章 0 订阅
typedef int DataType;

typedef struct ListNode
{
	DataType data;
	ListNode* next;
}ListNode;




注:

1.以下函数都是针对无环单链表

2.若可能修改到原链表头结点,都要传二级指针






函数如下:

ListNode* BuyNode(DataType x);					//开辟新节点
void PushBack(ListNode** list, DataType data);			 //尾插
void PopBack(ListNode** list);					 //尾删
void PushFront(ListNode** list, DataType data);			//头插
void PopFront(ListNode** list); 				//头删
void Insert(ListNode** pplist, ListNode* pos, DataType data);	//定点插入
void Erase(ListNode** pplist, ListNode* pos);			//定点删除
void PrintList(ListNode* list); 				//打印
ListNode* Find(ListNode* plist, DataType data);			//查找
void DestoryList(ListNode** pplist); 				//释放单链表(若有环,先解环)






1.开辟新节点

ListNode* BuyNode(DataType x)
{
	ListNode* p = (ListNode*)malloc(sizeof(ListNode));
	p -> data = x;
	p -> next = NULL;
	return p;
}







2.尾插

void PushBack(ListNode** pplist, DataType data)
{
	//1.空 2.非空
	assert(pplist);
	if (*pplist == NULL)
	{
		*pplist = BuyNode(data);
	}
	else 
	{
		ListNode* tail = *pplist;
		while(tail -> next)
		{
			tail = tail -> next;
		}
		tail -> next = BuyNode(data);
	}
}






3.尾删

void PopBack(ListNode** pplist)
{
	//1.空 2.1个 3.多个
	assert(pplist);
	if (*pplist == NULL)
	{
		return;
	}
	else if ((*pplist) -> next == NULL)
	{
		free(*pplist);
		*pplist = NULL;
	}
	else
	{
		ListNode* tail = *pplist;
		ListNode* prev = NULL;
		while (tail -> next)
		{
			prev = tail;
			tail = tail -> next;
		}
		free(tail);
		prev -> next = NULL;
	}
}





4.头插

void PushFront(ListNode** pplist, DataType data)
{
	//1.空 2.非空
	assert(pplist);
	if (*pplist == NULL)
	{
		*pplist = BuyNode(data);
	}
	else
	{
		ListNode* p = BuyNode(data);
		p -> next = *pplist;
		*pplist = p;
	}
}







5.头删

void PopFront(ListNode** pplist)
{
	//1.空 2.1个 3.多个
	assert(pplist);
	if (*pplist == NULL)
	{
		return;
	}
	else if ((*pplist)-> next == NULL)
	{
		free(*pplist);
		*pplist = NULL;
	}
	else
	{
		ListNode* p = (*pplist) -> next;
		free(*pplist);
		*pplist = p;
	}
}






6.定点插入

void Insert(ListNode** pplist, ListNode* pos, DataType data)
{
	assert(pplist);
	assert(pos);

	if (pos == *pplist)
	{
		PushFront(pplist, data);
	}
	
	else
	{
		ListNode* prev = *pplist;
		while ((prev->next) != pos)
		{
			prev = prev -> next;
		}
		prev -> next = BuyNode(data);
		(prev -> next) -> next = pos;
	}
}






7.定点删除

void Erase(ListNode** pplist, ListNode* pos)
{
	assert(pplist);
	assert(pos);
	
	if (pos == *pplist)
	{
		PopFront(pplist);
	}
	
	else if (pos -> next == NULL)
	{
		PopBack(pplist);
	}

	else
	{
		ListNode* prev = *pplist;
		while ((prev -> next) != pos)
		{
			prev = prev -> next;
		}
		prev -> next = pos -> next;
		free(pos);
	}
}







8.打印

void PrintList_r(ListNode* plist)
{
	if (plist == NULL)
	{
		return;
	}

	PrintList_r (plist -> next);
	printf("%d->", plist -> data);
}






9.查找

ListNode* Find(ListNode* plist, DataType data)
{
	ListNode* cur = plist;
	while (cur)
	{
		if (cur -> data == data)
		{
			return cur;
		}
		cur = cur -> next;
	}
	return NULL;
}





10.释放

void DestoryList(ListNode** pplist)
{
	assert(pplist);
	ListNode* cur = *pplist;
	while(cur)
	{
		ListNode* next = cur->next;
		free(cur);
		cur = next;
	}
	*pplist = NULL;
}


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值