前言 :
在單向鏈結串列討論中, 我們可以延伸出許多更為有趣的串列結構, 這裡要討論的是環狀串列結構, 環狀串列的特點是在串列的任何一點, 都可以達到此串列的各節點.
環狀鏈結串列定義 :
在單向鏈結串列中, 維持串列首是相當重要的事, 因為鍊節串列有方向性, 所以如果串列首指標被破壞或遺失, 則整個串列就會遺失, 並且造成記憶體Leak. 但是如果我們把串列的最後一個節點指標指向串列首, 整個串列就成了單向的環狀結構. 如此一來便不用擔心串列首遺失的問題, 因為每一個節點都可以是串列首, 也可以從任一節點來追蹤其他節點. 建立過程與單向鏈結串列相似, 唯一不同點是比須將最後一個節點指向第一個節點, 請參考範例代碼 :
範例代碼 :
建立學生資料的環狀鏈節串列, 並可以從Console 插入學生資料到任意位置.
* ch03.h 代碼 :
* ch03.cpp 代碼 :
執行結果 :
在單向鏈結串列討論中, 我們可以延伸出許多更為有趣的串列結構, 這裡要討論的是環狀串列結構, 環狀串列的特點是在串列的任何一點, 都可以達到此串列的各節點.
環狀鏈結串列定義 :
在單向鏈結串列中, 維持串列首是相當重要的事, 因為鍊節串列有方向性, 所以如果串列首指標被破壞或遺失, 則整個串列就會遺失, 並且造成記憶體Leak. 但是如果我們把串列的最後一個節點指標指向串列首, 整個串列就成了單向的環狀結構. 如此一來便不用擔心串列首遺失的問題, 因為每一個節點都可以是串列首, 也可以從任一節點來追蹤其他節點. 建立過程與單向鏈結串列相似, 唯一不同點是比須將最後一個節點指向第一個節點, 請參考範例代碼 :
範例代碼 :
建立學生資料的環狀鏈節串列, 並可以從Console 插入學生資料到任意位置.
* ch03.h 代碼 :
- #include
- #include
- #include "Student.h"
- #include
- using namespace std;
- /*
- * As ch03_09.cpp
- * 環項鏈結範例
- */
- void circleLinkedExam();
- #include "ch03.h"
- /*
- * 顯示環狀鏈結串列
- */
- void _showCircleNode(link head) {
- cout << "座號\t姓名\t成績" << endl; // 列印串列內容
- cout << "======================" << endl;
- if(head != NULL) {
- link ptr = head;
- while(true){
- cout << ptr->num << "\t" << ptr->name << "\t" << ptr->score;
- cout << endl;
- ptr = ptr->next;
- if(ptr->next == head){
- break;
- }
- }
- }
- }
- /*
- * 尋找特定環狀鏈結的某節點
- */
- link _findCircleNode(link head, int num) {
- link ptr = head;
- do{
- if(ptr->num == num)
- return ptr;
- ptr = ptr->next;
- }while(ptr != head);
- return NULL;
- }
- /*
- * 插入環狀節點到某環狀鏈結串列(串列首為 head, )節點 after 後面.
- */
- link _insertCircleNode(link head, link after, int num, int score, char name[10]){
- link insertCircleNode = new node;
- if(insertCircleNode) {
- insertCircleNode->num = num;
- insertCircleNode->score = score;
- strcpy(insertCircleNode->name, name);
- if(head == NULL) { // 新增環狀節點
- head = insertCircleNode;
- head->next = head;
- return head;
- } else if(after == NULL){ // 新增環狀節點於串列首的位置
- link ptr = head;
- while(ptr->next != head){
- ptr = ptr->next;
- }
- insertCircleNode->next = head;
- ptr->next = insertCircleNode;
- return insertCircleNode;
- } else { // 新增環狀節點於串列首以外的位置
- insertCircleNode->next = after->next;
- after->next = insertCircleNode;
- return head;
- }
- }
- return NULL;
- }
- void circleLinkedExam() {
- int position=0, find, data[12][2];
- char namedata[12][10] = {{"Allen"},
- {"Moko"}, {"Lean"}, {"Melissa"}, {"Angel"}, {"Sabrina"},
- {"Joyce"}, {"Jasica"}, {"Hanson"}, {"Amy"}, {"Bob"},{"Jack"}};
- srand((unsigned)time(NULL)); // 以時間為亂數的種子
- cout << "座號\t成績\t座號\t成績\t座號\t成績\t座號\t成績" << endl;
- cout << "=============================================================" << endl;
- for(int i=0; i<12 ;i++) {
- data[i][0] = i+1;
- data[i][1] = rand() % 50 + 51;
- }
- for(int i=0; i<3; i++) {
- for(int j=0; j<4; j++)
- cout << "[" << data[i*4 +j][0] << "]\t[" << data[i*4 +j][1] << "]\t";
- cout << endl;
- }
- /*建立環狀串列*/
- link newnode = NULL;
- link head;
- for(int i=0; i<12; i++) {
- if(newnode==NULL) {
- newnode = new node;
- head = newnode;
- for(int k=0;k<10;k++)
- newnode->name[k] = namedata[i][k];
- newnode->num = data[i][0];
- newnode->score = data[i][1];
- }else {
- newnode->next = new node;
- newnode->next->next = head;
- for(int k=0;k<10;k++)
- newnode->next->name[k] = namedata[i][k];
- newnode->next->num = data[i][0];
- newnode->next->score = data[i][1];
- newnode = newnode->next;
- }
- }
- while(1){
- cout << "請輸入要插入其後的學生編號, 結束輸入-1: ";
- cin >> position;
- if(position == -1) {
- break;
- } else {
- int new_num, new_score;
- char new_name[10];
- link ptr = _findCircleNode(head, position);
- cout << "請輸入新插入學生編號: ";
- cin >> new_num;
- cout << "請輸入新插入學生成績: ";
- cin >> new_score;
- cout << "請輸入新插入學生姓名: ";
- cin >> new_name;
- _insertCircleNode(head, ptr, new_num, new_score, new_name);
- _showCircleNode(head);
- }
- }
- }
執行結果 :
This message was edited 1 time. Last update was at 28/03/2010 14:25:26
沒有留言:
張貼留言