#include <stdio.h>
#include<string.h>
#include<stdlib.h>
//-------------------循环单链表---------------------------
typedef struct node
{
int data;
struct node *next;
}LNode;
LNode* Creat(int n) /* 创建循环链表 */
{
LNode *s,*q,*head;
if(n != 0)
{
head = q = (LNode *)malloc(sizeof(LNode));
q->data = 1; /* 生成第一个结点并使其data值为1 */
for(int i=2;i<=n;i++)
{
s = (LNode *)malloc(sizeof(LNode));
q->next = s;
q->next->data = i;/*赋值*/
q = q->next;
}
q->next = head;
}
return head;
}
int Delete(LNode* head,int m)/* 链表的删除 */
{
LNode *a;
while (head->next != head)
{
for (int i = 1; i < m-1; i++)/*查找要删除结点的前一结点*/
{
head = head->next;
}
a = head->next;
head->next = a->next;
free(a);
head = head->next;
}
return (head->data);
}
void TrackList()
{
char y_n = 'y';
int m; /*声明变量*/
LNode *p;
int z,y;
int num;
printf("链表表储存结构\n\n");
do
{
printf("请输入敢死队的人数:");
scanf("%d",&num);
if(num < 1)
{
printf("输入有误请重新输入\n");
continue;
}
printf("请输入死亡数数字\n");
scanf("%d",&m);
if(m > num || m < 1 )
{
printf("输入有误请重新输入");
continue;
}
else
{
p=Creat(num);
y=Delete(p,m);
z = num-y+2;
if(z%num == 0)
printf ("从第 %d号开始计数\n",z);
else
printf("从第%d号战士开始计数才能让排长最后一个留下来而不去执行任务!\n",(num-y+2)%num);
}
printf("是否采用循环单链表操作后续数据:");
do
{
scanf("%c",&y_n);
}while((y_n != 'y') && y_n != 'n' );
}while(y_n == 'y');
}
//----------------线性表-----------------------------------------------------
#define LIST_INIT_SIZE 100
#define LISTINCCREMENT 10
typedef int ElemType;
typedef struct /*线性表的动态分配存储结构*/
{
ElemType *elem; /*存储空间基址*/
int length; /*当前长度*/
int listsize; /*当前分配的存储容量(以sizeof(ElemType)为单位)*/
}SqList;
int InitList_sq(SqList &L) /*创建线性表函数*/
{
L.elem=(ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType));
if(!L.elem)
{
printf("存储分配失败");
return 0;
}
else
{
L.length = 0; /*空表长度为0*/
L.listsize = LIST_INIT_SIZE;
return 1;/*初始存储容量*/
}
}
int ListInsert_Sq(SqList &L) /*线性表再分配函数*/
{
int *newbase;
newbase = (ElemType *)realloc(L.elem,(L.listsize+LISTINCCREMENT)*sizeof(ElemType));
/*为顺序表增加一个大小为存储LISTINCCREMENT个数据元素的空间*/
if(!newbase)
{
printf("存储分配失败");
return 0;
}
else
{
L.elem=newbase; /*新基址*/
L.listsize += LISTINCCREMENT; /*增加存储容量*/
return 1;
}
}
void TrackArr()
{
char y_n = 'y';
SqList Arr;
int s,i,m,count=0; /*声明变量*/
LNode *p;
int z,y;
int num;
printf("线性表储存结构\n\n");
do
{
printf("请输入敢死队的人数:");
scanf("%d",&num);
if(num<1)
{
printf("输入有误请重新输入\n");
continue;
}
printf("请输入死亡数数字\n");
scanf("%d",&m);
if(m>num || m<1)
{
printf("输入有误请重新输入");
continue;
}
InitList_sq(Arr);
while(num > Arr.listsize ) /*当顺序表当前分配的存储空间大小不足时进行再分配*/
ListInsert_Sq(Arr);
for(i=0;i<num;i++) /*为队员编号*/
Arr.elem[i]=i+1;
s = num;
i=0;
while(s>1) /*当所剩敢死队员总数为1时,总循环结束*/
{
for(i=0;i<num;i++)
{
if(Arr.elem[i]!=0)
{
count++;
if(count==5) /*报数循环*/
{
Arr.elem[i]=0; /*表示队员出列*/
count=0; /*计数器清零*/
s--; /*敢死队员数-1*/
}
}
}
}
for(i=0;i<num;i++)
{
if(Arr.elem[i]!=0)
if((num-Arr.elem[i]+2)%num==0)
printf("从第%d号战士开始计数才能让排长最后一个留下来而不去执行任务!\n",num);
else
printf("从第%d号战士开始计数才能让排长最后一个留下来而不去执行任务!\n",(num-Arr.elem[i]+2)%num);
}
printf("是否采用线性表操作后续数据:");
do
{
scanf("%c",&y_n);
}while((y_n != 'y') && y_n != 'n' );
}while(y_n = 'y');
}
//---------------------------
void Menu()
{
printf("++++++++++++++++++++++++++++++++++++++\n");
printf("| 1.循环链表 |\n");
printf("| 2.线 性 表 |\n");
printf("| 3.退 出 |\n");
printf("++++++++++++++++++++++++++++++++++++++\n");
printf("请选择解决问题的方法:(1~3)\n\n");
}
//-----------------------------------------------------------------------------
int main()
{
system("color 0D");
int opt;
char yes_no ='y';
Menu();
do
{
printf("请选择用何种数据结构处理问题:");
scanf("%d",&opt);
switch(opt)
{
case 1: TrackList(); break;
case 2: TrackArr(); break;
case 3: exit(0);
}
printf("是否继续(y/n): ");
do
{
scanf("%c",&yes_no);
}while((yes_no != 'y') && yes_no != 'n' );
}while(yes_no=='y');
return 0;
}
循环单链表 ,线性表,敢死队问题
最新推荐文章于 2020-03-04 21:37:27 发布