约瑟夫问题
代码:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define MAXSIZE 41
typedef struct Like
{
int T;
struct Like *next;
}Like, *Likes;
void explain(); //本程序各个功能说明
void InitList(Likes *N);//清空数据并初始化程序
void GetList(Likes *N); //随机创建41人员个编号
void PutList(Like *N); //打印所有链表
void DeThList(Likes *N); //依次删除第三人并打印编号
void DeThTwList(Likes *N); //依次删除第三人直至剩余最后两人并打印
void InsertList(Likes *N); //指定位置插入
void DeApList(Likes *N); //指定位置删除
void DeApList(Likes *N)
{
int K;
Like *temp = (*N)->next, *temps;
printf("删除数据:");
scanf("%d", &K);
while (temp->T != K)
{
temps = temp;
temp = temp->next;
if (temp == (*N)->next)
{
printf("未找到匹配的数据请确认输入是否准确。\n");
return;
}
}
if ((*N)->next == temp)
{
do
{
temps = temp;
temp = temp->next;
} while (temp != (*N)->next);
(*N)->next = temp->next;
}
temps->next = temp->next;
free(temp);
}
void InsertList(Likes *N)
{
int K;
Like *temp = (*N)->next, *temps;
scanf("%d", &K);
getchar();
printf("在%d之后插入\n", K);
while (temp->T != K)
{
temp = temp->next;
if (temp == (*N)->next)
{
printf("未找到匹配的数据请确认输入是否准确。\n");
return;
}
}
temps = (Likes )malloc(sizeof(Like ));
printf("输入插入的值:");
scanf("%d", &temps->T);
getchar();
temps->next = temp->next;
temp->next = temps;
}
void DeThTwList(Likes *N)
{
int i, j;
Like *temp = (*N)->next, *temps, *tempss;
for (i = 0; i < MAXSIZE - 2; i++)
{
for (j = 0; j < 2; j++)
{
temps = temp;
temp = temp->next;
}
if ((*N)->next == temp)
{
(*N)->next = temp->next; //如果头文件数据域被删除,用temp->next更换头文件数据域中的数据
}
tempss = temp;
temp = temp->next;
temps->next = temp; //与前一个链表相连
free(tempss);
}
PutList(*N);
}
void DeThList(Likes *N)
{
int i, j;
Like *temp = (*N)->next, *temps, *tempss;
for (i = 0; i < MAXSIZE; i++)
{
for (j = 0; j < 2; j++)
{
temps = temp;
temp = temp->next;
}
if (temp == (*N)->next)
{
(*N)->next = temp->next;
}
printf("<%d>", temp->T);
tempss = temp;
temp = temp->next;
temps->next = temp;
free(tempss);
}
putchar('\n');
}
void PutList(Like *N)
{
Like *temp = N->next;
while (1)
{
printf("<%d>", temp->T);
temp = temp->next;
if (N->next == temp)
{
break;
}
}
putchar('\n');
}
void GetList(Likes *N)
{
int i;
Like *temp, *tail;
srand((unsigned)time(NULL)); //随机数按照时间归零
for (i = 0; i < MAXSIZE; i++)
{
temp = (Like *)malloc(sizeof(Like ));
temp->T = (rand() % 100);
if ((*N)->next == *N)
{
(*N)->next = temp;
}
else
{
tail->next = temp;
}
tail = temp;
tail->next = (*N)->next;
}
}
void InitList(Likes *N)
{
int i = 0;
Like *temp;
if (*N != NULL)
{
while (i <= MAXSIZE)
{
temp = *N;
*N = (*N)->next;
free(temp);
i++;
}
}
*N = (Likes )malloc(sizeof(Like ));
(*N)->next = *N;
}
void explain()
{
printf("1、清空数据并初始化程序\n");
printf("2、随机创建41人员个编号\n");
printf("3、打印所有人员编号\n");
printf("4、依次删除第三人并打印编号\n");
printf("5、依次删除第三人直至剩余最后两人\n");
printf("6、指定位置插入\n");
printf("7、删除指定人员\n");
printf("0、结束本程序\n");
}
int main()
{
int i;
Like *N = NULL;
explain();
while (1)
{
printf("输入选项:");
scanf("%d", &i);
getchar();
switch (i)
{
case 1:{
InitList(&N);
}
break;
case 2:{
GetList(&N);
}
break;
case 3:{
PutList(N);
}
break;
case 4:{
DeThList(&N);
}
break;
case 5:{
DeThTwList(&N);
}
break;
case 6:{
InsertList(&N);
}
break;
case 7:{
DeApList(&N);
}
break;
case 0:{
return 0;
}
break;
}
}
return 0;
}
页:
[1]