鍊錶的實現(2)

2021-08-17 06:11:41 字數 3187 閱讀 2205

可用鍊錶是指可以使用鍊錶實現資料的增加、修改、刪除和查詢操作。

node類負責所有的節點資料的儲存以及節點關係的匹配,所以node類不可能單獨去使用。

範例:鍊錶的開發結構

class link

}//********************=以上為內部類********************===

private node root; //需要根節點

如果要進行新資料的增加,則應該有link類負責節點物件的產生,並且由link類維護根節

點,所有節點的關係匹配交給node類處理。

class link

public void addnode(node newnode)else

}  }

//********************=以上為內部類*************************

private node root; //需要根節點

public void add(string data)else

}}public class linkdemo

}既然每個鍊錶都有乙個root根元素,那麼每乙個鍊錶就有自己的長度,可以直接在link類

裡面設定乙個count屬性,隨後每一次資料新增完成之後可以進行資料累加。

範例:修改link類

增加乙個count屬性:

class link

//********************=以上為內部類***************====

private node root; //需要根節點

private int count=0;//儲存元素的個數

public void add(string data)else

this.count ++;//每一次儲存完資料count加1

}  public int size()

}空鍊錶判斷實際上可以通過兩種方式完成:

·第乙個:判斷root有物件(是否為null);

·第二個:判斷儲存的資料量(count);

範例:class link

}在鍊錶之中一定會儲存多個資料,那麼基本的判斷某乙個資料是否存在的方式:

以string資料為例,迴圈鍊錶中的內容,並且與要查詢的資料進行匹配(equals()),如  

果查詢到返回true,查不到返回false。

範例:修改link 類

class link

return this.root.

containsnode(data);//給node類,從根節點開始查}}

修改node 類

private class node

public void addnode(node newnode)

//第一次呼叫(link):this = link.root

//第二次呼叫(node): this = link.root.next

public boolean

containsnode(string data)elseelse}}

}本次使用的是string 資料型別,所以判斷資料使用的是equals()方法,如果是自定義物件呢

?則需要定義乙個物件比較的方法(compare())。

通過以上的**測試,鍊錶裡面儲存了多個string類的物件,在程式裡面只有陣列可以保

存多個物件,使用的鍊錶與陣列相比較的話,優勢就是沒有長度限制,所以鍊錶嚴格意義上

來講就是乙個動態物件陣列,那麼也應該具備像陣列那樣可以根據索引取得元素的功能。

由於是動態物件陣列,所以陣列中的每乙個元素的索引的內容都一定是動態生成的。

範例:在link類裡面增加乙個foot的屬性表示每乙個node元素的編號

private int foot = 0;

在每一次查詢的時候(乙個鍊錶可能查詢多次),那麼foot應該在每一次查詢時都從

頭開始。但是千萬要記住,如果有內容,或者是要查詢的索引小於個數才可以查。

public string get(int index)

this.foot =0; //表示從前向後查詢

return this.root.

getnode(index);//查詢過程交給node類

}範例:在node類裡面實現getnode()方法,內部類和外部類之間可以方便的互相訪問私有屬性

private class node

public void addnode(node newnode)

//第一次呼叫(link):this = link.root

//第二次呼叫(node): this = link.root.next

public boolean containsnode(string data)

public string

getnode(int index)else

}  }

修改資料和查詢的區別不大,查詢的時候當滿足索引值的時候,只是進行了乙個資料的返回,那麼此處只需要將資料返回變為資料的重新賦值即可。

範例:在link 類裡面增加set()方法

public void set(int index, string data)

this.foot = 0; //重新設定foot屬性的內容,作為索引出現

this.root.

setnode(index,data); //交給node類設定資料內容

}範例:在node類增加setnode()方法

public void

setnode(int index, string data)else

}對於刪除資料而言,實際上分為兩種情況:

·情況-:要刪除的節點是根節點,則root應該變為「根節點.next」,在link類裡處理。

範例:在node類裡面增加乙個removenode(),此方法專門處理非根節點的刪除

//要傳遞上乙個節點以及要刪除的資料

public void

removenode(node previous, string data)else

}範例:在link類裡面增加根節點的刪除

public void remove(string data)else

this.count --;//個數要減少

}

雙向鍊錶的實現2

這裡介紹氣泡排序在鍊錶中的實現。bubble sort for bi linked list flag 0,oreder from little to large,0 from large to little if 1 int sort lst list head,const int flag el...

實現2個有序鍊錶的合併

原題 本題要求實現乙個函式,將兩個鍊錶表示的遞增整數序列合併為乙個非遞減的整數序列。函式介面定義 list merge list l1,list l2 其中list結構定義如下 typedef struct node ptrtonode struct node typedef ptrtonode l...

實現鍊錶及相關的方法 2

思路 下面提供兩種方法,其實大同小異,但是因為鍊錶的最後乙個元素需要指向空,如果少了這個就會出現問題。所以在方法二中,遍歷的過程就將末尾指向空。方法一 將大的資料放在x的右邊,小的資料放在x的左邊 public listnode parttition int x else else else cur...