#define N 3//容量
#define n 10//数组数
#define random (srand((unsigned)time(NULL)))//添加随机数据
// 主 函 数
typedef int datatype;
typedef struct Link
{
struct data
{
datatype arr[N];
int L;
}data;
struct Link* next;
}link;
link *creatlink(void);
void showlink(link *p0);
void updownlink(link *p0);
void josephlink(link *p0);
void Adeletegoal(link *p0);
//void Bdeletegoal(link* p0,int x);
// 主 函 数
int main()
{
link* p0;
while(!0)
{
p0 = creatlink();
showlink(p0);
/*updownlink(p0);
showlink(p0);*/
/*deletegoal(p0);
showlink(p0);*/
josephlink(p0);
break;
}
return 0;
}
// 初 始 化 接 头 插
link* creatlink(void)
{
random;
link* Head = (link*)malloc(sizeof(link));
if (Head == NULL) return NULL;
Head->next = NULL;
Head->data.L = 0;
printf("\n正在初始化......\n");
for(int i = 0; i < n; i++)
{
link* q = Head, * p = (link*)malloc(sizeof(link));
p->next = NULL;
if (p == NULL) return NULL;
for (int j = 0; j < N; j++)
{
p->data.arr[j] = (rand() % 100);
}
p->next = q->next;
q->next = p;
q = p;
Head->data.L++;
}
return Head;
}
// 打 印 数 组
void showlink(link* p0)
{
printf("\n-------------------\n打印数据如下:\n");
link* p = p0->next;
int serial = 0;
while (p != NULL)
{
printf("序号:%d\t",serial++);
for(int i = 0; i < N;i++)
{
printf("%d ",p->data.arr[i]);
}
printf("\n");
p = p->next;
}
printf(" 数组数:%d\n", p0->data.L);
return;
}
// 颠 倒 数 组
void updownlink(link* p0)
{
link* p = p0,*q = p0->next;
p0->next = NULL;
for(int i = 0; i < p0->data.L; i++)
{
p = q->next;
q->next = p0->next;
p0->next = q;
q = p;
}
return;
}
// 需要传给参数指定删除
void Bdeletegoal(link* p0, int x)
{
if (p0->data.L > 0)
{
link* p = p0, * storage;
if (x >= 0 && x <= p0->data.L)
{
for (int i = 0; i < x; i++)
{
p = p->next;
}
storage = p->next;
p->next = storage->next;
p0->data.L--;
printf("%d\n",storage->data.arr[1]);
free(storage);
storage = NULL;
//printf("%d\n",p->data.arr[1]);//验证
}
}
return;
}
// 约瑟夫问题
void josephlink(link* p0)
{
link* p = p0->next, * storage1, * storage2;
//printf("%d\n", p->data.arr[1]);
storage1 = p0->next;
storage1->data.L = p0->data.L;
while (p->next != NULL) p = p->next;
//printf("%d\n",p->data.arr[1]);
p->next = p0->next;
//printf("%d\n", p->next->data.arr[1]);
int k, m, i, j, o;
printf("从序号k开始,数到m的数组出列!\n请输入k和m(m>=1):\n");
scanf("%d %d", &k, &m);
if (k >= 0 && k < n && m >= 2)
{
for (i = 0; i <= k; i++)
{
p = p->next;
}
//printf("%d\n",p->data.arr[1]);
for (i = 0; p0->data.L != 0; i++, p0->data.L--)
{
for (j = 0; j < m - 2; j++)
{
p = p->next;
}
//printf("%d\n",p->data.arr[1]);
storage2 = p->next;
/*printf("%d ", storage2->data.arr[1]);
break;*/
p->next = storage2->next;
for (o = 0; o < N; o++)
{
printf("%d ", storage2->data.arr[o]);
}
printf("\n第%d个出列\n", i + 1);
/*printf("%d ", storage2->data.arr[1]);
break;*/
free(storage2);
p = p->next;
}
printf("现有数组数:%d\n",p0->data.L);
}
else
{
printf("超出范围了哟!\n");
}
return;
}
// 终端输入指定位置删除
void Adeletegoal(link* p0)
{
if (p0->data.L > 0)
{
link* p = p0,*storage;
int x = 0;
printf("请输入要删除的数组序号:\n");
scanf("%d",&x);
if(x >= 0 && x <= p0->data.L)
{
for (int i = 0; i < x; i++)
{
p = p->next;
}
storage = p->next;
p->next = storage->next;
p0->data.L--;
free(storage);
storage = NULL;
//printf("%d\n",p->data.arr[1]);//验证
}
}
return;
}
linux 打 印 现 象: