資料結構之 雙鏈表的實現

2021-07-10 12:15:44 字數 1843 閱讀 3466

/*

使用巢狀類實現【雙鏈表】

學習要點:、

(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...