前言 :
雙向鏈結串列 (Double Linked List) 是另一種常用的串列結構. 在單向或環狀串列中, 只能沿著一個方向搜尋資料, 而且不小心有一個鏈結斷裂, 則後面的串列就會消失且無法救回. 雙向鏈結可以改善這兩個缺點, 因為它的基本結構和單向鏈結類似, 至少有一個欄位可以存放資料, 指是他有兩個欄位存放指標, 其中一個指向後面的節點, 另一個指向前面的節點.
雙向鏈結串列定義 :
雙向鏈結串列的資料結構, 可以定義如下 :
範例代碼 :
* Student2.h 代碼 :
* Student2.cpp 代碼 :
* 呼叫演算法範例代碼 :
執行結果 :
雙向鏈結串列 (Double Linked List) 是另一種常用的串列結構. 在單向或環狀串列中, 只能沿著一個方向搜尋資料, 而且不小心有一個鏈結斷裂, 則後面的串列就會消失且無法救回. 雙向鏈結可以改善這兩個缺點, 因為它的基本結構和單向鏈結類似, 至少有一個欄位可以存放資料, 指是他有兩個欄位存放指標, 其中一個指向後面的節點, 另一個指向前面的節點.
雙向鏈結串列定義 :
雙向鏈結串列的資料結構, 可以定義如下 :
範例代碼 :
* Student2.h 代碼 :
- #include
- using namespace std;
- class Student2{
- public:
- int num; // 座號
- int score; // 成績
- char name[10]; //姓名
- Student2* llink; // 指標, 指向上一個節點
- Student2* rlink; // 指標, 指向下一個節點
- };
- typedef Student2 node2;
- typedef node2 *link2;
- /*
- * 尋找特定節點
- */
- link2 findNode2(link2 head, int num);
- /*
- * 插入節點
- */
- link2 insertNode2(link2 head, link2 ptr, int num, int score, char name[10]);
- /*
- * 顯示雙向鏈結串列內容
- */
- void showNode2(link2 head);
- #include "Student2.h"
- link2 findNode2(link2 head, int num) {
- link2 ptr = head;
- while(ptr!=NULL) {
- if(ptr->num == num) {
- break;
- } else {
- ptr = ptr->rlink;
- }
- }
- return ptr;
- }
- link2 insertNode2(link2 head, link2 ptr, int num, int score, char name[10]) {
- link2 newnode = new node2;
- if(!newnode) {
- cout << "[配置記憶體錯誤!]" << endl;
- return head;
- }
- newnode->num = num;
- newnode->score = score;
- strcpy(newnode->name, name);
- if(head == NULL) { // 雙向串列為空
- return newnode;
- } else {
- if(ptr == NULL) {
- cout << "[錯誤:不是串列中的節點]" << endl;
- } else if(ptr == head) { // 插入串列首位置
- head->llink = newnode;
- newnode->rlink = head;
- return newnode;
- } else if(ptr->rlink == NULL) { // 插入串列尾的位置
- ptr->rlink = newnode;
- newnode->llink = ptr;
- return head;
- } else { // 插入串列中的位置
- newnode->rlink = ptr->rlink;
- ptr->rlink->llink = newnode;
- ptr->rlink = newnode;
- newnode->llink = ptr;
- return head;
- }
- }
- return NULL;
- }
- void showNode2(link2 head) {
- link2 ptr = head;
- cout << "座號\t姓名\t成績" << endl; // 列印串列內容
- cout << "======================" << endl;
- while(ptr!=NULL) {
- cout << ptr->num << "\t" << ptr->name << "\t" << ptr->score;
- cout << endl;
- ptr = ptr->rlink;
- }
- }
- void dualDirectLinkedListExam() {
- 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;
- }
- link2 newnode = NULL;
- link2 head;
- for(int i=0; i<12; i++) {
- if(newnode==NULL) {
- newnode = new node2;
- 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];
- newnode->rlink = NULL;
- newnode->llink = NULL;
- }else {
- newnode->rlink = new node2;
- newnode->rlink->rlink = NULL;
- for(int k=0;k<10;k++)
- newnode->rlink->name[k] = namedata[i][k];
- newnode->rlink->num = data[i][0];
- newnode->rlink->score = data[i][1];
- newnode->rlink->llink = newnode;
- newnode = newnode->rlink;
- }
- }
- while(1){
- cout << "請輸入要插入其後的學生編號, 結束輸入-1: ";
- cin >> position;
- if(position == -1) {
- break;
- } else {
- int new_num, new_score;
- char new_name[10];
- link2 ptr = findNode2(head, position);
- cout << "請輸入新插入學生編號: ";
- cin >> new_num;
- cout << "請輸入新插入學生成績: ";
- cin >> new_score;
- cout << "請輸入新插入學生姓名: ";
- cin >> new_name;
- insertNode2(head, ptr, new_num, new_score, new_name);
- showNode2(head);
- }
- }
- }
執行結果 :
This message was edited 2 times. Last update was at 28/03/2010 22:31:53
沒有留言:
張貼留言