單鏈表與順序鍊錶不同,順序鍊錶在宣告時在記憶體中開闢一塊連續的儲存空間進行鍊錶資料項的儲存。所以單鏈表的項只需要儲存其資料,根據資料所在的序號進行訪問直接由鍊錶類控制,因為屋裡儲存區域連續,所以能夠很方便實現這些資料的訪問,插入和刪除。
單鏈表在記憶體中不適用連續的空間儲存,所以單鏈表的項實際儲存兩個資訊,乙個資訊為該項的資料項,另外乙個資訊為指定下一項。在訪問時,我們只需要知道單鏈表的起始項,起始項就是單鏈表中沒有被任何項指向的項,根據起始項指向的下一項一次類推,得到我們需要的煉表項,圖示如下:
從上面的單鏈表示意圖可以看到,鍊錶首項指向第二項,第二項指向第三項,最後一項不指向任何項,所以在構造單鏈表之前,我們需要首先構造單鏈表的項,這裡我們就疑問了,為什麼在順序鍊錶中不需要構造煉表項?剛才已經說了,順序鍊錶只需要儲存值本身即可,所以使用泛型類即可滿足需求,下面給出單鏈表項的類:
///
/// 單向連線節點類 /// /// public class node //建構函式 public node(t data) //建構函式 public node(nodenext) //建構函式 public node() public t data get } public nodenext set } }
煉表項的類很簡單,宣告了兩個屬性分別為data和next,分別表示煉表項的兩個儲存資訊,宣告相對應的建構函式。
下面是單鏈表項的**:
class singlylink: ilistds
private nodehead;
public nodehead
set
get
///
/// 求單鏈表長度,正確
///
///
public int getlength()
int length = 0;
nodep = head;
while (p != null)
p = p.next;
length++;
return length;
///
/// 清楚單鏈表所有項
///
public void clear()
head = null;
///
/// 判斷單鏈表是否為空
///
///
public bool isempty()
if (head == null)
return true;
else
return false;
///
/// 判斷單鏈表是否已滿,因為單鏈表不存在最大長度的限制,所以單鏈表永遠不會滿
///
///
public bool isfull()
return false;
///
/// 在單鏈表的最末尾新增新項,有以下幾種情況
/// 當鍊表為空時,只需要將新增項賦予煉表頭即可
/// 當鍊表不為空時,需要先查找到鍊錶的最末項,然後將最末項的末尾
///
///
if (head == null)
head = new node(item);
return;
nodep = head;
while (p.next != null)
p = p.next;
p.next = new node(item);
///
/// 在單鏈表指定的位置插入新項,當插入時,存在以下幾種情況
/// 當指定的位置超出單鏈表的最小長度和現有長度時,丟擲異常
/// 當在單鏈表的起始位置插入新項時,只需要將新項的next屬性設為現有的head
/// 當在單鏈表的中間位置插入新項時,需要首先獲取插入位置的前一項,將其next屬性設定為新項,然後將新項next屬性設定為中間斷開的下一項
///
///
///
public void insert(t item, int index)
if (index <= 0 || index > getlength() + 1)
throw new exception("指定位置不在鍊錶長度內");
if (index == 1)
if (this.isempty())
this.head = new node(item);
return;
nodenode = this.head;
this.head = new node(item);
this.head.next = node;
return;
if (index == getlength() + 1)
return;
nodetempitem = new node(item);
nodetemplast = this.head;
nodetempnext = default(node);
for (int i = 0; i < index - 2; i++)
templast = templast.next;
tempnext = templast.next;
templast.next = tempitem;
tempitem.next = tempnext;
///
/// 刪除列表中指定順序的項,可能有以下幾種情況
/// 順序的序列號超出鍊錶的範圍,丟擲異常
/// 順序的序號為列表首項,只需要將第二項設定為首相即可
/// 順序的序號為列表尾箱,只需要將倒數第二項後的next屬性設定為空
/// 順序的序號在列表中時,需要刪除該項,然後設定前項的next屬性為下一項
///
///
public void delete(int index)
if (index <= 0 || index > getlength())
throw new exception("指定位置不在鍊錶長度內");
if (index == 1)
this.head = head.next;
return;
if (index == getlength())
nodenode = this.head;
for (int i = 0; i < index - 2; i++)
node = node.next;
node.next = null;
return;
nodetempitem = head;
nodetempnext = default(node);
for (int i = 0; i < index - 2; i++)
tempitem = tempitem.next;
tempnext = tempitem.next;
tempnext = tempnext.next;
tempitem.next = tempnext;
///
/// 根據使用者輸入的列表項序號獲取列表項,可能遇到以下情況
/// 當輸入序號超出列表索引範圍時,丟擲異常
/// 當輸入序號為首項時,返回head
/// 當輸入序號為其他時,查詢對應的項返回
///
///
///
public t getitem(int index)
if (index < 0 || index > getlength() - 1)
throw new exception("指定位置不在鍊錶長度內");
if (index == 0)
return this.head.data;
nodetempitem = head;
for (int i = 0; i < index - 1; i++)
tempitem = tempitem.next;
return tempitem.next.data;
///
/// 根據使用者輸入的值返回該值在鍊錶的位置
/// 有兩種情況,當鍊表為空或鍊錶不為空
/// 順序查詢鍊錶的項,當找到匹配項時,返回,不再查詢後面的項是否仍有匹配
/// 當搜尋完整個鍊錶仍沒有找到值時,返回-1。表示沒有找到任何值
///
///
///
public int locate(t value)
if (isempty())
throw new exception("鍊錶為空,無法查詢");
for (int i = 0; i < getlength(); i++)
if (getitem(i).equals(value))
return i;
return -1;
資料結構 實驗2 單鏈表
問題描述 設計乙個單鏈表操作演示程式。基本要求 設計實現乙個帶頭結點的單鏈表的操作演示程式,提供乙個使用者介面,可演 示的基本功能包括 1 初始化單鏈表 2 輸入並建立單鏈表 頭插入法 尾插入法均可 3 輸出單鏈表中的元素 4 在單鏈表指定位置插入元素 5 在單鏈表指定元素之前插入元素 6 刪除單鏈...
資料結構單鏈表
初學資料結構,貼段自己編寫的單鏈表程式,希望自己能夠一直以強大的學習熱情持續下去!自勉!2012年3月30日 於大連 include using namespace std typedef struct node linklist,node linklist makelist int n void ...
資料結構 單鏈表
今天浪費了好多時間,也許是心裡想著明天的考試吧 可自己也知道這次的考試,自己畢竟過不了了,只好等到今年11月份,想想那時自己已經大三了 還有那麼多時間嗎!很懊惱今天不知怎麼回事,感嘆環境真的可以影響乙個人,真的可以 把今天的學習筆記寫下來,沒有進行好好的整理,這回單鏈表的功能較多,操作比較散,最後乙...