雙向鍊錶也叫雙鏈表,是鍊錶的一種,它的每個資料結點中都有兩個指標,分別指向直接後繼和直接前驅。所以,從雙向鍊錶中的任意乙個結點開始,都可以很方便地訪問它的前驅結點和後繼結點。一般我們都構造雙向迴圈鍊錶。
簡單的畫乙個雙向迴圈簡易圖:
下面就用c++實現一下基本操作
當然也有 c 語言 版的,只是單鏈表操作
(先分開寫吧
1、四個重要的函式:建構函式、拷貝建構函式、賦值運算子過載、析構函式。
2、對鍊錶的資料的操作(刪除和插入)//建構函式
list(size_t n,const datatype&
data)
list(datatype* first, datatype* last)
//拷貝建構函式
list(const list
& l)
}//賦值運算子過載
list
& operator=(const list
& s)
}return
*this;
}//析構函式
~list()
3、對鍊錶空間的操作//尾插
void pushback(const datatype&
data)
//尾刪
void popback()
//頭插
void pushfront(const datatype&
data)
//頭刪
void popfront()
//任意位置插入
node* insert(node* pos, const datatype&
data)
//任意位置刪除
node* erase(node* pos)
下面給出完成的操作**以及測試**和結果圖//鍊錶的大小
size_t size()const
return count;
}//判空
bool empty()const
//改變鍊錶的大小
void resize(size_t newsize, const datatype& data = datatype())
else
}
結果圖#define _crt_secure_no_warnings
#define
null
0#include
#include
<
string
.h>
#include
using namespace std;
//雙向迴圈鍊錶(帶頭結點)
typedef int datatype;
struct node
};class list
//建構函式
list(size_t n,const datatype&
data)
list(datatype* first, datatype* last)
//拷貝建構函式
list(const list
& l)
}//賦值運算子過載
list
& operator=(const list
& s)
}return
*this;
}//析構函式
~list()
//尾插
void pushback(const datatype&
data)
//尾刪
void popback()
/*void pushback(const datatype& data)//尾插
else
}void popback()//尾刪
else//有多個結點}*/
//頭插
void pushfront(const datatype&
data)
//頭刪
void popfront()
//任意位置插入
node* insert(node* pos, const datatype&
data)
//任意位置刪除
node* erase(node* pos)
size_t size()const
return count;
}bool empty()const
void resize(size_t newsize, const datatype&
data
= datatype())
else
}//取出鍊錶第乙個元素的資料
datatype& front()
const datatype& front()const
datatype& back()
const datatype& back() const
void clear()
}private:
void _createhead()
//列印函式
friend ostream& operator<
& l)
return _cout;
}private:
node* _phead;
};void testlist()
; list l3(array, array + sizeof(array) / sizeof(datatype));
cout << l3.size() << endl;
cout << l3 << endl;
cout << l3.front() << endl;
cout << l3.back() << endl;
l3.resize(5);
cout << l3.size() << endl;
cout << l3 << endl;
cout << l3.front() << endl;
cout << l3.back() << endl;
l3.resize(15,6);
cout << l3.size() << endl;
cout << l3 << endl;
cout << l3.front() << endl;
cout << l3.back() << endl;
}int main()
鍊錶 帶頭結點的雙向迴圈鍊錶
還需改進 creat node這個函式應有返回型別,來判斷新建結點是否成功,不然主函式中不管成不成功都會訪問該節點成員。改了這個函式,在主函式中create node後要判斷是否成功,不成功就提示並退出函式,退出前別忘了還要釋放鍊錶!同時create link這個函式中也要判斷head是否申請成功,...
建立鍊錶(帶頭 雙向 迴圈)
第一次嘗試 這是 h 部分的 pragma once 使用這種方式來重新命名資料型別,這樣可以很方便的修改後續資料的資料型別,相當於 define的作用 typedef int listtype 建立資料結點 typedef struct listnode listnode 建立頭結點 typede...
實現帶頭結點的雙向迴圈鍊錶
dlist.h 帶頭節點的雙向迴圈鍊錶 為什麼要帶頭 原因是因為如果不帶頭的話,那麼頭插或者頭刪會比較麻煩 而且不帶頭的話需要傳遞二級指標,帶頭的話,只需要傳遞一級指標 為什麼給成雙向的?有乙個理由是可以逆向列印鍊錶 也就是對有些操作會簡單一些 pragma once 保證標頭檔案不會被重複包含 i...