【looplink.h】
#ifndef __LINK_H__
#define __LINK_H__
#include <stdio.h>
#include <stdlib.h>
#define NUM 3
typedef struct link
{
union
{
int len;
int data;
};
struct link *next;
}linklist;
linklist *link_create();
linklist *node_create(int indata);
int head_insert(linklist* h,int indata);
int tail_insert(linklist *h,int indata);
int del_tail(linklist *h);
int print(linklist *h);
int print1(linklist *s);
linklist* delhead(linklist *h);
int jose(linklist *h);
#endif
【main.c】
#include "looplink.h"
int main(int argc, const char *argv[])
{
linklist *h=link_create();
head_insert(h,10);
head_insert(h,20);
head_insert(h,30);
head_insert(h,40);
head_insert(h,50);
tail_insert(h,60);
// del_tail(h);
// print(h);
linklist *s=delhead(h);
jose(s);约瑟夫环函数
// print1(s);
return 0;
}
【looplink.c】
#include "looplink.h"
#include <stdlib.h>
linklist *link_create()
{
linklist *h=(linklist *)malloc(sizeof(linklist));
if(h==NULL)
{
printf("申请失败\n");
return NULL;
}
h->len = 0;
h->next=h;
return h;
}
linklist *node_create(int indata)
{
linklist *p=(linklist *)malloc(sizeof(linklist));
if(p==NULL)
{
printf("申请失败\n");
return NULL;
}
p->data=indata;
return p;
}
int head_insert(linklist* h,int indata)
{
if(h==NULL)
{
return -1;
printf("申请失败\n");
}
linklist *p=node_create(indata);
p->next=h->next;
h->next=p;
h->len++;
return 0;
}
int del_tail(linklist *h)
{
if(h==NULL)
{
return -1;
printf("申请失败\n");
}
linklist *c=h->next;
while(c->next->next!=h)
{
c=c->next;
}
linklist *p=c->next;
c->next=h;
free(p);
p=NULL;
return 0;
}
int tail_insert(linklist *h,int indata)
{
if(h==NULL)
{
return -1;
printf("申请失败\n");
}
linklist *p=node_create(indata);
linklist *c=h->next;
while(c->next!=h)
{
c=c->next;
}
p->next=c->next;
c->next=p;
h->len++;
}
linklist* delhead(linklist *h)
{
if(h==NULL)
{
return NULL;
}
linklist *p=h->next;
while(p->next!=h)
{
p=p->next;
}
p->next=h->next;
free(h);
h=NULL;
return p->next;
}
int print(linklist *h)
{
if(h==NULL)
{
return -1;
printf("申请失败\n");
}
linklist *c=h->next;
while(c!=h)
{
printf("%d\n",c->data);
c=c->next;
}
}
int print1(linklist *s)
{
if(s==NULL)
{
return -1;
}
linklist *p=s;
do
{
printf("%d\n",p->data);
p=p->next;
}while(p!=s);
return 0;
}
int jose(linklist *s)
{
int m;
linklist *p=s;
while(p->next!=p)
{
m=1;
while(m!=0)
{
p=p->next;
m=(m+1)%(NUM-1);
}
linklist *q=p->next;
printf("%d\t",q->data);
p->next=q->next;
free(q);
q=NULL;
p=p->next;
}
printf("%d\t",p->data);
putchar(10);
}