#ifndef _HEAD_H
#define _HEAD_H
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef char datetype[20];
typedef struct Node{
union{
int len;
datetype date;
};
struct Node *next;
}*loop;
loop create();
int head_insert(loop l,datetype e);
int output(loop l);
int tail_insert(loop l,datetype e);
int head_delete(loop l);
int tail_delete(loop l);
void yusefu(loop l,int m);
void menue();
#endif
#include "head.h"
void menue()
{
puts("\t0,退出整个程序");
puts("\t1,单向循环链表的头插");
puts("\t2,输出");
puts("\t3,单向循环链表的尾插");
puts("\t4,单向循环链表的头删");
puts("\t5,单向循环链表的尾删");
puts("\t6,约瑟夫环");
}
loop create(int flag)
{
loop l = (loop)malloc(sizeof(struct Node));
if (l == NULL)
return NULL;
else
{
if(flag == 1)
{
l->len = 0;
l->next = l;
}
else
{
l->next = NULL;
strcpy(l->date,"");
}
return l;
}
}
int head_insert(loop l,datetype e)
{
if (l == NULL)
return -1;
loop s = create(0);
if (s == NULL)
return -1;
strcpy(s->date,e);
s->next = l->next;
l->next = s;
l->len++;
return 0;
}
int output(loop l)
{
if (l == NULL || l->next == l)
return -1;
loop p = l;
while (p->next != l )
{
p = p->next;
printf("%s\t",p->date);
}
puts("");
}
int tail_insert(loop l,datetype e)
{
if (l == NULL)
return -1;
loop p = l;
while(p->next != l)
{
p = p->next;
}
loop s = create(0);
if (s == NULL)
return -1;
strcpy(s->date,e );
s->next = p->next;
p->next = s;
l->len++;
return 0;
}
int head_delete(loop l)
{
{ if (l == NULL || l->len == 0)
return -1;
loop p = l->next;
l->next = p->next;
free(p);
p = NULL;
l->len--;
return 0;
}
}
int tail_delete(loop l)
{
if (l == NULL || l->len == 0)
return -1;
loop p = l;
while(p->next->next != l)
{
p = p->next;
}
free(p->next);
p->next = l;
l->len--;
return 0;
}
void yusefu(loop l,int m)
{
int n = l->len;
loop p = l;
for(int i= 0; i < n;i++ )
{
for(int j = 0;j< m-1; j++)
{
p = p->next;
if(p == l)
p = p->next;
}
loop q = p->next;
if(q == l)
{
p = p->next;
q = q->next;
}
p->next = q->next;
printf("%s\t",q->date);
free(q);
q =NULL;
}
puts("");
}
#include "head.h"
int main(int argc, const char *argv[])
{ menue();
loop L = create(1);
int number;
while(1)
{
printf("请输入你的选择:");
scanf("%d",&number);
switch(number)
{
case 1:{
int n;
datetype e;
printf("输入要插入的个数");
scanf("%d",&n);
for (int i = 0;i < n;i++ )
{
printf("输入要插入的值");
scanf("%s",e);
head_insert(L, e);
}
break;
}
case 2:{
output(L);
break;
}
case 3:{
int n;
datetype e;
printf("输入要插入的个数");
scanf("%d",&n);
for (int i = 0;i < n;i++ )
{
printf("输入要插入的值");
scanf("%s",e);
tail_insert(L, e);
}
break;
}
case 4:{
head_delete(L);
break;
}
case 5:{
tail_delete(L);
break;
}
case 6:{
int n;
datetype e;
printf("输入要插入的个数");
scanf("%d",&n);
for (int i = 0;i < n;i++ )
{
printf("输入要插入的值");
scanf("%s",e);
tail_insert(L, e);
}
int m;
printf("请输入第几个出圈");
scanf("%d",&m);
yusefu(L , m);
break;
}
}
}
return 0;
}