回复 楼主 rc61liu
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define
MAXSIZE
10000//使用顺序表完成要求
typedef
int DataType;
typedef
struct
Node
{
DataType
data[MAXSIZE];
int
length;
}SeqList,*PseqList;
PseqList Init_SeqList(void)
{
PseqList PL;
PL=(PseqList)malloc(sizeof(SeqList));
if(PL)
PL->length=0;
return(PL);
}//在顺序表中插入一个元素
int Insert_SeqList(PseqList PL,int i,DataType x)
{
int j;
if(!PL)
{
printf("顺序表不存在!");//表不存在,不能插入
}
if(PL->length>=MAXSIZE)
{
printf("顺序表空间已满!");//表空间已满,不能插入
}
if(i<1||i>PL->length+1)//检查插入位置的合法性
{
printf("插入位置不正确!");
}
for(j=PL->length;j>=i;j--)
PL->data[j+1]=PL->data[j];//移动元素
PL->data[i]=x;//插入新的队员编号
PL->length++;//表长加1
return i;//插入成功,返回
}
LinearListMethod(){
int i=1,j,n,num,count=0,k;
PseqList p;
printf("请输入队员人数:");
scanf("%d",&n);
if(n==1)
printf("只有排长一人担任!");
else if(n>1)
{
p=Init_SeqList();
p->data[1]=1;
p->length=1;
for(num=2;num<=n;num++)
{
for(j=0;j<4;j++)
{
i--;
if(i==0)
i=p->length;
}
Insert_SeqList(p,i,num);
}
while(p->data[i]!=1)
{
i--;
if(i==0)
i=p->length;
count++;
}
k=n+count-3;
if(k>n)
k=k-n;
printf("应该从第%d名战士开始计数n",k);}
else
printf("输入有误,程序结束!");
}
#define QueueSize 10000 //使用循环队列完成要求
typedef struct
{
int data[QueueSize];
int front;
int rear;
int count; //记录队中元素数目
}CirQueue;
void Initial(CirQueue *Q) // 初始化队列
{
Q->front=Q->rear=0;//对头等于对尾代表队列为空
Q->count=0;
}
// 判队列是否为空
int IsEmpty(CirQueue *Q)
{
if(Q->count==0) return 1;//如果队里的元素个数为0,队列空,返回1
else return 0;
}
int IsFull(CirQueue *Q) //判队列是否满
{
if(Q->count==QueueSize) return 1;
else return 0;
}
void EnQueue(CirQueue *Q,int x) //将元素进队
{
if (IsFull(Q))
{
printf("队列已满n");
exit(1);
}//如果队列已满就退出程序,否则就进入,元素总数自加一
Q->count++;
Q->data[Q->rear]=x;//最后一位赋值为小x
Q->rear=(Q->rear+1)%QueueSize;
}
int DeQueue(CirQueue *Q)//元素出队列
{
int temp;
if(IsEmpty(Q))
{
printf("队列为空n"); //下溢,退出运行
exit(1);
}
temp=Q->data[Q->front];//将队头的元素取出到temp里面
Q->count--; //队列元素个数减1
Q->front=(Q->front+1)%QueueSize; //头指针后移
return temp;
}
CirdeQueueMethod(){
int n,i,start,count,j;
CirQueue s;
printf("输入敢死队员数目:");
scanf("%d",&n);
if(n==1)
printf("只有排长一人担任!");
else if(n>1)
{
for(start=1;start<=n;start++)//start为测试起点
{
Initial(&s);
for(i=1;i<=n;i++)
{
EnQueue(&s,i);
}//将所有士兵的编号依次进队
for(i=1;i<start;i++)
{
j=DeQueue(&s);
EnQueue(&s,j); //把队头的元素取出来然后放到队尾
}
count=0; //记录已删除的结点数目
while(count<n-1)
{
for(i=1;i<5;i++)
{
j=DeQueue(&s);
EnQueue(&s,j);//把队头的元素取出来然后放到队尾
}
j=DeQueue(&s);//删除结点
count++;
}
if(s.data[s.front]==1)
break; //此时队只剩一个点,如果是排长就输出
}
printf("应该从第%d名战士开始计数n",start);
}
else
printf("输入有误,程序结束!n");
}
typedef struct node
{
int data;
struct node *next;
}LNode;
LNode* CREAT(int n) //创建循环链表
{
LNode *s,*q,*t;
int i;
if(n!=0)
{
t=q=(LNode *)malloc(sizeof(LNode));
q->data=1;//第一个结点data赋值为1
for(i=2;i<=n;i++)
{
s=(LNode *)malloc(sizeof(LNode));
q->next=s;
q->next->data=i;//给第i个结点赋值i
q=q->next;
}
q->next=t;
}//每个结点的data即为在链表中的位置
return t;
}
DELETE (LNode* t)//链表中元素的删除
{
LNode *a;int i;
while (t->next!=t)
{
for (i=1;i<4;i++)//查找要删除结点的前一结点
t=t->next;
a=t->next;
t->next=a->next;
free(a);//释放结点
t=t->next;
}
printf("n");
return (t->data);
}
CircularLinkedListMethod(){
LNode *p;
int m=5,n,z,y;
printf("请输入敢死队员总数:");
scanf ("%d",&n); //输入队员总数
if(n==1)
printf("只有排长一人担任!");
else if(n>1)
//当队员总数等于0时退出
{
p=CREAT(n);
y=DELETE(p);
z=n-y+2;
if(z%n==0)
//排除特殊情况
printf ("应从第 %d号战士开始计数n",z);
else
printf("应从第 %d号战士开始计数n",z%n);
}
else
printf("输入有误,程序结束!n");}
void main()
{
int choice;
begin:printf("--------------------------------------------------n");
printf("-
请选择所用数据结构对应的序号
-n");
printf("-
1.线性表
2.循环队列
3.循环链表
-n");
printf("-
4.退出程序
-n");
printf("-
-n");
printf("--------------------------------------------------n");
scanf("%d",&choice);
if(choice==1)
{
printf("你选择了使用线性表解决!");
LinearListMethod();//调用线性表方法函数
}
else if(choice==2)
{
printf("你选择了使用循环队列解决!");
CirdeQueueMethod();//调用循环队列方法函数
}
else if(choice==3)
{
printf("你选择了使用循环链表解决!");
CircularLinkedListMethod();//调用循环链表方法函数
}
else if(choice==4)
{
printf("程序已退出,谢谢使用!n");
}
else{
printf("输入有误,请重新选择!n");
goto begin;}
}