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 ...