重新把殷人昆的c++資料結構(2版)重新走一遍,發現以前的基礎太差,這個簡單的基礎的東西都搞了好久才搞出來啊~~~~~
言歸正題:
首先建立要力乙個circlist.h標頭檔案**如下:
//不帶頭結點的單迴圈鍊錶
#ifndef circlist_h
#define circlist_h
#ifndef ch_h
#define ch_h
#include #includeusing namespace std;
#endif
templatestruct circlinknode
circlinknode(t d, circlinknode* next = null) :data(d), link(next)
};templateclass circlist
/*bool isfull()*/
circlinknode*gethead()
bool insert(int i, t& x);
bool remove(int i, t& x);
bool setdata(int i, t& x);
bool getdata(int i, t& x);
circlinknode* search(t x);
circlinknode* locate(int i);
void output();
void inputfront(t endtag);
void inputrear(t endtag);
private:
circlinknode*first, *last;
};//
templatecirclist::circlist()
templatecirclist::circlist(const t& x)
templatecirclist::circlist(circlist& l)
last = destptr;
last->link = first;
}templatecirclist::~circlist()
templateint circlist::length()const
return ++count;
}templatevoid circlist::makeempty()
last = null;
}templatebool circlist::insert(int i, t& x)
circlinknode*current = locate(i);
if (current==null)
circlinknode*newnode = new circlinknode(x);
if (newnode==null)
if (current!=last)
else
}templatebool circlist::remove(int i, t& x)
else if (current == first)
else if (current==last)
else
return true;
}templatebool circlist::setdata(int i, t& x)
circlinknode*current = locate(i);
if (!current)
current->data = x;
return true;
}templatebool circlist::getdata(int i,t& x)
circlinknode*current = locate(i);
if (!current)
x = current->data;
return true;
}template//circlinknode* circlist::search(t x)const
circlinknode* circlist::search(t x)
else
}return current;
}templatecirclinknode* circlist::locate(int i)
if (i == 0)
circlinknode* current = first;
int k = 1;
while (current->link != first && k < i)
return current;
}templatevoid circlist::inputfront(t endtag)
last = first = newnode;
first->link = last;
last->link = first;
while (val != endtag)
else}}
}templatevoid circlist::inputrear(t endtag)
else}}
}templatevoid circlist::output()
cout << "#" << i << ":" << current->data << endl;
}#endif
之後就是測試自己的寫的**和寫出約瑟夫環的結果了:
main.cpp如下:
#include "circlist.h"
templatevoid josephus(circlist& js, int n, int m)
cout << "出列的第"
pre->link = p->link;
delete p;
p = pre->link;
}cout << "最後的幸運者:" << p->data << endl;
}
main.cpp**如下:
void main()
*///cout << "前插法:" << endl;
///*cout << "insert函式插入乙個數:"
int i, n, m;
cout << "建立迴圈鍊錶:" << endl;
clist.inputrear(-1);
cout << "輸入遊戲的人數和報數間隔:";
cin >> n >> m;
josephus(clist, n, m);
while (1)
}
注意:血淚史,如果**是模板類的話,不要把宣告和定義分開放在標頭檔案和原始檔中,不然會有好多你意想不到的錯誤啊!!!!
截圖效果如下:
不帶頭結點的單迴圈鍊錶
建立標頭檔案nlist.h pragma once 不帶頭節點的鍊錶,主要應用在迴圈鍊錶中,其缺點,操作複雜 會出現二級指標 優點 靈活 頭指標指向哪個節點哪個節點就是第乙個節點 不帶頭節點的單鏈迴圈鍊錶,尾節點的next指向第乙個節點 typedef struct nnode nnode,pnli...
約瑟夫環問題(不帶頭結點單迴圈鍊錶實現和陣列實現)
q 略 a 為了簡化過程,類中只有3個函式即可,構造,增加,約瑟夫環解決函式 ps 做這道題是為了鞏固鍊錶知識,在這過程中,this指標很隱蔽,code include using namespace std template struct linknode linknode t item,link...
不帶頭結點的雙向迴圈鍊錶
基本概念 迴圈鍊錶 將單鏈表中最後乙個結點的next指向頭結點或者空指標,就使得整個單鏈表形成乙個環,這種頭尾相接的單鏈表稱為單迴圈鍊錶,簡稱迴圈鍊錶。雙向鍊錶 是在單鏈表的每個結點中,再設定乙個指向其前驅結點的指標域prior,在雙向鍊錶的結點中有兩個指標域,乙個next指向直接後繼,乙個prio...