7.20 数据结构单链表的一系列操作

1. 完成尾删函数:int list_delete_tail(Linklist *L);

通过while循环遍历到最后一个节点的前驱节点,通过free()函数释放该节点,并指向NULL,最后要将头节点中的len减1;

//尾删
int list_delete_tail(linkList* L)
{
	//逻辑判断
	if(NULL==L||list_empty(L))
	{
		printf("尾删失败!\n");
		return -1;
	}
	//遍历到最后一个节点的前驱结点
	linkList* p = L;
	while(p->next->next != NULL)
	{
		p=p->next;
	}
	//删除逻辑
	free(p->next);
	p->next=NULL;
	//表的变化
	L->len--;
	printf("尾删除成功!\n");
	return 0;
}

2. 完成按位置修改函数 : int list_update_pos(Linklist *L, int pos, datatype e);

先判断链表是否合法、位置是否合法;通过调用node_find(linkList* L,int pos)函数返回该位置的节点,直接修改该节点的数据域即可;

//按位置修改
int list_update_pos(linkList* L,int pos,datatype e)
{
	//判断逻辑
	if(NULL==L || pos<1 || pos>L->len)
	{
		printf("按位置修改失败!\n");
		return -1;
	}
	//直接修改	
	linkList* p = node_find(L,pos);
	p->data=e;
	printf("按位置修改成功!\n");
	return 0;
}

3. 完成按值修改函数: int list__update_value(Linklist *L, datatype old_e, datatype new_e);

调用list_search_value(linkList* L,datatype e)函数通过按值查找返回该值所在的位置,再调用node_find(linkList* L,int pos)函数按位置查找返回节点,最后直接修改该节点的数据域即可;

//按值修改
int list_update_value(linkList* L,datatype old_e,datatype new_e)
{
	//判断逻辑
	if(NULL == L||list_empty(L))
	{
		printf("按值修改失败!\n");
		return -1;
	}
	//修改
	int index = list_search_value(L,old_e);
	if(index<=0)
	{
		printf("该值不存在!\n");
		return -2;
	}
	linkList* p = node_find(L,index);
	p->data = new_e;
	printf("按值修改成功!\n");
	return 0;
}

4. 完成链表反转函数:void list_reverse(Linklist *L);

链表的反转即链表中各个数据域的数据的反转,通过for循环,调用node_find(linkList* L,int pos)函数返回需要交换数据的两个节点,一个从最后一个位置往前同时另一个从第一个位置往后返回各自的节点,再通过三杯水原则进行交换数据即可完成反转;

//链表反转函数
void list_reverse(linkList* L)
{
	//逻辑判断
	if(NULL == L||list_empty(L))
	{
		printf("反转失败!\n");
	}
	//三杯水交换原则
	for(int i=L->len;i>L->len/2;i--)
	{
		datatype temp;
		linkList* p = node_find(L,i);
		linkList* q = node_find(L,L->len+1-i);
		temp = p->data;p->data=q->data;q->data=temp;
	}
	printf("反转成功!\n");
}

5. 主函数

#include <stdio.h>
#include <stdlib.h>
#include "linklist.h"
int main(int argc, const char *argv[])
{
	//创建头节点
	linkList* L=list_create();
	if(NULL == L)
	{
		return -1;
	}
	//调用头插函数
	list_insert_head(L,'H');list_insert_head(L,'E');list_insert_head(L,'L');
	list_insert_head(L,'L');list_insert_head(L,'C');list_insert_head(L,'Q');
	printf("L->len=%d\n",L->len);list_show(L);
	//调用尾插函数
	list_insert_tail(L,'M');list_show(L);
	printf("L->len=%d\n",L->len);
	//调用任意插函数
	list_insert_pos(L,7,'K');list_show(L);
	//头删
	list_delete_head(L);list_show(L);
	//调用任意删
	list_delete_pos(L,3);list_show(L);
	//调用尾删函数
	list_delete_tail(L);list_show(L);
	//调用按值查找函数
	int res = list_search_value(L,'K');
	if(res<0)
	{
		printf("按值查找失败!\n");
	}else if(res==0)
	{
		printf("没找到!\n");
	}else
		printf("按值查找成功!在第%d个\n",res);
	//调用按位置修改函数
	list_update_pos(L,2,'X');list_show(L);
	//调用按值修改函数
	list_update_value(L,'X','O');list_show(L);
	//调用函数反转
	list_reverse(L);list_show(L);
	//调用释放函数
	list_free(L);
	L = NULL;
	return 0;
}

6.测试结果

在这里插入图片描述

完整代码链接:https://github.com/YoungBesLin/C_data_structure_linkList

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不知名社畜L

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值