C 實現雙向迴圈鍊錶(帶頭結點)

2021-08-21 06:32:25 字數 3402 閱讀 9559

雙向鍊錶也叫雙鏈表,是鍊錶的一種,它的每個資料結點中都有兩個指標,分別指向直接後繼和直接前驅。所以,從雙向鍊錶中的任意乙個結點開始,都可以很方便地訪問它的前驅結點和後繼結點。一般我們都構造雙向迴圈鍊錶。

簡單的畫乙個雙向迴圈簡易圖:

下面就用c++實現一下基本操作

當然也有 c 語言 版的,只是單鏈表操作

(先分開寫吧

1、四個重要的函式:建構函式、拷貝建構函式、賦值運算子過載、析構函式。

//建構函式

list(size_t n,const datatype&

data)

list(datatype* first, datatype* last)

//拷貝建構函式

list(const list

& l)

}//賦值運算子過載

list

& operator=(const list

& s)

}return

*this;

}//析構函式

~list()

2、對鍊錶的資料的操作(刪除和插入)

//尾插

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)

3、對鍊錶空間的操作

//鍊錶的大小

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