單鏈表類:class Slist
//單鏈表 //內容:預設4個,增刪6個,列印,查詢 #pragma once #include<iostream> #include<assert.h> using namespace std; typedef int DataType; //節點類,struct類預設公有 struct SListNode { //建構函式和成員變數都是公有的 SListNode* _next; DataType _data; //寫了建構函式就不用BuyNode了,可以直接new SListNode(DataType x) //注意L是大寫 :_data(x) ,_next(NULL) {} }; //單鏈表類 class Slist { typedef SListNode Node; public: Slist() :_head(NULL) ,_tail(NULL) //方便尾插 {} Slist(const Slist& s) :_head(NULL) ,_tail(NULL) { Copy(s); } ~Slist() { Destory(); } //Slist& operator=(const Slist& s) //傳統寫法 //{ // if(this != &s) // { // //釋放this,頭尾置空否則為野指標,後面PushBack會出錯 // Destory(); // // // Copy(s); // } // //自己給自己賦值,直接走這裡,不走if語句 // return *this; //} Slist& operator=(Slist s) //現代寫法,拷貝構造沒現代寫法,因為沒有帶參的建構函式 { swap(_head, s._head); swap(_tail, s._tail); return *this; } void Destory() //釋放連結串列 { //_head為空不進入while所以這裡無需判定_head不為空 Node* cur = _head; while(cur) { Node* del = cur; cur = cur->_next; delete del; //Node* next = cur; //delete cur; //cur = next; } _head = _tail = NULL; } void Copy(const Slist& s) { Node* cur = s._head; while(cur) { PushBack(cur->_data); cur = cur->_next; } } void PushBack(DataType x); void PushFront(DataType x); void Insert(Node* pos, DataType x); //1.頭插 2.隨機 void PopBack(); void PopFront(); void Erase(Node* pos); //1.頭刪 2.尾刪 3.隨機 void Print(); Node* Find(DataType x); private: //是指向節點的指標SListNode*,不是指向單鏈表類的指標Slist SListNode* _head; SListNode* _tail; }; void Slist::PushBack(DataType x) { //1.空 2.非空 if(_head == NULL) { _head = _tail = new Node(x); } else { _tail->_next = new Node(x); _tail = _tail->_next; } } void Slist::PushFront(DataType x) { //1.空 2.非空 if(_head == NULL) { _head = _tail = new Node(x); } else { Node* tmp = new Node(x); tmp->_next = _head; _head = tmp; } } void Slist::Insert(Node* pos, DataType x) { //因為能指定位置,則至少有一個節點 //1.頭插 2.隨機位置 assert(pos); if(_head == pos) { PushFront(x); } else { Node* prev = _head; while(prev->_next != pos) { prev = prev->_next; } Node* tmp = new Node(x); prev->_next = tmp; tmp->_next = pos; } } void Slist::PopBack() { //1.空 2.1個 3.多個 if(_head == NULL) { return; } else if(_head == _tail) { delete _tail; _head = _tail = NULL; } else { Node* prev = _head; while(prev->_next != _tail) { prev = prev->_next; } delete _tail; _tail = prev; _tail->_next = NULL; } } void Slist::PopFront() { //1.空 2.1個 3.多個 if(_head == NULL) { return; } else if(_head == _tail) { delete _head; _head = _tail = NULL; } else { Node* del = _head; _head = _head->_next; delete del; } } void Slist::Erase(Node* pos) { //1.尾刪 2.頭刪 3.隨機 assert(pos); if(pos == _tail) { PopBack(); } else if(pos == _head) { PopFront(); } else { Node* prev = _tail; while(prev->_next != pos) { prev = prev->_next; } prev->_next = pos->_next; delete pos; } } SListNode* Slist::Find(DataType x) //這裡不能寫Node*因為typedef在類裡面沒在外面 { Node* cur = _head; while(cur) { if(cur->_data == x) { return cur; } cur = cur->_next; } return NULL; } void Slist::Print() { Node* cur = _head; while(cur) { cout<<cur->_data<<" "; cur = cur->_next; } cout<<endl; }
相關推薦
單鏈表類:class Slist
//單鏈表 //內容:預設4個,增刪6個,列印,查詢 #pragma once #include<iostream> #include<assert.h> using namespace std; typedef int DataType;
順序表類:class SeqList
//順序表,不是字串沒'\0' //預設4個,增刪6個,查詢,列印,容量檢測 #pragma once #include <iostream> #include <assert.h> using namespace std; typedef i
資料結構實驗2:C++實現單鏈表類
太簡單了,沒啥可說的,程式碼意義明白如話。 題目與要求: 實驗2 2.1 實驗目的 熟練掌握線
C++實現單鏈表類
太簡單了,直接貼題目然後上程式碼。 題目: 實驗2 2.1 實驗目的 熟練掌握線性表的鏈式儲存結構。 熟練掌握單鏈表的有關演算法設計。 根據具體問題的
單鏈表類的實現
一個普通的單鏈表(一個指標域),對於其最重要的就是單鏈表的頭指標,通過頭指標可以確定單鏈表的一些屬性,如:是不是空的,通過頭指標進行遍歷等。 我們用python做一個單鏈表的類實現,要求可以建立一個空的
單鏈表建立:頭插法與尾插法
1、採用頭插入法建立單鏈表的思路:首先建立一個空表,生成一個新的節點;並將讀取到的資料放入新節點的資料域中,然後將該節點插入到當前連結串列的表頭,即就是頭結點之後;直到插入元素完成。 2、效果:採用頭
給定單鏈表L:L0→L1→...→Ln-1→Ln, 重新排序:L0→Ln→L1→Ln-1→L2→Ln-2→...
本題源自leetcode 143 ---------------------------------------------------------------------------- 思路1:用快慢指標找到中節點,然後反轉後半部分連結串列。然後倆個連結串列交叉插入 程
python類:class建立 new init詳解
在Python中,可以通過class關鍵字定義自己的類,然後通過自定義的類物件類建立例項物件。python類的建立建立一個Student的類,並且實現了這個類的初始化函式”__init__”,class Student(object): #object 可省略 coun
jvm探祕五:Class類檔案結構之屬性表
概述 在Class檔案、欄位表和方法表都可以攜帶自己的屬性資訊,這個資訊用屬性表進行描述,用於描述某些場景專有的資訊。 與Class檔案中其它資料項對長度、順序、格式的嚴格要求不同,屬性表集合不要求其中包含的屬性表具有嚴格的順序,並且只要屬性的名稱不與已
C++:順序表類實現約瑟夫問題_密碼不同
class josephus main clu 定義 void seq esp while //.h #pragma once#include <iostream>using namespace std;#define MAXSIZE 100 template
ES6-18:class類及其繼承
數據 truct 否則 on() 自動 自己 ren ext clas JavaScript作為一個動態語言,很大程度上的詬病就是缺少了面向對象的類這個概念,ES5傳統的方法是通過構造函數來實現類的特性;ES6引入了類這一概念,將Class這個概念作為對象的模板,通過關鍵
【深入Java虛擬機】之二:Class類文件結構
本質 拒絕 處理 implement align 默認值 改變 占用 至少 平臺無關性 Java是與平臺無關的語言,這得益於Java源代碼編譯後生成的存儲字節碼的文件,即Class文件,以及Java虛擬機的實現。不僅使用Java編譯器可以把Java代碼編譯成存儲字節
python Class:面向對象高級編程 元類:type
soft elf ast 類型 普通 lin 元類 flow 類的方法 type的用法:1、普通的type用法:檢查類型class my(object): def hello(self, name='world'): print(
「深入Java虛擬機(2)」:Class類文件結構
1.5 trac 三種 type 類構造 face 方法 class throw Java是與平臺無關的語言,這得益於Java源代碼編譯後生成的存儲字節碼的文件,即Class文件,以及Java虛擬機的實現。不僅使用Java編譯器可以把Java代碼編譯成存儲字節碼的Class
結構體、聯合體、類:struct、union、class
區別:類的成員預設是私有的private &n
資料結構 筆記:單鏈表的具體實現
LinkList設計要點 -類模板,通過頭結點訪問後繼結點 -定義內部結點型別Node,用於描述資料域和指標域 -實現線性表的關鍵操作(增,刪,查,等) template<typename T> class LinkList : public List<T>
資料結構 筆記:靜態單鏈表的實現
單鏈表的一個缺陷 -觸發條件 ·長時間使用單鏈表物件頻繁增加和刪除資料元素 -可能的結果 ·堆空間產生大量的記憶體碎片,導致系統執行緩慢 新的線性表 設計思路: 在單鏈表的內部增加一片預留的空間,所有Node物件都在這片空間中動態建立和動態銷燬。 靜態單鏈表的實
資料結構 筆記:單鏈表的遍歷與優化
如何遍歷單鏈表中的每一個數據元素? 為單鏈表提供新的方法,線上性時間內完成遍歷 設計思路(遊標) -在單鏈表的內部定義一個遊標(Node* m_current) -遍歷開始前將遊標指向位置為0的資料元素 -獲取遊標指向的資料元素 -通過結點中的next指標移動遊標 提供一
資料結構 筆記:順序表和單鏈表的對比分析
如何判斷某個資料元素是否存在於線性表中? find -可以為線性表(List)增加一個查詢操作 -int find(const T& e)const; ·引數: ~待查詢的資料元素 ·返回值: ~>= 0:資料元素線上性表中第一次出現的位置 ~-1:資料
19.執行緒同步:訊號量—>[單生產者/單消費者]單鏈表的插入和刪除
1.訊號量 1.訊號量本質 訊號量是鎖,是一種升級的mutex 訊號量在初始化時,可以指定共享資源的數量 2.相關函式 #include<semaphore.h> //標頭檔案 sem_t sem; //訊號量型別 int sem_destroy(se