链表 增删查改

#include<stdio.h>
#include<Windows.h>
#include<assert.h>
typedef int DataType;
typedef struct SListNode
{
	DataType data;
	struct SListNode *next;
}SListNode;



SListNode* BuySListNode(DataType x)//创建一个新的结点
{
	SListNode *p = (SListNode*)malloc(sizeof(SListNode));
	p->data = x;
	p->next = NULL;
	return p;
}
void SListPrint(SListNode* phead)//打印链表中的结点  
{
	assert(phead);
	SListNode *p = phead;
	while (p)
	{
		printf("%d->", p->data);
		p = p->next;
	}
	printf("NULL\n");
}
void SListDestory(SListNode** pphead)//销毁链表
{
	assert(pphead);
	SListNode *p = NULL;
	while (*pphead)
	{
		p = (*pphead)->next;
		free(*pphead);
		*pphead = p;
		
	}
	free(p);
	free(*pphead);
	p = NULL;
	*pphead = NULL;
}

void SListPushBack(SListNode** pphead, DataType x)//尾插法
{
	//1.建立一个新节点,判断*phead是否为空,是则将node作为p的首个节点,不是则遍历至最后一个节点,接在p->next处
	assert(pphead);
	SListNode *node = BuySListNode(x);
	SListNode *p = *pphead;
	if (p == NULL)
	{
		*pphead = node;
	}
	else
	{
		while (p->next != NULL)
		{
			p = p->next;
		}		p->next = node;
	}
}
void SListPopBack(SListNode** pphead)  //尾删法
{
	//1判断链表是否为空
	//2找到最后一个节点的位置并free
	assert(pphead);
	
	if (*pphead == NULL)//无节点
	{
		printf("slistnode is empty!");
		return;
	}
	else if ((*pphead)->next == NULL)//一个节点
	{
		free(*pphead);
	}
	else//多个结点
	{
		SListNode *p = *pphead;
		SListNode *prev = NULL;
		while (p->next)
		{
			prev = p;
			p = p->next;
		}
		prev->next = NULL;
		free(p);
		p = NULL;
	}
}
void SListPushFront(SListNode** pphead, DataType x)
{
	assert(pphead);
	SListNode *p = BuySListNode(x);
	if (*pphead == NULL)//若原链表为空
	{
		*pphead = p;
	}
	else
	{
		p->next = *pphead;
		*pphead = p;
	}
}
SListNode* SListFind(SListNode* phead, DataType x)//查找x所在的位置
{
	assert(phead);
	if (phead == NULL)
	{
		printf("slistnode is empty!");
		return NULL;
	}
	else
	{
		SListNode *p = phead;
		while (p->next)
		{
			if (p->data == x)
			{
				return p;
			}
			else
			{
				p = p->next;
			}
		}
		printf("%d is not in this slistnode!",x);
		return NULL;
	}
}
void SListInsest(SListNode** pphead, SListNode* pos, DataType x)//任意位置插入
{
	assert(pphead);
	assert(pos);
	SListNode *p = *pphead;
	if (*pphead == pos)//如果插入位置是首地址
	{
		SListNode *u = BuySListNode(x);
		u->next = *pphead;
		*pphead = u;
	}
	else//插入位置非首地址
	{
		for (;p->next != pos;p = p->next)
		{
			;
		}
		SListNode *u = BuySListNode(x);
		u->next = pos;
		p->next = u;
	}

}
void SListErase(SListNode** pphead, SListNode* pos)//任意位置删除
{
	assert(pphead);
	assert(pos);
	
	if (*pphead = pos)//如果删除位置是首地址
	{
		*pphead = (*pphead)->next;
	}
	else if (pos->next == NULL)//尾地址
	{
		SListPopBack(pphead);
	}
	else//删除位置非首尾地址
	{
		SListNode *p = *pphead;
		SListNode* next = pos->next;
		while (p->next != pos)
		{
			p = p->next;
		}
		p->next = next;
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值