#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;
}