線性表之離散儲存 鍊錶

2021-08-13 02:36:00 字數 3255 閱讀 7964

1.什麼是鍊錶?

鍊錶和陣列都是線性表的分支.邏輯上他們都是相連的。但是在物理上面鍊錶和陣列相反,鍊錶具有以下四個性質:

(1)n個節點離散分配

(2)節點彼此通過指標相連

(3)每乙個節點只有乙個前驅節點和乙個後驅節點

(4)首節點沒有前驅節點 尾節點沒有後續節點

2.鍊錶的專業術語?

首節點:第乙個有效節點(要有資料域和指標域)

尾節點:最後乙個有效節點

頭結點:第乙個有效節點之前的那個節點

頭結點並不存放有效資料(資料域)

它只有指標域,指向首節點

加頭結點就是為了方便對鍊錶的操作

頭指標:指向頭結點的指標變數

尾指標:指向尾節點的指標變數

注意:和陣列一樣,我們確定乙個陣列只需要知道首節點的位址,陣列的有效長度,資料最大長度.那麼確定乙個鍊錶需要幾個引數呢?

答:只需要乙個引數,頭指標,知道頭指標可以很快知道下面各個節點的資訊

3.鍊錶的分類

鍊錶可以分為四類:

單鏈表:只有乙個指標域,它是指向下乙個節點

雙鏈表:乙個節點有兩個指標域,分別指向前後兩個節點元素

迴圈鍊錶:節點與節點之間形成乙個環狀,可以找到任意乙個節點

非迴圈鍊錶:就是普通的鍊錶(可雙可單)

4.鍊錶的演算法操作

pnode createnodelist(int len);//初始化鍊錶(給鍊錶分配len個長度的記憶體空間)

void shownodelist(pnode phead);//顯示鍊錶的基本資訊

bool is_empty(pnode phead);//判斷鍊錶是否為空

int nodelist_length(pnode phead);//獲得鍊錶的長度

bool insert_nodelist(pnode phead,int pos,int val);//在鍊錶指定位置(pos>=1)插入值(val)

bool delete_nodelist(pnode phead,int pos);//刪除指定位置的數值

bool update_nodelist(pnode phead,int pos,int val);//更改指定位置的數值為val

node get(pnode phead,int pos);//獲得指定位置的數值

void sort_nodelist(pnode phead);//公升序排序

1)初始化鍊錶,先要動態分配len個長度的記憶體空間給頭指標(phead),然後判斷空間是否分配正確,如果正確的話,那麼這個頭指標也代表尾指標(因為開始只有乙個節點)。接著每迴圈一次建立乙個新的節點(pnew),將其掛在尾指標(ptail)後面,如此一來,鍊錶初始化完畢.

//初始化鍊錶

pnode createnodelist(int len)

ptail = phead;

ptail->pnext=null;

for(i=0;idata=val;

ptail->pnext=pnew;

pnew->pnext=null;

ptail=pnew;

} return phead;

}

2)輸出鍊錶的基本資訊,是通過while迴圈來判斷的,只要是p->pnext不為空,那麼就說明整個鍊錶有節點存在,便輸出p->data.

//輸出鍊錶的值

void shownodelist(pnode phead)

printf("\n");

}}

3)判斷鍊錶是否為空,比較簡單,只需要判斷頭指標phead->pnext是否為空,也就是頭指標後面是否有節點就可以了.

//判斷鍊錶為不為空

bool is_empty(pnode phead)

4)獲得鍊錶的長度,先定義乙個中間變數num,然後通過while迴圈判斷p->pnext是否為空,不為空就加一,直到不滿足迴圈條件就說明鍊錶已經到頭了,長度因此獲得.

int nodelist_length(pnode phead)

return num;

}

5)往鍊錶指定位置插入乙個數值,這個演算法相對而言比較麻煩。因為煉表不像陣列那樣,可以很快的定位插入的位置,所以鍊錶的插入演算法首先要找到插入位置的前乙個節點,然後自己要新建乙個pnew新節點用來存放想要插入的值,接著將pnew與前乙個節點相互連線,pnew與插入位置後乙個節點再連線一下,表示插入成功.基本思想就是這樣.

//往煉表中插入乙個元素 

bool insert_nodelist(pnode phead,int pos,int val)

pnew=(pnode)malloc(sizeof(node));

ptemp = p->pnext;

pnew->data=val;

p->pnext=pnew;

pnew->pnext=ptemp;

return true;

}

6)鍊錶的刪除節點演算法

bool delete_nodelist(pnode phead,int pos)

// 1 2 3 4 5 6 pos=3;

while(p!=null&&ipnext; //此時的p是要刪除的數的前乙個

} ptemp = p->pnext;

p->pnext = p->pnext->pnext;

free(ptemp);

return true;

}

7)鍊錶的更改節點演算法

bool update_nodelist(pnode phead,int pos,int val)

while(p!=null&&ipnext;

} p->data=val;

return true;

}

8)獲取指定位置的資料(返回節點元素)

node get(pnode phead,int pos)

return *p;

}

9)鍊錶排序演算法

void sort_nodelist(pnode phead)

}}}

線性表之鍊錶

鏈式的線性表適用於經常進行刪除,插入操作的工作,如 訂票系統。鍊錶是用乙個乙個的節點連線起來的表,在物理上不是連續的,在邏輯上是連續的。通過節點間的指標指向來表示節點間的關係。所以在進行鍊錶操作之前,要先定義乙個節點結構。節點結構包含兩個東西 資料域,指標域。資料域就是用來存放資料的,指標域是用來表...

線性表之鍊錶

1,為什麼要使用鍊錶 1,順序表的長度是固定的,如果超出分配的長度就會造成溢位,如果存放的資料太少則會造成空間浪費。2,在插入元素和刪除元素時 尤其不在尾部時 會移動大量的元素,造成效能和效率低下。基於以上問題,使用鍊錶可以很好地避免順序表中出現的問題。這也是我們要使用鍊錶的原因。2,鍊錶的儲存結構...

線性表之鍊錶

1.初始化 void initlist list plist assert plist null if plist null plist data 不使用 plist next null 2.頭插 bool insert head list plist,int val 時間複雜度為o 1 node ...