目录
接下来是整个looplink的函数,对于循环链表的一系列操作。
约瑟夫环的图片解释
约瑟夫环的代码实现
//约瑟夫环
int list_huan(Looplink *S,int n,int m)
{
Looplink *p=S;
printf("约瑟夫环实现后:");
for(int j=0;j<n;j++)
{
for(int i=0;i<m-2;i++)
{
p=p->next;
}
Looplink *q=p->next;
printf("%d\t",q->data);
p->next=q->next;
p=p->next;
free(q);
q=NULL;
}
printf("\n");
}
其中n代表人数,m代表到第m个出圈,从m+1个重新遍历。
我是删除出圈结点的同时输出这个结点的信息,从而实现了对约瑟夫环。
接下来是整个looplink的函数,对于循环链表的一系列操作。
创建循环链表
//创建
Looplink *list_create()
{
Looplink *L=(Looplink *)malloc(sizeof(Looplink));
if(NULL==L)
{
printf("创建失败\n");
return NULL;
}
L->len=0;
L->next=L; //初始化,头结点的指针指向自己
printf("创建成功\n");
return L;
}
判空
//判空
int list_empty(Looplink *L)
{
return L->next==L ?1:0;
}
尾插
//尾插
int list_insert_tail(Looplink *L,datatype e)
{
if(NULL==L)
{
printf("所给链表不合法\n");
return -1;
}
Looplink *p=(Looplink*)malloc(sizeof(Looplink));
if(NULL ==p)
{
printf("结点申请失败\n");
return -2;
}
p->data =e;
p->next =NULL;
Looplink *q=L;
while(q->next !=L)
{
q=q->next;
}
p->next=L;
q->next=p;
L->len++;
//printf("插入成功\n");
return 0;
}
带头结点的遍历
//带头结点的遍历
void list_show(Looplink *L)
{
if(NULL ==L || list_empty(L))
{
printf("遍历失败\n");
return ;
}
printf("元素是:");
Looplink *q=L->next;
while(q !=L)
{
printf("%d\t",q->data);
q=q->next;
}
printf("\n");
}
尾删法
//尾删
int list_delete_tail(Looplink *L)
{
if(NULL == L || list_empty(L))
{
printf("尾删失败\n");
return -1;
}
Looplink *p=L;
while(p->next->next != L)
{
p=p->next;
}
free(p->next);
p->next=L;
L->len--;
printf("删除成功\n");
return 0;
}
删除头结点
//删头结点
Looplink *kill_head(Looplink *L)
{
if(NULL ==L || list_empty(L))
{
printf("删除失败\n");
return NULL;
}
//遍历到最后一个
Looplink *q=L->next;
while(q->next != L)
{
q=q->next;
}
//孤立头
q->next=L->next;
//删头结点
free(L);
L=NULL;
printf("删头成功\n");
//返回第一个结点的地址
return q->next;
}
删除头结点的遍历
//删头后的遍历
void list_show2(Looplink *S)
{
if(NULL == S)
{
printf("遍历失败\n");
return;
}
printf("删头后:");
Looplink *q=S;
do
{
printf("%d\t",q->data);
q=q->next;
}while(q!=S);
printf("\n");
}
代码运行图