1.單鏈表的遍歷與優化
2.靜態單鏈表的實現
3.小結
問題:當前單鏈表的遍歷方法:
遺憾的事實:
新的需求:
設計思路 ( 游標 ):
提供一組遍歷相關的函式,以線性的時間複雜度遍歷鍊錶。
遍歷函式原型設計:
單鏈表的遍歷:
改進linklist.h
#ifndef linklist_h
#define linklist_h
#include "list.h"
#include "exception.h"
namespace stlib
; mutable struct : public object
m_header;
int m_length;
int m_step;
node* m_current;
node* position(int i) const
return ret;
}public:
linklist()
bool insert(const t& e)
bool insert(int i, const t& e)
else
}return ret;
}bool remove(int i)
return ret;
}bool set(int i, const t& e)
return ret;
}t get(int i) const
else
return ret;
}bool get(int i, t& e) const
return ret;
}int find(const t& e) const
else
}return ret;
}int length() const
void clear()
m_length = 0;
}bool move(int i, int step = 1)
return ret;
}bool end()
t current()
else
}bool next()
return (i == m_step);
}~linklist()
};}#endif // linklist_h
main.cpp測試
#include #include "linklist.h"
using namespace std;
using namespace stlib;
int main()
for(list.move(0); !list.end(); list.next())
return 0;
}
執行結果為:
432
10
單鏈表內部的一次封裝:
內部的封裝:
改進linklist.h
#ifndef linklist_h
#define linklist_h
#include "list.h"
#include "exception.h"
namespace stlib
; mutable struct : public object
m_header;
int m_length;
int m_step;
node* m_current;
node* position(int i) const
return ret;
}virtual node* create()
virtual void destroy(node* pn)
public:
linklist()
bool insert(const t& e)
bool insert(int i, const t& e)
else
}return ret;
}bool remove(int i)
return ret;
}bool set(int i, const t& e)
return ret;
}t get(int i) const
else
return ret;
}bool get(int i, t& e) const
return ret;
}int find(const t& e) const
else
}return ret;
}int length() const
void clear()
m_length = 0;
}bool move(int i, int step = 1)
return ret;
}bool end()
t current()
else
}bool next()
return (i == m_step);
}~linklist()
};}#endif // linklist_h
問題:
單鏈表的乙個缺陷:
新的線性表
靜態單鏈表的繼承層次結構:
靜態單鏈表的實現思路:
(在stlib中實現staticlinklist.h):
#ifndef staticlinklist_h
#define staticlinklist_h
#include "linklist.h"
namespace stlib
};unsigned char m_space[sizeof(snode) * n];
int m_used[n];
node* create()
}return ret;
}void destroy(node *pn)}}
public:
staticlinklist()
for(list.move(0); !list.end(); list.next())
return 0;
}
執行結果為:
432
10
q & a: 資料結構 靜態單鏈表
問乙個問題,如果需要頻繁且長時間的增刪資料元素應該選擇哪種線性表?首先看到大量增刪肯定會想到單鏈表,因為它不需要移動結點,效率會高不少,但是單鏈表真的是理想的選擇嗎?如果需要的資料最大個數是固定的呢?這就是需要實現靜態單鏈表的原因之一。當我們使用單鏈表長時間並且頻繁的增刪資料元素會發生什麼?可能的結...
資料結構 單鏈表實現
線性表的鏈式儲存結構的特點是用一組任意的儲存單元儲存線性表的資料元素 這組儲存單元可以是連續的,也可以是不連續的 因此,為了表示每個資料元素與其直接後繼資料元素之間的邏輯關係,對資料元素來說,除了儲存其本身的資訊之外,還需儲存乙個指示其直接後繼的資訊 即直接後繼的儲存位置 這兩部分資訊組成資料元素的...
資料結構 單鏈表實現
在鏈式儲存中,節點之間的儲存單元位址可能是不連續的。鏈式儲存中每個結點都包含兩部分 儲存元素本身的資料域和儲存結點位址的指標域。結點中的指標指向的是下乙個結點,也就是儲存的下乙個結點的位址。1.建立鍊錶 在建立鍊錶時,頭結點不儲存資料,但可以儲存鍊錶的資訊。struct header 儲存資料的結點...