日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

数据结构基础(9) --单链表的设计与实现(2)之高级操作

發布時間:2025/3/17 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据结构基础(9) --单链表的设计与实现(2)之高级操作 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

鏈表的鏈接:

? ? 將第二條鏈表的所有內容鏈接到第一條鏈表之后,?其完整實現代碼與解析如下:

//鏈表的鏈接 template <typename Type> void MyList<Type>::concatenate(const MyList<Type> &list) {if (isEmpty())//如果自己的鏈表為空{first = list.first;return ;}else if (list.isEmpty()) //如果第二條鏈表為空{return ;}Node<Type> *endNode = first->next;//找到第一條鏈表的末尾節點while (endNode->next != NULL){endNode = endNode->next;}//找到第二條鏈表的第一個真實元素Node<Type> *secondListNode = (list.first)->next;//注意: 需要將第二個鏈表中的元素值copy出來//不能直接將第二條鏈表的表頭鏈接到第一條鏈表的表尾//不然在析構函數回收內存時會發生錯誤(即:同一段內存釋放兩次)while (secondListNode != NULL){Node<Type> *newNode = new Node<Type>(secondListNode->data);newNode->next = NULL;endNode->next = newNode;//兩條鏈表同時前進endNode = endNode->next;secondListNode = secondListNode->next;} }

鏈表的反轉:

基本思想:

? ? 遍歷一遍鏈表,利用一個輔助指針(此處為指針r),存儲遍歷過程中當前指針指向的下一個元素,然后將當前節點元素的指針反轉后,利用已經存儲的指針往后面繼續遍歷。

//鏈表的反轉 template <typename Type> void MyList<Type>::invort() {if (!isEmpty()){//p指向正向鏈表的第一個真實節點//隨后, p也會沿正方向遍歷到鏈表末尾Node<Type> *p = first->next;//q會成為倒向的第一個真實節點//首先將q設置為NULL: 保證反向之后//最后一個元素的指針域指向NULL, 以表示鏈表結束Node<Type> *q = NULL;while (p != NULL){Node<Type> *r = q; //暫存q當前指向的節點//q后退(沿著正向后退)q = p;//p前進(沿著正向前進), 保證p能夠始終領先q一個位置p = p -> next;//將指針逆向反轉//注意:一點要保證這條語句在p指針移動之后運行,//不然p就走不了了...(因為q改變了指針的朝向)q -> next = r;}//此時q成為反向鏈表的第一個真實元素//但是為了維護像以前一樣的first指針指向一個無用的節點(以使前面的操作不會出錯)//于是我們需要將first的指針域指向qfirst->next = q;} }

鏈表打印:

? ? 重載MyList<<運算符,?輸出鏈表所有元素,?以供測試之用

//顯示鏈表中的所有數據(測試用) template <typename Type> ostream &operator<<(ostream &os, const MyList<Type> &list) {for (Node<Type> *searchNode = list.first -> next;searchNode != NULL;searchNode = searchNode -> next){os << searchNode -> data;if (searchNode -> next != NULL) //尚未達到鏈表的結尾cout << " -> ";}return os; }

-測試代碼:

int main() {cout << "------------ 1 ------------" << endl;MyList<int> first;for (int i = 0; i < 5; ++i){first.insert(i+1, i+1);}first.remove(5);MyList<int> second;for (int i = 0; i < 5; ++i){second.insert(i+6, i+1);}second.insertFront(5);second.insert(88, 7);cout << "Before concatenate..." << endl;cout << "first: " << first << endl;cout << "second: " << second << endl;cout << "After concatenate..." << endl;first.concatenate(second);cout << "first: " << first << endl;cout << "second: " << second << endl;cout << "\n------------ 2 ------------" << endl;MyList<char> chList;for (char ch = '0'; ch <= '9'; ++ ch){chList.insertFront(ch);}cout << "Before invort..." << endl;cout << chList << endl;cout << "After invort..." << endl;chList.invort();cout << chList << endl;cout << "After remove('5')..." << endl;chList.remove('5');cout << chList << endl;cout << "\n------------ 3 ------------" << endl;MyList<double> dList;dList.insert(1.1, 1);dList.insertFront(2.2);cout << dList << endl;return 0; }


總結

以上是生活随笔為你收集整理的数据结构基础(9) --单链表的设计与实现(2)之高级操作的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。