帶頭結點的單連結串列實現(C++)
單連結串列在插入和刪除操作時,有無頭結點的實現是有區別的,總的來說,帶有頭結點的單連結串列實現起來比較方便,而不帶頭結點的單連結串列在鏈首插入和刪除時要特殊處理,以下程式碼是帶有頭結點的單連結串列的實現。
//類定義、模板類的定義
#ifndef IncludeHeadNodeChain_H_H
#define IncludeHeadNodeChain_H_H
#include <iostream>
using std::ostream;
//自定義一個異常類,用於查詢、插入和刪除操作中越界時的異常提示
class OutOfBounds
{
public:
void msg()
{std::cout<<"越界"<<std::endl;}
};
template <class T>
class Node
{
private:
//宣告友元類
template <class T>
friend class IncludeHeadNodeChain;
//定義節點資料
T data;//資料域
Node<T> * next;//指標域
};
template <class T>
class IncludeHeadNodeChain
{
private:
Node<T> * head;
public:
IncludeHeadNodeChain();
~IncludeHeadNodeChain();
bool isEmpty() const;
bool find_k(int k, T& x) const;//用於發現第k個元素,返回給x
int search_x(const T& x) const;//用於查詢連結串列中是否有元素x,並返回x的位置
int length() const {return head->data;}//返回連結串列長度
IncludeHeadNodeChain<T>& insert(int k, const T& x);
IncludeHeadNodeChain<T>& del(int k, T& x);
void output(ostream& os) const;
//友元類,用於輸出連結串列元素
template <class T>
friend ostream& operator<<(ostream& os, const IncludeHeadNodeChain<T>& ihnc);
};
template <class T>
IncludeHeadNodeChain<T>::IncludeHeadNodeChain()
{
//建立頭結點
head = new Node<T>;
head->next = NULL;
head->data = 0;//本例中頭結點的資料域用於存放連結串列長度
}
template <class T>
IncludeHeadNodeChain<T>::~IncludeHeadNodeChain()
{
Node<T> * cur = head;
while (head)
{
cur = cur->next;
delete head;
head = cur;
}
}
template <class T>
bool IncludeHeadNodeChain<T>::isEmpty() const
{
return head->next == NULL;
}
template <class T>
bool IncludeHeadNodeChain<T>::find_k(int k, T& x) const
{
if (k < 0)
throw OutOfBounds();
Node<T> * cur = head;//cur最終指向第k個元素
for (int i = 0;i < k && cur;i++)
cur = cur->next;
if (!cur)
return false;
x = cur->data;
return true;
}
template <class T>
int IncludeHeadNodeChain<T>::search_x(const T& x) const
{
Node<T> * cur = head->next;
int index = 1;
while (cur && cur->data != x)
{
cur = cur->next;
index++;
}
if (!cur)
return -1;//返回-1表示未能找到x
return index;
}
template <class T>
IncludeHeadNodeChain<T>& IncludeHeadNodeChain<T>::insert(int k, const T& x)
{
if (k < 0)
throw OutOfBounds();
Node<T> * cur = head;
for (int i = 0;i < k && cur;i++)
cur = cur->next;
if (k > 0 && !cur)//若不存在第k個元素
throw OutOfBounds();
Node<T> * ins = new Node<T>;//帶插入元素
ins->data = x;
//執行插入操作
ins->next = cur->next;
cur->next = ins;
head->data++;//連結串列長度加1
return *this;
}
template <class T>
IncludeHeadNodeChain<T>& IncludeHeadNodeChain<T>::del(int k, T& x)
{
if (k < 1) throw OutOfBounds();
Node<T> * pre = head;//pre最終指向第k個元素的上一個元素
for (int i = 0;i < k-1 && pre;i++)
pre = pre->next;
if (!pre || !pre->next)
throw OutOfBounds();
Node<T> * cur = pre->next;//cur指向第k個元素
//執行刪除操作
pre->next = cur->next;
x = cur->data;
delete cur;
head->data--;//連結串列長度減1
return *this;
}
template <class T>
void IncludeHeadNodeChain<T>::output(ostream& os) const
{
Node<T> * cur = head->next;//cur指向第一個節點
while (cur)
{
std::cout<<cur->data<<" ";
cur = cur->next;
}
std::cout<<std::endl;
}
template <class T>
ostream& operator<<(ostream& os, const IncludeHeadNodeChain<T>& ihnc)
{
ihnc.output(os);
return os;
}
#endif
使用以下程式碼進行測試:
#include <iostream>
#include "linkedlist.h"
int main()
{
using std::cout;
using std::endl;
IncludeHeadNodeChain<int> chain;
try
{
chain.insert(0,4);
chain.insert(1,56);
chain.length();
//下面程式碼將出現異常
int x;
chain.del(3,x);
}
catch(OutOfBounds& o)
{o.msg();}
}
相關文章
- 帶頭結點的連結串列操作題
- c++實現單連結串列C++
- 連結串列-單連結串列實現
- 資料結構——單連結串列的C++實現資料結構C++
- 資料結構 - 單連結串列 C++ 實現資料結構C++
- 【資料結構】實現單連結串列(c++)資料結構C++
- 圖解帶頭節點的單連結串列的反轉操作圖解
- 單連結串列實現
- 遞迴演算法-不帶頭節點的單連結串列遞迴演算法
- 連結串列面試題(十一)---求帶環單連結串列 環的入口點面試題
- Java兩種方式實現連結串列的刪除,返回頭結點Java
- 連結串列面試題(一)---刪除一個無頭單連結串列的非尾結點面試題
- 單連結串列的插入刪除操作(c++實現)C++
- Java實現連結串列帶註釋Java
- 【資料結構】連結串列(單連結串列實現+詳解+原碼)資料結構
- go 實現單向連結串列Go
- Python實現單連結串列Python
- C\C++之用結構體實現連結串列的建立、遍歷、結點插入、結點刪除C++結構體
- js實現資料結構--單連結串列JS資料結構
- C++實現通用雙向連結串列C++
- 單向迴圈連結串列的實現
- 結點插入到單連結串列中
- 連結串列面試題(十三)---求兩個都不帶環的連結串列相交的結點面試題
- C++:用棧實現反轉連結串列,超簡單!C++
- 連結串列以及golang介入式連結串列的實現Golang
- Linux核心連結串列-通用連結串列的實現Linux
- 【資料結構】實現迴圈連結串列(c++)資料結構C++
- 連結串列面試題(十)---求帶環單連結串列的環的長度面試題
- C語言實現帶表頭結點單連結串列的初始化、查詢、插入、刪除、輸出、撤銷等操作C語言
- 資料結構實驗之連結串列五:單連結串列的拆分資料結構
- 資料結構學習(C++)——單連結串列(定義與實現) (轉)資料結構C++
- python 資料結構之單連結串列的實現Python資料結構
- 資料結構-2.單向連結串列的實現資料結構
- 資料結構和演算法——Go實現單連結串列並且反轉單連結串列資料結構演算法Go
- 單連結串列實現增刪改查
- js在Node.js下實現單連結串列與雙連結串列結構Node.js
- 定義一個函式,輸入一個連結串列的頭節點,反轉該連結串列並輸出反轉後連結串列的頭節點函式
- 資料結構之php實現單向連結串列資料結構PHP