单链表的基本算法实现

单链表的基本操作实现

先说点题外话:本科是一所双非院校,因为已经在准备考研了,所以不得不回头重新拿起这些最基本的数据结构知识,每重新看一次都会有一些新的理解,因为在校期间说实话数据结构这些基本知识确实学的不好,曾经有一段时间一直在逃避,可能不如其他大佬那么精简,但是后来发现计算机这一行算法是逃不掉的,加上从入学就一直想考研,重新买了王道的书,一点一点的扣这些基本算法,希望能把每个点吃透,也让别人看的舒服一点,实践远大于理论,这是我学这个专业最为赞同的一句话,无论什么时候都要实操这些东西,所以本着这些我一次又一次在机器上跑这些代码,就是为了让自己的知识更为扎实牢固一点,希望我的努力能或多或少帮助到你。

这些算法都是基于带头结点的链表实现的,因为时间有限,所以不带头结点的就不放上来了,当然很多操作可能有我没想到的地方,或许可以变形更为精简,如有错误欢迎各位批评指正

1.初始化单链表

//单链表的初始化
int InitList(LinkList* L) //引用类型指针形参// 
{
	(*L) = (LinkList)malloc(sizeof(LNode));  //头结点分配空间// 
	(*L)->next = NULL;               //头结点指针域置空//                          
	if (L)
		printf("Finish\n");
	else
		printf("Error\n");
	return Ok;
}

2.头插法创建单链表

int CreateList_1(LinkList* L, int n) //引用类型指针形参// 
{
	printf("逆序输入\n");
	int i;
	LinkList p;
	(*L) = (LinkList)malloc(sizeof(LNode));
	(*L)->next = NULL;
	for (i = n; i > 0; i--)
	{
		p = (LNode*)malloc(sizeof(LNode));
		scanf("%d", &p->data);
		p->next = (*L)->next;
		(*L)->next = p;
	}
	return Ok;
}

3.尾插法创建单链表

//尾插法构建链表// 
int CreateList_2(LinkList* L, int n) //引用类型指针形参//
{
	int i;
	printf("正序输入\n");
	LinkList p, r;
	(*L) = (LinkList)malloc(sizeof(LNode));
	(*L)->next = NULL;

	r = (*L);
	for (i = 0; i < n; i++)
	{
		p = (LinkList)malloc(sizeof(LNode));

		scanf("%d", &p->data);
		p->next = NULL;
		r->next = p;
		r = p;
	}
	return Ok;
}

4.按位查找单链表

//按位序查找
int GetElem2(LinkList L, int i)
{
	LNode* p = L;
	if (i < 0)
		printf("查找位置不合法,查找失败!");
	int j = 0;
	while (p != NULL && j < i)
	{
		p = p->next;
		j++;
	}
	return p;
}

5.按值查找

//按值查找
int GetElem(LinkList L, int i, Elemtype* e)

{

	int j;

	LinkList p;     /* 声明一结点p */

	p = L->next;     /* 让p指向链表L的第一个结点 */

	j = 1;      /*  j为计数器 */

	while (p && j < i)  /* p不为空或者计数器j还没有等于i时,循环继续 */

	{

		p = p->next;  /* 让p指向下一个结点 */

		++j;

	}

	if (!p || j > i)

		return Error;  /*  第i个元素不存在 */

	*e = p->data;   /*  取第i个元素的数据 */

	return Ok;

}

6.单链表的插入操作

//单链表的插入(按位序插入)
int InsertList(LinkList L, int i, Elemtype e)
{
	if (i < 1)
	printf("插入位置非法,插入失败!");//这里的插入是按照位置插入,并非结点下标值。所以从第一个位置插入
	LNode* p, * x;
	p = L;
	
	int j = 0;//头节点为第0个结点,没有数据
	while (p!=NULL&&j<i-1)//遍历找到插入位置的前一个元素
	{
		p = p->next;
		j++;
	}

	if (!p || j > i - 1)
		return Error;
	x = (LNode*)malloc(sizeof(LNode));
	x->data = e;
	x->next = p->next;
	p->next = x;
	printf("插入数据成功");
}

7.单链表的删除

//单链表的删除操作
int DeleteNode(LinkList L, int i, Elemtype e)
{
	LNode* p = L;
	//找到待删除节点的前驱结点,让前驱结点指向待删除节点的后继节点。释放结点内存空间
	int j = 0;
	while (p != NULL&&j<i-1)
	{
		p = p->next;
		j++;
	}
	if (!p || j > i - 1)//删除位置不合法
		return Error;
	LNode* q = p->next;//q指向被删除结点
	p->next = q->next;
	e = q->data;
	free(q);
}

8.单链表的逆置

//单链表的逆置
void Travserve(LinkList L)
{
	LinkList p = L->next;
	L->next = NULL;
	LinkList q;
	while (p)
	{
		q = p->next;
		p->next = L->next;
		L->next = p;
		p = q;
	}
}

9.利用后插实现结点的前插

//前插操作的变形,
int PriorInsert(LinkList *L, int i,LNode* p, LNode* s)//s为待插入节点,
{
	//调用查找函数先找到插入该结点的前驱结点
	
	GetElem2(L, i);//查找p结点
	s->next = p->next;
	p->next = s;
	//交换数据域
	Elemtype temp=p->data;
	p->data = s->data;
	s->data = temp;
	printf("插入成功");
}

10.清空单链表

//清空单链表
void clear(LinkList L)
{
	LinkList p, q;
	p = L->next;

	while (p)
	{
		q = p->next;
		free(p);
		p = q;

	}
	L->next = NULL;
	printf("链表已清空");
}

11.判空操作

//判空
void Empty(LinkList L)
{
	if (L->next == NULL)
	{
		printf("链表为空链表");
	}
	else {
		printf("链表不为空");
	}
}
  • 1
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
单链表是一种常用的数据结构,它由若干个结点组成,每个结点包含一个数据域和一个指向下一个结点的指针。单链表基本操作包括:初始化、插入结点、删除结点、查找结点等。下面是单链表基本运算算法实现。 首先,定义单链表的结点结构体: ```c typedef struct LNode { DataType data; struct LNode *next; } LNode, *LinkList; ``` 其中,`DataType`为数据类型,可以根据实际需求进行定义。 初始化单链表: ```c void InitList(LinkList *L) { *L = (LinkList) malloc(sizeof(LNode)); (*L)->next = NULL; } ``` 插入结点: ```c void InsertList(LinkList L, int pos, DataType x) { int index = 0; LinkList p = L, q; while (p && index < pos - 1) { p = p->next; index++; } if (!p || index > pos - 1) { printf("Invalid position.\n"); return; } q = (LinkList) malloc(sizeof(LNode)); q->data = x; q->next = p->next; p->next = q; } ``` 删除结点: ```c void DeleteList(LinkList L, int pos) { int index = 0; LinkList p = L, q; while (p->next && index < pos - 1) { p = p->next; index++; } if (!p->next || index > pos - 1) { printf("Invalid position.\n"); return; } q = p->next; p->next = q->next; free(q); } ``` 查找结点: ```c LinkList FindList(LinkList L, DataType x) { LinkList p = L->next; while (p != NULL && p->data != x) { p = p->next; } return p; } ``` 需要注意的是,在插入和删除结点时,需要保证传入的位置参数`pos`合法,即在链表的范围之内。此外,当查找结点时,如果找到了指定的元素,则返回它所在的结点的指针;如果没有找到,则返回`NULL`。 完整代码如下:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值