数据运算之单链表

今天学习了单链表,下面我将用C语言实现单链表数据运算中的插入、删除、查找、修改数据的功能,并且给出测试样例,希望多多指点。

1.定义节点的结构以及相关函数的声明:

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
typedef struct slistnode
{
	int data;
	struct slistnode* next;
}sltnode;
void sltnodeprint(sltnode* pf);
void tailadd(sltnode** pf, int data);
sltnode* get_tail(sltnode* pf);
void headadd(sltnode** pf, int data);
void taildel(sltnode** pf);
void headdel(sltnode** pf);
void del(sltnode** pf, sltnode*pos);
sltnode* sltfind(sltnode* pf, int data);
void sltmodify(sltnode* pf,sltnode*pos,int data);

2.功能实现:

    1.尾插:

void tailadd(sltnode** pf, int data)//尾插
{
	//空链表和非空链表
	assert(pf&&*pf);
	sltnode* new = (sltnode*)malloc(sizeof(sltnode));
	if (new == NULL)
	{
		perror("malloc");
		exit(1);
	}
	//空链表
	if (*pf == NULL)
	{
		*pf = new;
		(*pf)->data = data;
	}
	//非空链表
	else
	{
		new->next = NULL;
		new->data = data;
		sltnode* z = get_tail(*pf);
		z->next = new;
	}

}

2.头插:

void headadd(sltnode** pf, int data)//头插
{
	assert(pf&&*pf);
	sltnode* new = (sltnode*)malloc(sizeof(sltnode));
	if (new == NULL)
	{
		perror("malloc");
		exit(1);
	}
	new->data = data;
	new->next = *pf;
	*pf = new;
}

3.尾删:

void taildel(sltnode** pf)//尾删
{
	assert(pf && *pf);
	sltnode* prev = *pf;
	sltnode* ptail = *pf;
	//链表中只有一个节点
	if (ptail->next == NULL)
	{
		free(*pf);
		*pf = NULL;
	}
	//多个节点
	else
	{
		while (ptail->next)
		{
			prev = ptail;
			ptail = ptail->next;
		}
		free(ptail);
		ptail = NULL;
		prev->next = NULL;
	}
}

4.头删:

void headdel(sltnode** pf)//头删
{
	assert(pf&&*pf);
	sltnode* tmp = *pf;
	*pf = (*pf)->next;
	free(tmp);
	tmp = NULL;
}

5.删除指定数据:

void del(sltnode** pf, sltnode* pos)
{
	assert(pf && *pf);
	assert(pos);
	sltnode* prev = *pf;
	while (prev->next != pos)
	{
		prev = prev->next;
	}
	prev->next = pos->next;
	free(pos);
	pos = NULL;
}

6.查找:

sltnode* sltfind(sltnode* pf, int data)//查找指定节点
{
	sltnode* tmp = pf;
	while (tmp != NULL)
	{
		if (tmp->data == data)
			return tmp;
		tmp = tmp->next;
	}
	return NULL;
}

7.修改:

void sltmodify(sltnode* pf, sltnode*pos, int data)//修改指定节点
{
	pos->data = data;
}

8.打印:

void sltnodeprint(sltnode* pf)//打印链表
{
	sltnode* tmp = pf;
	while (tmp)
	{
		printf("%d->", tmp->data);
		tmp = tmp->next;
	}
	printf("NULL\n");
}

3.测试样例:

#include"slist.h"
void slisttest()
{
	sltnode* node1 = (sltnode*)malloc(sizeof(sltnode));
	node1->data = 1;
	sltnode* node2 = (sltnode*)malloc(sizeof(sltnode));
	node2->data = 2;
	sltnode* node3 = (sltnode*)malloc(sizeof(sltnode));
	node3->data = 3;
	sltnode* node4 = (sltnode*)malloc(sizeof(sltnode));
	node4->data = 4;
	sltnode* node5 = (sltnode*)malloc(sizeof(sltnode));
	node5->data = 5;
	node1->next = node2;
	node2->next = node3;
	node3->next = node4;
	node4->next = node5;
	node5->next = NULL;
	sltnode* phead = node1;
	sltnodeprint(phead);
	headadd(&phead, 6);
	sltnodeprint(phead);
	tailadd(&phead, 7);
	sltnodeprint(phead);
	headdel(&phead);
	sltnodeprint(phead);
	taildel(&phead);
	sltnodeprint(phead);
	sltnode* find = sltfind(phead, 2);
	del(&phead, find);
	sltnodeprint(phead);
}
int main()
{
	slisttest();
	return 0;
}

4.输出结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值