1,实现双向链表按元素删除
void DeleteSearch(LoopDoubleLink L,datatype e)
{
if(L->len==0)
{
printf("数据不存在\n");
return;
}
LoopDoubleLink q=L;
while(q->next)
{
LoopDoubleLink p=q->prev;
if(q->data==e)
{
q->next->prev=p;
p->next=q->next;
break;
}
q=q->next;
}
free(q);
q=NULL;
L->len--;
}
2,实现循环双向链表按位置插入
void InsertPos(LoopDoubleLink L,datatype e,int pos)
{
if(L==NULL||pos>L->len||pos>0)
{
printf("插入失败\n");
return;
}
LoopDoubleLink q=L;
for(int i=0;i<pos-1;i++)
{
q=q->next;
}
LoopDoubleLink p=LinkCreateNode();
p->data=e;
p->next=q->next;
p->prev=q;
q->next->prev=p;
q->next=p;
L->len++;
}
3,实现约瑟夫环
void josephe(LoopDoubleLink L,int m,int n)
{
LoopDoubleLink q=L;
for(int i=0;i<m;i++)
{
for(int j=0;j<n-1;j++)
{
q=q->next;
if(q==L)
j--;
}
LoopDoubleLink p=q->next;
if(p==L)
{
p=p->next;
}
printf("%.2f ",p->data);
q->next=p->next;
free(p);
p=NULL;
}
}
4,删除链表中的所有结点
void DeleteFree(LoopDoubleLink L)
{
if(L->len==0)
{
printf("数据不存在\n");
return;
}
LoopDoubleLink q=L;
while(q->next!=L)
{
LoopDoubleLink p=q;
free(p);
p=NULL;
q=q->next;
}
}
5,实现单向链表的简单选择排序
mian.c
//===单向简单排序===
LinkSimple(L);
LoopListShow(L);
head.c
//简单排序
void LinkSimple(LoopLink L)
{
//1.判断链表是否存在
if(L==NULL)
{
printf("链表不存在\n");
return;
}
//2.开辟一个新的空间
LoopLink S=LinkCreateHeadNode();
if(S==NULL)
{
printf("创建失败\n");
return;
}
//3.将L的值传入排序中,并将每次返回的值加入到头指针
while(L->next)
{
int min=MinChoice(L);
LoopLink p=LinkCreateNode();
//数据域
p->data=min;
//指针域
p->next=s->next;
S->next=p;
}
LoopListShow(S);
}
int MinChoice(LoopLink L)
{
LoopLink p=L;
int min=L->next->data;
while(p->next)
{
if(p->data<min)
{
min=p->data;
}
}
DeleteLink(L,min);
}
void DeleteLink(LoopLink L,datatype e)
{
if(L->len==0)
return;
LoopLink p=L;
for(int i=0;i<L->len;i++)
{
p=p->next;
if(p->data==e)
{
DeleteBypos(L,i);
}
}
}
int DeleteBypos(Linklist L,int pos)
{
//判断链表是否为空
//判断下标是否越界
if(L==NULL||pos<1||pos>len)
{
printf("删除失败\n");
return -1;
}
Linklist p=L;
//用循环找到插入位置的前驱
//将数据删除
for(int i=0;i<pos-1;i++)
{
p=p->next;//p向后移动
}
Linklist q=p->next;//将要删除的下标位
p->next=q->next;
free(q);
q=NULL;
L->len--;
return 0;
}