- 1、本文档共10页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
C与C++语言介绍
第三章 鏈結串列
串列及鏈結串列
串列 是許多項目有順序的排列,可以用陣列結構來儲存串列。根據元素在陣列中的位置可以判斷元素之間的順序。
用陣列結構來儲存串列的優缺點是:
優點: 只要標明元素註標,就能很快讀寫此元素,亦即陣列的隨機存取(random access) 的效率高。?
缺點:插入 (insert) 和刪除 (delete) 元素的動作,需要時間複雜度為 O(n)。這是因為陣列元素間的實體位置(physical location)是連續的,因此元素的插入和刪除必須進行資料的搬移,以便維持新的次序。如果必須時常進行插入和刪除運算,代價將會相當大。
鏈結串列 的元素之間不必實體連續,只要有邏輯上的順序存在即可,鏈結 (link)就是用來維持這順序的工具 。鏈結串列的優點是可以輕易的插入新節點,以及刪除舊節點,不需搬移資料,只要改變鏈結。
class ListNode
{
object data;
ListNode next;
}
public interface List
{
boolean isEmpty();
void makeEmpty();
}
鏈結串列運算方法 鏈結串列的運算方法不外乎是對資料的取得、刪除、插入等動作。但有時我們需要額外的方法來檢驗鏈結串列,這些都可以寫在Java的interface中。
public interface ListItr
{
void insert(Object x) throws ItemNotFound;
boolean find(Object x);
void remove(Object x) throws ItemNotFound;
boolean isInList();
Object retrieve();
void zeroth();
void first();
void advance();
}
陣列結構實作鏈結串列
插入節點
boolean ListInsert(ListNode table[], String d, unsigned i)
{
int EmptyNode:
EmptyNode = GetFreeNode(table); /* 找空節點 */
If( EmptyNode ==0) /* 已經沒有空節點 */
return false;
table[EmptyNode].data = d;
table[EmptyNode].next=table[i].next;
table[i].next=EmptyNode;
return TRUE;
}
int GetFreeNode(ListNode arr[])
{
int length = arr.length;
int i=0;
while(i=length)
{
if(arr[i].next==-1)
return I;
}
return 0;
}
3-2-2 刪除節點
void ListDelete(ListNode table[], int i)
{
int Prenode;
Prenode = GetPreNode(table, i);
Table[Prenode].next=table[i].next;
Table[i].next=-1;
}
int GetPreNode(ListNode arr[], int i)
{
int prenode=0, node=arr[prenode].next;
while(node != i)
{
prenode=node;
node=arr[node].next;
}
return (prenode);
}
動態配置節點實作鏈結串列
利用陣列來實作鏈結串列會有浪費空間的情形,為了解決這問題,我們可以利用動態配置記憶體的方式來實做鏈結串列。
插入新節點
public void insert(Object x) throws ItemNotFound
{
if(current == null)
throw new ItemNotFound(“Insertion error”);
ListNode newNode = new ListNode(x, current.next);
Current = current.next = newNode;
}
刪除節點
public void remove( Object x ) throws ItemNotFound
{
ListNode itr = theList.header;
while( itr.next != null !itr.next.element.equals(x))
itr = it
文档评论(0)