本文目錄一覽:
C 語言中關於猴子選大王的代碼
注釋寫得很清楚 相信你能看懂 #include stdio.h
#include stdlib.h
#define MAXSIZE 100
typedef struct Node
{
int data;//存儲猴子編號
struct Node *next;
}*List;
/* 用鏈表來得出大王的序號 */
int LinkedList(int num_monkey,int number);
/* 用順序表來得出大王的序號 */
int SequenceList(int num_monkey,int number);
/* 創建循環單鏈表 */
List CreateList(int n);
void main()
{
int m, n, way, king;
printf(“請輸入猴子個數:”);
scanf(“%d”, n);
printf(“請輸入要報的數:”);
scanf(“%d”, m);
while (1)
{
printf(“\n請選擇解決問題的方法:\n”);
printf(“1.單鏈表\n”);
printf(“2.順序表\n”);
scanf(“%d”, way);
if (way == 1)
{
king = LinkedList(n,m);
break;
}
else if (way == 2)
{
king = SequenceList(n,m);
break;
}
else
{
printf(“輸入不合法!\n”);
}
}
printf(“%d號猴子是大王\n”, king);
}
/* 創建循環單鏈表 */
List CreateList(int n)
{
int i;
List head, p;
head = (List)malloc(sizeof(struct Node));
head-next = head;
for (i = 1; i n; ++i)
{
p = (List)malloc(sizeof(struct Node));
p-next = head-next;
head-next = p;
}
p = head;
for (i = 0; i n; ++i)
{
p-data = i+1;
p = p-next;
}
return head;
}
/* 用鏈表來得出大王的序號 */
int LinkedList(int num_monkey,int number)
{
int i,j;
List head = CreateList(num_monkey);
List tail = head;//用來存儲最後一個節點的地址
List out,p;//out指向要淘汰的節點,p指向其前一個節點
/* 讓tail指向最後一個節點 */
for (i = 1; i num_monkey; i++)
{
tail = tail-next;
}
/* 淘汰的猴子個數比總個數少1,報數一輪就淘汰一個猴子,所以需要報數的輪數比
猴子總個數少1*/
for( i = 1; i num_monkey; i++ )
{
p = tail;
/* 讓p指向要淘汰的猴子的前一個 */
for ( j = 1; j number; j++ )
{
p = p-next;
}
out = p-next;
/* 如果最後一個猴子被淘汰就更新尾節點 */
if (out == tail)
{
tail = p;
}
p-next = out-next;
printf(“猴子%d淘汰\n”, out-data);
free(out);//刪除被淘汰猴子的節點
}
return p-data;
}
/* 用順序表來得出大王的序號 */
int SequenceList(int num_monkey,int number)
{
/* 用來表示個猴子的信息,如果猴子出局就存儲0,否則存儲1。第一個元素不使用 */
int monkey[MAXSIZE];
/* 用來表示出局的猴子的序號 */
int out = 1;
/* 用來表示當前猴子的個數 */
int num_now = num_monkey;
int i,j;
for (i = 0; i num_monkey+1; i++)
{ /* 開始將每個元素置1 */
monkey[i] = 1;
}
/* 報數次數比猴子個數少一 */
for (i = 1; i num_monkey; i++)
{
out = 1;
/* 報數整個過程 */
for (j = 0; j number; j++)
{
/* 如果序號數大於猴子個數,表示循環了一圈,那麼去掉那個圈數 */
if (out num_monkey)
out -= num_monkey;
/* 之前已經出局的猴子不參加報數 */
while(monkey[out] == 0)
{
out ++;
/* 如果序號數大於猴子個數,表示循環了一圈,那麼去掉那個圈數 */
if (out num_monkey)
out -= num_monkey;
}
out++;
}
out–;//報完數後out應該是被淘汰的猴子的下一個,所以要向前移動
monkey[out] = 0;
printf(“猴子%d淘汰\n”,out);
}
while(monkey[out] == 0)
{
out ++;
/* 如果序號數大於猴子個數,表示循環了一圈,那麼去掉那個圈數 */
if (out num_monkey)
out -= num_monkey;
}
return out;
}
C語言猴子選大王的問題?
因為你讓猴子的編號從0開始的。
head-num=0; ——雖然這一語句被注釋掉了,的num的值還是有的(隨機),但只要不是0(且它又沒有當上大王),就不影響運行。
猴子選大王,C語言描述 請相信解釋我的代碼!
給你原文做了注釋。還不懂hi我
#include stdio.h
#includemalloc.h
typedef struct LNode
{
int num;
struct LNode *next;
}LNode, *LinkList; //定義結點
LinkList InitList(LinkList L,int n) //初始化循環鏈表
{
LinkList p,q;
int i;
L = (LinkList)malloc(sizeof(LNode)); //頭結點
L-num = 1; //一號猴子
q=L;
for(i = 2; i = n; i++) //從二號猴子開始生成結點
{
p = (LinkList)malloc(sizeof(LNode));
p-num = i;
q-next=p;
q=p;
}
q-next = L; //使鏈表循環起來
return L;
}
void ListDelete_L(LinkList L,int n)
{
LinkList p,q;
int j=1; //j為計數器
p=L;
while(p-next!=p) //p-next=p時是只剩一個結點。
{
while(j!=n-1) //當j=n-1時應該將該結點的下一個結點刪除。當就j!=n-1時就應該指針向後移,同時計數器加一
{
p=p-next;
j++;
}
q=p-next; //q即為被點到的猴子
p-next=p-next-next; //刪除q結點
printf(“%d\n”,q-num);
free(q);//釋放
j=0; //計數器清零,重新開始計數
}
printf(“%d”,p-num);//此時的結點就是大王
free(p);
}
int main()
{
LinkList L=NULL;
int n,m,e=0;
printf(“請輸入猴子個數:”);
scanf(“%d”,m);
printf(“請輸入n值:”);
scanf(“%d”,n);
if(mn){printf(“m應該 大於n請重新輸入”);return 0 ;
}
L=InitList(L,m);
printf(“出列的順序為:”);
ListDelete_L( L,n);
return 0;
}
c語言鏈表問題,猴子選大王,哪位大神能幫我看看
#include stdio.h
#include stdlib.h
typedef int status;
typedef int ElemType;
typedef struct NODE_MONKY
{
ElemType serial_number;
struct NODE_MONKY *next;
}LNode, *LinkList;
void Build(LinkList L,int n){
LinkList p,q;
p = L;
for(int i=0;in;i++)
{
printf(“%d\n”,i+1);
q = (LinkList)malloc(sizeof(LNode));
q – serial_number = i+1;
q – next = NULL;
p – next = q;
p = q;
}
p – next = L-next;
}
void Print(LinkList L,int x)//計算單鏈表的長度,然後輸出單鏈表
{
LinkList p;
p=L-next;
while(x–)
{
printf(“%d “,p-serial_number);
p=p-next;
}
}
void Delete(LinkList L,int x,int y)//刪除值為x的結點
{
LinkList p,q;
p=L-next;
for (int i = 1; i y; i++)
{
for(int j = 2; j x ; j++)
{
p = p-next;
printf(“serial_number change = %d\n”,p-serial_number);
}
q = p-next;
p-next = q-next;
printf(“delete %d success\n”,q-serial_number);
printf(“p-serial_number = %d\n”,p-serial_number);
free(q);
q = NULL;
p = p-next;
printf(“p-serial_number now = %d\n”,p-serial_number);
}
}
int main()
{
int m,n;
LinkList L,p,q;
L = (LinkList)malloc(sizeof(LNode));
L – next = NULL;
L – serial_number = 1;
printf(“please input the number of mounky.\n”);
scanf(“%d”,n);
Build(L,n);
Print(L,n);
printf(“Please input the number M\n”);
scanf(“%d”,m);
Delete(L,m,n);
}
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/279054.html