【資料結構】回顧表ADT

nomasp發表於2015-05-07

1.對於表的所有操作來說,都可以使用陣列來實現,而且陣列雖然是靜態分配的,但內部儲存陣列的vector類卻允許在需要時將陣列的大小增加一倍。

2.正是因為陣列的實現,使得printList以線性時間來執行,而findkth甚至是通過常數時間。最不濟的是插入和刪除了,如果位置不好,比如說在0號位置插入就需要將整個陣列的所有元素都向後移,為O(N)。正是為了避免插入和刪除的線性開銷,我們就開始使用一種叫做連結串列(Linked List)的技術。

這裡寫圖片描述

3.連結串列由許多在記憶體中相連的結點(Node)組成,而每一個結點都有表元素和該元素後續元的結點的鏈(link)。這個叫做next鏈,自然而然地,最後一個單元的next鏈指向NULL。

4.STL的全稱是“Standard Template Library”,中文名叫做“標準模板庫”。表ADT就在其中。

5.陣列就是一塊指向記憶體的指標變數,記憶體塊可以通過new[]來分配,同時也必須用delete[]來釋放,記憶體塊的大小不能改變。

6.將一個包含x的新結點通過p和p.prev指向的結點結合,指標的賦值可以按下面的方式來寫。

Node *newNode=new Node(x,p->prev,p);
p->prev->next=newNode;
p->prev=neweNode;

但它還可以得到合併:

Node *newNode=new Node(x,p->prev,p);
p->prev=p->prev->next=newNode;

然後它還可以進一步合併:

p->prev=p->prev->next=new Node(x,p->prev,p);

因此可以這樣來寫insert操作:

iterator insert(iterator itr,const Object & x)
{
    Node *p=itr.current;
    theSize++;
    return iterator(p->prev=p->prev->next=new Node(x,p->prev,p));
}   

7.同樣的,對於雙向列表的delete操作來說,會是這樣:

p->prev->next=p->next;
p->next->prev=p->prev;
delete p;

修改之後的insert函式。

iterator insert(iterator itr,const Object & x)
{
    itr.assertIsValid();
    if(itr.theList!=this)
        throw IteratorMismatchException();

    Node *p=itr.current;
    theSize++;
    return iterator(* this,p->prev=p-prev->next=new Node(x,p->prev,p));
}


歡迎大家點選左上角的“關注”或右上角的“收藏”方便以後閱讀。


為使本文得到斧正和提問,轉載請註明出處:
http://blog.csdn.net/nomasp

相關文章