我的老師希望我創造這樣的鏈表,但使用索引來代替指針。所以Node
包含int data
和int index
。創建無指針鏈表,但指數
你可以將我暗示我該怎麼做?我知道如何用指針創建它,但如何在沒有它們的情況下做到這一點?儘管他提到游泳池是一個容器。
我的老師希望我創造這樣的鏈表,但使用索引來代替指針。所以Node
包含int data
和int index
。創建無指針鏈表,但指數
你可以將我暗示我該怎麼做?我知道如何用指針創建它,但如何在沒有它們的情況下做到這一點?儘管他提到游泳池是一個容器。
你的結構Node
會是這樣
struct Node {
int data;
int index; // index of the entry in the pool to the next node
}
您可以使用vector
或陣列創建池
vector<Node*> pool; // stores the pointer to next nodes
我們進入下一個節點,你可以做
Node* nextNode = pool[currNode->index];
一種可能的方法是使用一組Nodes
wh ERE每個節點存儲的(數組)索引到prev
和next
Node
。因此,你的Node
看起來是這樣的:
struct Node
{
T data;
int prev; // index of the previous Node of the list
int next; // index of the next Node of the list
}
此外,你可能會動態分配Node
陣列,實現一些簿記陣列中獲得和免費空間:例如bool
陣列存儲所述Node
陣列中的未佔用的索引,具有兩個功能,這將每一個新的Node
/索引添加或移除(它將被分段爲節點將不總是連續的)時間更新它沿着;通過從陣列的第一地址中減去Node
的地址例如:找到所述陣列中的Node
的索引。
下面是如何利用上述技術雙向鏈表的可能接口看起來像:
template <typename T> // T type Node in your case
class DList
{
T** head; // array of pointers of type Node
int first; // index of first Node
int last; // index of last Node
bool* available; // array of available indexes
int list_size; // size of list
int get_index(); // search for index with value true in bool available
void return_index(int i); // mark index as free in bool available
std::ptrdiff_t link_index(T*& l) const // get index of Node
void init(); // initialize data members
void create(); // allocate arrays: head and available
void clear(); // delete array elements
void destroy(); // delete head
public:
DList(); // call create() and init()
~DList(); // call clear() and destroy()
void push_back(T* l);
void push_front(T* l);
void insert(T*& ref, T* l); // insert l before ref
T* erase(T* l); // erase current (i.e. l) and return next
T* advance(T* l, int n); // return n-th link before or after currnet
std::size_t size() const;
int capacity() const { return list_size; }
};
你可以使用它作爲一個基準,實現你自己的東西。
template <typename T>
void DList<T>::push_back(T* l)
{
if (l == nullptr)
{
throw std::invalid_argument("Dlist::push_back()::Null pointer as argument!\n");
}
int index = get_index();
head[index] = l;
if (last != -1)
{
head[last]->next = index;
head[index]->prev = last;
}
else
{
first = index;
head[index]->prev = -1;
}
last = index;
head[index]->next = -1;
}
你在C中使用鏈表,在C++中你只需要使用'std :: map'。 – Havenard
數組並使用數組索引作爲鏈接? –
另外http://www.cplusplus.com/reference/forward_list/forward_list/ – Havenard