/*
使用巢狀類實現【雙鏈表】
學習要點:、
(1)實現雙鏈表資料結構的定義以及各種操作
(1)區別深拷貝(另外動態分配記憶體進行拷貝) 和 淺拷貝(直接拷貝賦值)
(2)實現深拷貝構造和深拷貝賦值函式
(3)實現操作運算子的過載
= (深拷貝賦值)
<< 輸出運算子過載:建立全域性函式,在類中定義時可宣告為friend函式;
friend函式可訪問類中private成員
*/#includeusing namespace std;
class list
~list()
// 深度拷貝構造 和 深度拷貝賦值
list(const list& that):m_head(null), m_tail(null)
} list& operator=(const list& that)
return *this;
} //清空鍊錶
void clear(void)
m_head = null;
m_tail = null;
} //是否為空
bool empty(void) const
//元素個數
size_t size(void)const
return count;
} //得到首元素
int& front(void)
return m_head->m_data;
} const int& front(void) const
//插入首元素
void push_front(const int& data)else
} //刪除首元素
void pop_front(void)
node* temp = m_head;
m_head = m_head->m_next;
delete temp;
temp = null;
if(m_head)else
} //得到尾元素
int& back(void)
return m_tail->m_data;
} const int& back(void) const
//插入尾元素
void push_back(const int& data)else
} //刪除尾元素
void pop_back(void)
node* temp = m_tail;
m_tail = m_tail->m_prev;
delete temp;
temp = null;
if(m_tail)else
}//刪除某個特定的元素
void remove(const int& data)else
if(node->m_next)else
delete node;
}} }
//列印整個鍊錶
friend ostream& operator<<(ostream& os, const list& list)
return os; }
private:
class node
/* 注意:過載輸出/入運算子, 要定義全域性函式,在類內定義時可定義為friend函式 */
//列印節點
friend ostream& operator<<(ostream& os, const node& node)
}; node* m_head;
node* m_tail;
};//主函式測試
int main()
資料結構之雙鏈表
前面我們介紹了單鏈表,單鏈表的優點是沒有空間的限制,可以隨意開闢空間。但與我們這次要講的雙鏈表相比,就有點相形見絀了。因為哪怕是單鏈表,在進行查詢 插入 排序等等時都要進行線性表的遍歷,而我們往往需要的是目標節點的前乙個節點,所以經常一不小心就錯過了我們需要的節點,或者經常需要乙個當前節點的備份,以...
資料結構 雙鏈表
typedef struct nodenode 雙鏈表的根節點的bwd指標指向雙鏈表的最後乙個節點,fwd指標指向雙鏈表的第乙個節點,雙鏈表的value欄位為空 以下程式是將乙個值插入到乙個有序的雙鏈表中,如果鍊錶中已經有和該值相同的節點則不插入 include include typedef st...
資料結構 雙鏈表
目標 掌握雙鏈表的資料結構 來看看什麼是雙鏈表吧 雙鏈表與單鏈表的區別,單鏈表是單項的 而雙鏈表是有左右的 題目acwing 827 實現乙個雙鏈表,雙鏈表初始為空,支援5種操作 1 在最左側插入乙個數 2 在最右側插入乙個數 3 將第k個插入的數刪除 4 在第k個插入的數左側插入乙個數 5 在第k...