链表 9.15作业

该博客详细介绍了如何使用C语言实现链表的各种操作,包括创建、判空、查找、插入、删除、修改、遍历、释放和逆置等基本功能。此外,还涵盖了头插、头删、尾插、尾删、按位置查找和修改以及任意位置的插入和删除等高级操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include "linklist.h"
#include <stdio.h>
#include <stdlib.h>

//创建
linklist create()
{
	linklist l=(linklist)malloc(sizeof(Node));

	if(NULL==l)
	{
		printf("创建失败\n");
		return NULL;
	}
	l->len=0;
	l->next=NULL;
	printf("创建成功\n");
	return l;
}

//判空
int empty(linklist l)
{
	return l->next==NULL ? 1: 0;
}
//申请的节点
linklist make_node(datatype e)
{
	linklist p=(linklist)malloc(sizeof(Node));
	if(NULL==p)
	{
		printf("插入内容失败\n");
		return NULL;
	}
	p->data=e;
	p->next=NULL;
	return p;
}

//按位置查找
linklist find_node(linklist l,int pos)
{
	if(NULL==l || empty(l) || pos<0 || pos>l->len)
	{
		printf("查找失败\n");
		return NULL;
	}

	//开始查找
	linklist q=l;
	for(int i=1;i<=pos;i++)
	{
		q=q->next;
	}

	//将找到的第pos个节点返回
	return q;
}

//按值查找
linklist find_value(linklist l,datatype e)
{
	if(NULL==l || empty(l))
	{
		printf("查找失败\n");
		return NULL;
	}
	linklist q=l->next;
	while(q!=NULL)
	{
		if(q->data==e)
		{
		printf("查找成功\n");
		return q;
		}
		q=q->next;
	}
	printf("查找失败\n");
}

//按值修改
int update_value(linklist l,datatype old_e,datatype new_e)
{
	if(NULL==l || empty(l))
	{
		printf("修改失败\n");
		return -1;
	}
	linklist p=find_value(l,old_e);
	if(NULL==p)
	{
		return -1;
	}
	p->data=new_e;
	printf("%c\n",p->data);
	printf("修改成功\n");
	return 0;
}

//按位置修改
int update_pos(linklist l,datatype new_e,int pos)
{
	if(NULL==l || empty(l) || pos<1 || pos>l->len)
	{
		printf("修改失败\n");
		return -1;
	}
	linklist p=find_node(l,pos);
	if(NULL==p)
	{
		return -1;
	}
	p->data=new_e;
	printf("%c\n",p->data);
	printf("修改成功\n");
	return 0;
}

//头插
int head(linklist l,datatype e)
{

	if(NULL==l)
	{
		printf("插入失败\n");
		return -1;
	}
	linklist p=make_node(e);
	//头插逻辑
	p->next=l->next;
	l->next=p;
	l->len++;
	printf("插入成功\n");
	return 0;
}

//头删除
int delete_head(linklist l)
{
	if(NULL==l || empty(l))
	{
		printf("删除失败\n");
		return -1;
	}

	linklist p=l->next;//标记要删除的节点
	l->next=p->next;//孤立它
	l->len--;

	free(p);
	p=NULL;

	printf("删除成功\n");
	return 0;
}

//尾插
int tail(linklist l,datatype e)
{
	if(NULL==l)
	{
		printf("插入失败\n");
		return -1;
	}
	linklist q=find_node(l,l->len);
	linklist p=make_node(e);
	
	p->next=q->next;
	q->next=p;
	l->len++;
	printf("插入成功\n");
	return 0;
}
//尾删
int delete_tail(linklist l)
{
	if(NULL==l || empty(l))
	{
		printf("删除失败\n");
		return -1;
	}
	linklist q=find_node(l,l->len-1);
	linklist p=q->next;
	q->next=p->next;
	l->len--;
	free(p);
	p=NULL;
	printf("删除成功\n");
	return 0;
}

//任意删
int delete_pos(linklist l,int pos)
{
	if(NULL==l || empty(l) || pos<1 || pos>l->len)
	{
		printf("删除失败\n");
		return -1;
	}
	linklist q=find_node(l,pos-1);
	linklist p=q->next;
	q->next=p->next;
	l->len--;
	free(p);
	p=NULL;
	printf("删除成功\n");
	return 0;
}


//任意插
int else_pos(linklist l,datatype e,int pos)
{
	if(NULL==l || pos<1 || pos>l->len+1)
	{
		printf("任意插入失败\n");
		return -1;
	}
	linklist q=find_node(l,pos-1);
	linklist p=make_node(e);
	p->next=q->next;
	q->next=p;
	l->len++;
	printf("插入成功\n");
	return 0;
}

//遍历
void show(linklist l)
{
	if(NULL==l || empty(l))
	{
		printf("遍历失败\n");
		return;
	}
	//需要一个指针指向第一个next并往下走
	//遍历每一个data,再到自己的next指向下一个
	linklist first = l->next;
	while(first!=NULL)
	{
		printf("%c\t",first->data);
		first=first->next;
	}
//	putchar(10);
	printf("遍历成功\n");
}

//释放
void my_free(linklist l)
{
	if(NULL==l)
	{
		printf("释放失败\n");
		return;
	}
	while(!empty(l))
	{
		delete_head(l);
	}
	free(l);
	l=NULL;
	printf("释放成功\n");
}

//逆置
void reverse(linklist l)
{
	if(NULL==l || empty(l))
	{
		printf("未逆置\n");
		return;
	}
	linklist first=l->next;
	linklist final=find_node(l,l->len);
	while(NULL!=first->next)
	{
		head(l,final->data);
		printf("逆置\n");
		first=first->next;
	}
	

}

//链表合并
void merga(linklist l,linklist s)
{
	if(NULL==l || NULL==s ||empty(s) || empty(l))
	{
		printf("未合并\n");
		return;
	}
	linklist p=l;
	while(NULL!=p->next)
	{
		p=p->next;
	}
	p->next=s->next;
	l->len+=s->len;
	free(s);
	s=NULL;
	printf("合并成功\n");
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值