数据结构day4

 

#include "cycle_linklist.h"

//创建头结点
linkptr Create_Head()
{
	linkptr h=(linkptr)malloc(sizeof(linknode));
	if(NULL==h)
	{
		puts("申请空间失败");
		return NULL;
	}
	h->len=0;
	h->next=NULL;
	return h;
}
//创建结点
linkptr Create_Node(linkptr h,int data)
{
	linkptr new=(linkptr)malloc(sizeof(linknode));
	if(NULL==new)
	{
		puts("申请空间失败");
		return NULL;
	}
	new->data=data;
	new->next=h;
	return new;
}
//判空
int Empty_Link(linkptr h)
{
	if(NULL==h)
	{
		puts("入参为空");
		return -1;
	}
	return h->len==0?1:0;
}
//输出
void Output(linkptr h)
{
	if(NULL==h)
	{
		puts("入参为空");
	}
	linkptr p=h->next;
	while(p!=h)
	{
		printf("%d->",p->data);
		p=p->next;
	}
}
//头插
int Insert_Head(linkptr h,int data)
{
	if(NULL==h)
	{
		puts("入参为空");
		return -1;
	}
	linkptr new=Create_Node(h,data);
	if(NULL==h->next)
	{
		return 0;
	}
	new->next=h->next;
	h->next=new;
	h->len++;
	return 0;
}
//尾插
int Insert_Tail(linkptr h,int data)
{
	if(NULL==h)
	{
		puts("入参为空");
		return -1;
	}
	linkptr new=Create_Node(h,data);
	if(NULL==h->next)
	{
		return 0;
	}
	linkptr p=h;
	while(p->next!=h)
	{
		p=p->next;
	}
	p->next=new;
	h->len++;
	return 0;
}
//按位置插入
int Insert_Pos(linkptr h,int pos,int data)
{
	if(NULL==h)
	{
		puts("入参为空");
		return -1;
	}
	if(pos<=0 || pos>h->len+1)
	{
		puts("位置不合理");
		return -2;
	}
	linkptr new=Create_Node(h,data);
	int i=0;
	linkptr p=h;
	while(i<pos-1)
	{
		p=p->next;
		i++;
	}
	new->next=p->next;
	p->next=new;
	h->len++;
	return 0;
}	
//头删
int Dele_Head(linkptr h)
{
	if(NULL==h)
	{
		puts("入参为空");
		return -1;
	}
	if(NULL==h->next)
	{
		puts("链表为空");
		return -2;
	}
	linkptr del=h->next;
	h->next=del->next;
	free(del);
	del=NULL;
	h->len--;
}
//尾删
int Dele_Tail(linkptr h)
{
	if(NULL==h)
	{
		puts("入参为空");
		return -1;
	}
	if(NULL==h->next)
	{
		puts("链表为空");
		return -2;
	}
	linkptr p=h;
	while(p->next->next!=h)
	{
		p=p->next;
	}
	linkptr del=p->next;
	p->next=h;
	free(del);
	del=NULL;
	h->len--;
}
//按位置删除
int Dele_Pos(linkptr h,int pos)
{
	if(NULL==h)
	{
		puts("入参为空");
		return -1;
	}
	if(pos<=0 || pos>h->len)
	{
		puts("位置不合理");
		return -2;
	}
	int i=0;
	linkptr p=h;
	while(i<pos-1)
	{
		i++;
		p=p->next;
	}
	linkptr del=p->next;
	p->next=del->next;
	free(del);
	del=NULL;
	h->len--;
}
//按值删除
void Dele_Value(linkptr h,int value)
{
	Dele_Pos(h,Search_Value(h,value));
}
//按位置修改
int Change_Pos(linkptr h,int pos,int new)
{
	if(NULL==h)
	{
		puts("入参为空");
		return -1;
	}
	if(pos<=0 || pos>h->len)
	{
		puts("位置不合理");
		return -2;
	}
	int i=1;
	linkptr p=h->next;
	while(i<pos)
	{
		i++;
		p=p->next;
	}
	p->data=new;
	return p->data;
}
//按值修改
int Change_Value(linkptr h,int data,int new)
{
	if(NULL==h)
	{
		puts("入参为空");
		return -1;
	}
	if(NULL==h->next)
	{
		puts("链表为空");
		return -2;
	}
	linkptr p=h->next;
	while(p!=h)
	{
		if(p->data==data)
		{
			p->data=new;
			return 0;
		}
		p=p->next;
	}
	puts("没找到该值");
	return 1;
}
//按位置查找,返回值
int Search_Pos(linkptr h,int pos)
{
	if(NULL==h)
	{
		puts("入参为空");
		return -1;
	}
	if(pos<=0 || pos>h->len)
	{
		puts("位置不合理");
		return -2;
	}
	int i=1;
	linkptr p=h->next;
	while(i<pos)
	{
		i++;
		p=p->next;
	}
	return i;
}	
//按值查找,返回位置
int Search_Value(linkptr h,int value)
{
	if(NULL==h)
	{
		puts("入参为空");
		return -1;
	}
	if(NULL==h->next)
	{
		puts("链表为空");
		return -2;
	}
	linkptr p=h->next;
	int i=0;
	while(p!=h)
	{
		if(p->data==value)
		{
			return i;
		}
		i++;
		p=p->next;
	}
	puts("没有该值");
	return 0;
}
//链表逆置
int Resert_Link(linkptr h)
{
	if(NULL==h)
	{
		puts("入参为空");
		return -1;
	}
	if(NULL==h->next)
	{
		puts("链表为空");
		return -2;
	}
	if(h->next->next==h)
	{
		puts("只有一个元素,无需逆置");
		return -3;
	}
	linkptr p=h->next->next;
	h->next->next=h;
	linkptr temp=p->next;
	while(p!=h)
	{
		p->next=h->next;
		h->next=p;
		p=temp;
		if(temp!=h)
		{
			temp=temp->next;
		}
	}
	return 0;
}		
//释放
linkptr Free_Link(linkptr h)
{
	if(NULL==h)
	{
		puts("入参为空");
		return NULL;
	}
	linkptr del=h;
	linkptr p=h->next;
	while(p!=h)
	{
		del=p;
		p=p->next;
		free(del);
		del=NULL;
	}
	free(h);
	h=NULL;
	return h;
}

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值