鍊錶是常用的基本資料結構之一,屬於線性表。同屬於線性表的還有順序表,我們常說的陣列就是順序表。
鍊錶的實現有帶表頭和不帶表頭兩種方式。最原始的方式,也就是不帶表頭的實現方式,是用乙個指向頭結點的指標變數來記錄鍊錶的起始位置,當我們要進行插入或刪除結點的操作時,必須要針對第乙個結點和其它結點做出不同判斷,然後用不同的**來分別處理這兩種情況。
所謂帶表頭的實現方式,就是用乙個空的結點來作為頭結點,其data域不放資料,其next指標指向第乙個存有資料的結點。這樣的好處是:每乙個資料結點都有相同型別的前驅結點,不管在哪個位置實現操作,都能用統一的形式來表述,即可以用同樣的**來實現,而無需判斷是在鍊錶的起始位置、中間位置或者尾部位置。
我們將實現鍊錶類的幾個基本方法:
鍊錶類linklist的定義部分
linklist的實現部分template
elemtype>
class
linklist ;
node
(elemtype
data, node* next = nullptr):
data(data), next(next){};
};node
head;
public:
linklist
() {};
~linklist
();data);
void insert(elemtype
data, int
pos = 0);
bool del(int
pos);
int search(elemtype
data);
int getlength();
elemtype getdata(int
pos);
void sort(int(*compare)
(elemtype& a, elemtype& b));
};
template linklist::~linklist()
} node *ptr = &head;
while(ptr->next != nullptr)
ptr->next = new node(data);
}/* 當插入位置大於鍊錶長度時,將元素插到鍊錶末尾 */
template void linklist::insert(elemtype data, int
pos)
ptr->next = new node(data, ptr->next);
}template bool linklist::del(int
pos)
if(p == pos) else
}/* 成功找到元素則返回索引,否則返回-1
*/template int linklist::search(elemtype data)
p++;
ptr = ptr->next;
}return -1;
}template int linklist::getlength()
return p;
}template elemtype linklist::getdata(int
pos)
return ptr->next->data;
}/* 排序函式需要乙個返回值為int型的比較函式作為引數
* 公升序排列:當a>b時,令compare(a, b)的返回值大於0
* 降序排列:當a0
* 注意:當a=b時,compare(a, b)的返回值必須小於或等於0。
*/template void linklist::sort(int(*compare)(elemtype& a, elemtype& b))
ptr = t;
t = t->next;}}
}
帶表頭的單向鍊錶
帶表頭的單向鍊錶 include include struct node typedef struct node node typedef struct node link void all malloc ok link new node link creat new node link new n...
帶表頭的單迴圈鍊錶的實現
通常在迴圈鍊錶的第乙個節點前附加乙個特殊的節點來作為標記,這個節點稱為迴圈鍊錶的頭結點,頭結點的資料域為空域,或者按照需要設定。在這裡,我們將a1節點的位址設為first,頭結點僅當作特殊標記。如果不想增加頭結點,也可以實現單迴圈鍊錶。本篇的單迴圈鍊錶是根據上篇 單鏈表的實現 上稍作修改而來,有什麼...
帶表頭鍊錶插入方法
include include include 定義鍊錶節點型別 struct node header void create node hlink new node 分配節點記憶體空間函式 void create link hlink head 建立新的帶表頭鍊錶的函式 帶表頭煉表頭插函式 voi...