C++ 實(shí)現(xiàn)靜態(tài)單鏈表的實(shí)例
C++ 實(shí)現(xiàn)靜態(tài)單鏈表的實(shí)例
利用數(shù)組實(shí)現(xiàn)的靜態(tài)單鏈表,與嚴(yán)蔚敏書(shū)實(shí)現(xiàn)略有不同,不另設(shè)回收空間。有任何BUG或錯(cuò)誤,希望各位朋友多多反饋~~感激不盡
/* Author : Moyiii
* Mail: lc09@vip.qq.com
* 靜態(tài)鏈表實(shí)現(xiàn),僅作學(xué)習(xí)之用,當(dāng)然如果
* 你想拿去用,隨你好啦。
*/
#include <iostream>
using namespace std;
#define MAX_LIST_SIZE 100
class Node
{
public:
int data;
int cur;
};
class SLinkList
{
public:
SLinkList();
//和普通的線(xiàn)性鏈表區(qū)別不是很大。除了兩個(gè)分配
//和回收節(jié)點(diǎn)空間的函數(shù),具體算法請(qǐng)參考課本或
//網(wǎng)絡(luò)資料
int newNode();
bool deleteNode(int pos);
bool insertElem(int pos, int elem);
bool deleteElem(int pos);
int& getElem(int pos);
int getLength();
bool isEmpty();
void print();
void clear();
private:
int head;//這個(gè)可以不要,默認(rèn)等于0
int space;
int length;
Node *elems;
};
SLinkList :: SLinkList()
{
// 0號(hào)位置為頭幾點(diǎn),不可以更改,初始指向自己
// 從1~MAXLENGTH為可分配節(jié)點(diǎn),最初由space管理
elems = new Node[MAX_LIST_SIZE];
if(!elems)
{
cout << "Malloc failed!" << endl;
}
head = space = length = 0;
for(int i = 0; i < MAX_LIST_SIZE; ++i)
{
elems[i].data = i;
elems[i].cur = i + 1;
}
elems[MAX_LIST_SIZE - 1].cur = 0;
elems[0].cur = 0;
space = 1;
}
//從space指向的備用節(jié)點(diǎn)鏈表中取下一個(gè)節(jié)點(diǎn)
int SLinkList :: newNode()
{
if(space == 0)
{
cout << "Space is full!" << endl;
return 0;
}
int pos = space;
space = elems[space].cur;
elems[pos].cur = 0;
return pos;
}
//回收節(jié)點(diǎn)空間
bool SLinkList :: deleteNode(int pos)
{
if(pos == 0)
{
cout << "Free space Error!" << endl;
return false;
}
elems[pos].cur = space;
space = pos;
return true;
}
//插入節(jié)點(diǎn),思路類(lèi)似,找到被刪除節(jié)點(diǎn)的前一個(gè)節(jié)點(diǎn)
//然后更改指向
bool SLinkList :: insertElem(int pos, int elem)
{
if(length == MAX_LIST_SIZE)
{
cout << "Space is Full" << endl;
return false;
}
if(pos < 1 || pos > length + 1)
{
cout << "Insert Over Bound" << endl;
return false;
}
int index = head;
for(int i = 1; i <= pos - 1; ++i)
{
index = elems[index].cur;
}
int node = newNode();
if(node == 0)
{
cout << "Space malloc failed" << endl;
return false;
}
elems[node].data = elem;
elems[node].cur = elems[index].cur;
elems[index].cur = node;
length++;
return true;
}
//一回事,注意把刪除的節(jié)點(diǎn)回收給space
bool SLinkList :: deleteElem(int pos)
{
if(pos < 1 || pos > length)
{
cout << "Delete Node over Bound!" << endl;
return false;
}
int index = head;
for(int i = 1; i <= pos - 1; ++i)
{
index = elems[index].cur;
}
int node = elems[index].cur;
elems[index].cur = elems[node].cur;
deleteNode(node);
length--;
return true;
}
void SLinkList :: print()
{
int index = elems[head].cur;
while(index != 0)
{
cout << elems[index].data << " ";
index = elems[index].cur;
}
cout << endl;
return;
}
int SLinkList :: getLength()
{
return length;
}
bool SLinkList :: isEmpty()
{
if(length == 0)
{
return true;
}
else
{
return false;
}
}
int& SLinkList :: getElem(int pos)
{
int index = head;
for(int i = 1; i <= pos; ++i)
{
index = elems[index].cur;
}
return elems[index].data;
}
void SLinkList :: clear()
{
for(int i = 0; i < MAX_LIST_SIZE; ++i)
{
elems[i].data = i;
elems[i].cur = i + 1;
}
elems[MAX_LIST_SIZE - 1].cur = 0;
elems[0].cur = 0;
space = 1;
}
int main()
{
//測(cè)試數(shù)據(jù),測(cè)試插入刪除空間是否溢出
SLinkList myList;
for(int i = 1; i <= 105; ++i)
{
myList.insertElem(1,i);
}
//myList.print();
for(int i = 1; i <= 105; ++i)
{
myList.deleteElem(1);
}
//myList.print();
//普通測(cè)試
for(int i = 1; i <= 10; ++i)
{
myList.insertElem(1,i);
}
myList.print();
cout << "Length= " << myList.getLength() <<endl;
myList.deleteElem(5);
myList.print();
cout << "Length= " << myList.getLength() <<endl;
cout << myList.isEmpty() << endl;
int &elem = myList.getElem(3);
elem = 99;
myList.print();
myList.clear();
myList.print();
return 0;
}
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
相關(guān)文章
C++11的future和promise、parkged_task使用
這篇文章主要介紹了C++11的future和promise、parkged_task使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04
C語(yǔ)言編程銀行ATM存取款系統(tǒng)實(shí)現(xiàn)源碼
這篇文章主要為大家介紹了C語(yǔ)言編程銀行ATM存取款系統(tǒng)實(shí)現(xiàn)的源碼示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2021-11-11
linux下C語(yǔ)言中的mkdir函數(shù)與rmdir函數(shù)
以下是對(duì)C語(yǔ)言中的mkdir函數(shù)與rmdir函數(shù)進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過(guò)來(lái)參考下2013-08-08
QT結(jié)合百度Ai實(shí)現(xiàn)車(chē)牌識(shí)別
當(dāng)下的人工智能勢(shì)頭很盛,本文主要介紹了QT結(jié)合百度Ai實(shí)現(xiàn)車(chē)牌識(shí)別,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-03-03
詳解C語(yǔ)言中strcpy函數(shù)與memcpy函數(shù)的區(qū)別與實(shí)現(xiàn)
這篇文章主要介紹了C語(yǔ)言中字符串拷貝函數(shù)(strcpy)與內(nèi)存拷貝函數(shù)(memcpy)的不同及內(nèi)存拷貝函數(shù)的模擬實(shí)現(xiàn),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2022-12-12
C語(yǔ)言?模擬實(shí)現(xiàn)strlen函數(shù)詳解
在 C 語(yǔ)言 中我們要獲取 字符串 的長(zhǎng)度,可以使用strlen 函數(shù),strlen 函數(shù)計(jì)算字符串的長(zhǎng)度時(shí),直到空結(jié)束字符,但不包括空結(jié)束字符,因?yàn)?nbsp;strlen 函數(shù)時(shí)不包含最后的結(jié)束字符的,因此一般使用 strlen函數(shù)計(jì)算的字符串的長(zhǎng)度會(huì)比使用 sizeof 計(jì)算的字符串的字節(jié)數(shù)要小2022-04-04

