單鏈錶即每個節點都存在資料域和指標域(特殊節點除外),每個節點都乙個直接前驅節點和直接後繼節點(頭節點無前驅,尾節點無後繼),簡單來說就是上乙個節點的指標域中存放了下乙個節點的位址,因此可以實現層層節點依次查詢,時間複雜度為o(n),這也就是相對順序表而言的缺點,但是對於頻繁的插入和刪除節點卻是相對於順序表的優點,除了首次查詢為o(n)外,插入和刪除都是o(1);
由於順序表儲存單元和長度都是固定的所以可以直接定位到需要查詢的元素查詢時間複雜的為o(1),刪除和插入會導致其它單元的位置移動所以時間複雜度為o(n)。
接下來介紹下單鏈表中簡單的基本操作實現:
//宣告乙個單鏈表結構體
typedef struct lnode lnode,*linklist; //宣告2個結構體別名(結構體別名和結構體指標別名),方便在外部直接通過別名定義該結構體型別的變數
頭插法建立單鏈表:
/*
function:頭插法建立單鏈表即將節點依次插入到head節點之後
*/linklist headinsertlist(linklist &l)
return l;
}
尾插法建立單鏈表:
/*
尾插法建立單鏈表即將節點依次插入到鍊錶的尾部
*/linklist endinsertlist(linklist &l)
r->next = null; //清空尾節點的指標域
return l;
}
按序號查詢節點:
/*
按序號查詢法
*///*getelem表示返回節點指標型別,不加*則表示返回節點
lnode *getelembyindex(linklist l, int i)
//遍歷查詢:下乙個節點存在且還未到達查詢點
while (p && jnext;
j++;
}}
按值查詢表節點:
/*
按值查詢表節點
e:需要查詢的值,泛型表示法(偽**):elemetntype e,這裡簡單表示為int
*/lnode *getelembyvalue(linklist l, int e)
return q;
}
在指定的位置i處插入節點:
/*
function:插入節點,在指定的位置i處插入節點
i:需要插入的位置
e:需要插入的節點
*/linklist insertatindex(linklist &l, int i, lnode *e)
lnode *p = l->next;//獲取頭節點
int j = 1;
//查詢需要插入節點的前驅節點
while (p != null && j < i-1)
e->next = p->next;
p->next = e;
}
刪除指定的節點:
/*
刪除指定的節點
i:需要刪除的節點位置
*/lnode *deletelnode(linklist &l,int i)
if (p == null)
q = p->next;
p->next = q->next;
free(q);//釋放刪除節點的空間
return q;
}
求鍊錶長度:
/*
求鍊錶長度即依次遍歷累加求和
*/int getlength(linklist &l)
return j;
}
以上為線性表鍊錶中單鏈表的基本操作。
資料結構03 鍊錶之單鏈表
鍊錶帶頭結點和不帶頭結點的區別?完成單鏈表的以下基本操作 完整 鍊錶的結構非常多樣,以下情況組合起來就有8種鍊錶結構 單向 雙向 帶頭 不帶頭 迴圈 非迴圈 鍊錶的節點 typedef struct slistnode node,pnode 鍊錶的結構,給乙個頭指標儲存鍊錶第乙個節點的位址 type...
資料結構 鍊錶1(單鏈表)
資料結構 單鏈表 單鏈表的定義 單鏈表是用一組任意的儲存單元存放線性表的元素,這組儲存單元可以連續也可以不連續,甚至可以零散分布在記憶體中的任意位置。每個儲存單元在儲存資料元素的同時,還必須儲存其後記元素的位址資訊,這個位址資訊稱為指標。這兩部分組成了資料元素的儲存映像,稱為結點。結點node分為資...
資料結構之鍊錶(一) 單鏈表實現
在資料結構中,鍊錶是基本乙個的資料結構,所以我們要能夠實現乙個簡單的單鏈表以及對鍊錶的基本操作要十分熟悉,才能在筆試或者面試的時候更有把握!如上圖所示的是乙個單鏈表的儲存原理圖,head為頭節點。而每個節點中都有乙個next引用,指向下乙個節點,就這樣一節一節往下面記錄,直到最後乙個節點,最後乙個節...