單鏈表 解決josephus問題

2021-09-30 03:28:23 字數 3541 閱讀 9753

// 此**僅供個人學習之用

singlelinkedlist

// singlelinkedlist.h

#ifndef singlelinkedlist_h_h

#define singlelinkedlist_h_h

templateclass listnode;

templateclass list

~list();

bool insert(t,int); // 安值和位置插入

bool push_back(t); // 接在鍊錶隊尾之後

bool push_front(t);// 插在煉表頭之前

bool remove(int index); // 按索引刪除值

void remove_front(); // 從頭部移出

void print_list(); // 輸出鍊錶

bool is_empty()

void reverse(); // 反轉鍊錶

int get_length();

list& operator + (list& );

private:

listnode* _first,* _back;

bool is_index(int index); // 索引是否合法 };

templateclass listnode

private:

t data;

listnode * next; // 下一結點的指標};

#endif

// singlelinkedlist

.cpp

#ifndef singlelinklist_cpp

#define singlelinklist_cpp

#include "singlelinkedlist.h"

#include 

using std::cout;

using std::endl;

templatebool list::push_back(t t)

_back->next = temp;

_back = temp;

return true; }

templatebool list::push_front(t t)

temp->next = _first;

_first = temp;

return true; }

templatebool list::insert(t t,int index)

int i = get_length();

if(index<0 || index>= i )

if( index == 0 || index == (i-1) )

listnode* new_node,*temp ;

new_node= new listnode( t );

if( !new_node )

return false;

// 插入在temp的後面

temp = _first;

while (index--)

temp = temp->next;

new_node->next = temp->next;

temp->next = new_node;

return true;

}   

templateint list::get_length()

return len; }

templatevoid list::reverse()

}templatevoid list::remove_front()

templatebool list::remove(int index)

listnode* temp = _first;

listnode* ft;

do while( --index);

// 刪除最後乙個結點

if ( index == (get_length() -1) )

// 刪除普通結點

ft->next = temp->next;

delete temp;

return true; }

templatelist::~list()

} }

templatevoid list::print_list()

listnode* temp = _first;

while( temp != 0 )

cout << endl; }

templatebool list::is_index(int index)

#endif

模板迴圈鍊錶解決josephus問題

// circlelist.h

#ifndef circlelist_h_h

#define  circlelist_h_h

templateclass circlelist;

templateclass cirlistnode

private:

t data;

cirlistnode * next;

};templateclass circlelist

bool is_empty()

void insert(t d);

void remove(); // 移出當前結點

void next() // 移動到下一結點

t getdata()

private:

cirlistnode* first, * current, * last,* front;

};#endif

// circlelist

.cpp

#include "circlelist.h"

templatevoid circlelist::insert(t d)

cirlistnode* temp = new cirlistnode( d );

temp->next = current->next;

current->next = temp;

current = temp;

} templatevoid circlelist::remove()

#include 

#include "circlelist.h"

#include "circlelist.cpp"

using namespace std;

templatevoid josephus ( int n, int m ,circlelist& clist ) ;

void main ( ) 

// n 小孩數量,m 步長

templatevoid josephus ( int n, int m ,circlelist& clist ) 

cout << "no."<< clist.getdata() << " boy win/n";  }

//

Josephus問題 用迴圈鍊錶解決

1.剛剛學鍊錶,因此這裡特地用迴圈鍊錶解決此問題。2.具體程式如下 joseph環問題 n個人排隊,以m報數,直到只剩1人,輸出此人編號 用迴圈鍊錶解決問題 include includeint n,m int i,k 建立結構體 struct student void main else p1 h...

約瑟夫問題,用java單鏈表解決

設編號為1,2,3.n,的n個人圍坐一圈,約定編號為k 1的人從1開始報數,數到m的那個人出列,它的下一位又從1開始報數,數到m的人又出列,以此類推,直到所有人出列為止,由此產生乙個出隊編號的序列 由k節點起從1開始計數,計到m時,對應節點從鍊錶中刪除,然後再從被刪除節點的下乙個節點 又從1開始計數...

迴圈單鏈表解決迴圈報數問題

有n n 1 個人圍成一圈迴圈報數,每次報到3就出列,剩下的人繼續從1開始報數,直至只剩乙個人,求剩下那乙個人的原始編號。include using namespace std typedef struct node linklist void baoshu int m r next l 尾節點指向...