iT邦幫忙

0

C++ 環狀鏈結串列問題

  • 分享至 

  • xImage

30位同學圍成一圈,由第一位開始報1~n,每報到n時舉手,在輪過幾輪(Cycle)後,才會開始有人重覆舉手?
請用以程式用Linked List的寫法印出以下結果。
n=1 Cycle: 30
n=2 Cycle: 15
n=3 Cycle: 10
n=4 Cycle: 15
n=5 Cycle: 6
n=6 Cycle: 5
n=7 Cycle: 30
n=8 Cycle: 15
n=9 Cycle: 10
n=10 Cycle: 3

下面的程式碼只能列出每一組前30位的舉手者是誰,不知要如何更改才能得到以上的結果...

#include <iostream>
#include <stdlib.h> 
using namespace std;

struct node* ptr;
struct node* head;
struct node* tail;	
struct node{
	int num;
	struct node* next;
};

void AddNodeFromTail(int C)
{
	ptr = (struct node*) malloc( sizeof(node)) ;
	ptr->num = C;
	tail->next = ptr;
	ptr->next = NULL;
	tail = ptr;
}

void AddFirstNode(int C)
{
	ptr = (struct node*) malloc( sizeof(node)) ;
	head = ptr;
	ptr->num = C;
	tail = ptr;
	ptr->next = NULL;
}

void FindNextNode(int n)
{
	for(int i=0;i<n;i++)
	{
		ptr=ptr->next;
	}
	cout << ptr->num << " ";
}

int main(){
	AddFirstNode(1);
	for (int i=2; i<=30; i++)
	{
		AddNodeFromTail(i);
	}
	for (int x=1; x<=10; x++)
	{
		cout << "n=" << x << "\n";
		tail->next = head;
		ptr=head; 
		FindNextNode(x-1);
		for (int i=0;i<29;i++)
			FindNextNode(x);
		cout << "\n";
	}
}
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

1
海綿寶寶
iT邦大神 1 級 ‧ 2021-06-26 23:20:36
最佳解答
#include <iostream>
#include <stdlib.h> 
using namespace std;

struct node* ptr;
struct node* head;
struct node* tail;	
struct node{
	int num;
	struct node* next;
};

void AddNodeFromTail(int C)
{
	ptr = (struct node*) malloc( sizeof(node)) ;
	ptr->num = C;
	tail->next = ptr;
	ptr->next = NULL;
	tail = ptr;
}

void AddFirstNode(int C)
{
	ptr = (struct node*) malloc( sizeof(node)) ;
	head = ptr;
	ptr->num = C;
	tail = ptr;
	ptr->next = NULL;
}

void FindNextNode(int n)
{
	for(int i=0;i<n;i++)
	{
		ptr=ptr->next;
	}
	//cout << ptr->num << " ";
}

int main(){
	AddFirstNode(1);
	for (int i=2; i<=30; i++)
	{
		AddNodeFromTail(i);
	}
	tail->next = head;

    for (int n=1;n<=10;n++) {
    	int Cycle = 1;
    	ptr=head;
    	while (Cycle < 100) {
    	    FindNextNode(n);
    	    if (ptr->num==1) {
    	        break;
    	    }
    	    Cycle = Cycle + 1;
    	}
    	cout << "n=" << n << " Cycle:" << Cycle << endl;
    }
}
freelife iT邦新手 5 級 ‧ 2021-06-27 01:05:12 檢舉

我想了很久終於懂了~非常謝謝您!
/images/emoticon/emoticon41.gif

0
小魚
iT邦大師 1 級 ‧ 2021-06-26 18:12:12

我可以直接算...
最大公因數嗎?
/images/emoticon/emoticon39.gif

但是我怎麼覺得...
這個結果怪怪的...
/images/emoticon/emoticon19.gif

看更多先前的回應...收起先前的回應...
freelife iT邦新手 5 級 ‧ 2021-06-26 18:34:45 檢舉

不可以直接用最大公因數啦~XD
您是說程式碼的結果嗎?

小魚 iT邦大師 1 級 ‧ 2021-06-26 22:40:33 檢舉

我好奇的是你這個Cycle是甚麼意思?

小魚 iT邦大師 1 級 ‧ 2021-06-26 22:43:23 檢舉

如果這個是題目要的答案,
那我猜想Cycle應該解釋為在有人重複舉手之前,
總共有幾個人舉手.

如果是這樣子解釋,
你覺得應該要怎麼寫?

freelife iT邦新手 5 級 ‧ 2021-06-27 01:15:56 檢舉

對,我也是這樣理解的
我本來是打算把各組的前30位舉手者都列出來存到矩陣裡面
之後再找到第幾輪時會重複
結果不知道是哪裡寫錯了做不出來
卡了很久
然後又覺得這個寫法會多執行很多不用做的事
所以就來求助了
/images/emoticon/emoticon56.gif

我要發表回答

立即登入回答