資料儲存共有兩種形式,一種是連續的,比如說陣列,儲存時是連續的;還有一種是離散的,這就是鍊錶。
鍊錶由一系列結點(鍊錶中每乙個元素稱為結點)組成,結點可以在執行時動態生成。每個結點包括兩個部分:乙個是儲存
資料元素
的資料域,另乙個是儲存下乙個結點位址的引用域。
鍊錶又分為單鏈表,雙鏈表和迴圈鍊錶。
我們先來看單鏈表,圖示為:
由圖我們可以看出結點左端的方格是資料域,用來儲存資料,而右端是引用域,用來儲存下乙個節點的位址,便於我們方便的讀取到。單鏈表的引用域是單一指向的,指向他的下乙個結點。第乙個結點稱之為根節點,最後乙個節點稱之為尾結點。
迴圈鍊錶是與單鏈表一樣,是一種鏈式的儲存結構,所不同的是,迴圈鍊錶的尾結點的引用域是指向該迴圈鍊錶的根節點,從而構成乙個環形的鏈。
而雙鏈表就比單鏈表方便很多,因為單鏈表指向是單向的,而雙鏈表有兩個引用域,乙個指向前乙個結點,另乙個指向下乙個結點。當然根節點只有指向下乙個節點的引用域,而尾結點只有指向前乙個的引用域。這樣的話查詢資料時就有兩種方法,一種是從前面開始查詢,一種就是從後面開始查詢。
下面附上我寫的雙鏈表的**:
結點類:
public class node
public node getprior()
public void setprior(node prior)
public object getobj()
public void setobj(object obj)
public node getnext()
public void setnext(node next)
}
鍊錶類:
public class linkedlist else
size++;
} /**
* method of remove node
* * @param node
*/public object removenode(int index) else
if (index == size - 1) else
} size--;
return removenode;
} /**
* 按正序查詢指定索引位置的值
* * @param index
* @return
*/public object get(int index) else
return node.getobj();
} }/**
* 按倒序查詢指定索引位置的值
* * @param index
* @return
*/public object getreverse(int index) else
return node.getobj();
} }/**
* 返回鍊錶大小的方法
* * @return
*/public int size()
/*** 得到指定索引位置節點的方法
* * @param index
* @return
*/public node getnode(int index) else
return node;
} }}
當然,鍊錶的排序也和陣列不一樣,鍊錶排序時只需改變引用域的指向,但是涉及根節點和尾結點時,要變更根結點和尾結點(將新結點設定為根結點或尾結點)。下面附上雙鏈表的直接插入排序:
/**
* 建立insertsort類 內建直接插入排鍊表順序的方法 按正序排列
* @author administrator
* */
public class insertsort else if (j == list.size() - 1) else
}} }
}
備註:來自於360百科 鍊錶的使用
一 鍊錶的概念 在陣列列表的文章中我們已經提到了鍊錶,今天來講一下鍊錶。首先再回顧一下鍊錶列表與陣列列表的關係。鍊錶列表 鍊錶是一塊不連續的動態空間,長度可變 鍊錶需要按順序檢索節點,效率低 鍊錶的優點是可以快速插入和刪除節點,大小動態分配,長度不固定。鍊錶不存在越界問題。陣列列表 陣列是一塊連續的...
鍊錶的使用
定義鍊錶 定義節點型別struct node 給鍊錶節點分配記憶體空間 建立鍊錶node create int array return head 查詢節點int search node head,int x return count 插入節點void insert node l,int posit...
鍊錶的基本使用一(構建鍊錶)
因為有不少朋友向我詢問鍊錶的一些事情,他們都在問鍊錶指標啥的寫起來都好麻煩的,有啥用呢。作為乙隻萌新就 些我的一些感覺吧 我一開始的時候也是比較排斥鍊錶的,因為這玩意一開始接觸真的感到太麻煩了,它做到的很多東西,陣列也都可以,為啥還要用這麼麻煩的方式呢。後來上企業課的時候,開始模擬寫軟體,就是乙個比...