單向鍊錶的使用(儲存,插入,查詢)

2021-07-25 20:29:25 字數 3080 閱讀 2821

1、鏈結儲存方法

鏈結方式儲存的線性表簡稱為鍊錶(linked list)。

鍊錶的具體儲存表示為:

① 用一組任意的儲存單元來存放線性表的結點(這組儲存單元既可以是連續的,也可以是不連續的)

② 鍊錶中結點的邏輯次序和物理次序不一定相同。為了能正確表示結點間的邏輯關係,在儲存每個結點值的同時,還必須儲存指示其後繼結點的位址(或位置)資訊(稱為指標(pointer)或鏈(link))

注意:鏈式儲存是最常用的儲存方式之一,它不僅可用來表示線性表,而且可用來表示各種非線性的資料結構。

2、鍊錶的結點結構

3、頭指標head和終端結點指標域的表示

單鏈表中每個結點的儲存位址是存放在其前趨結點next域中,而開始結點無前趨,故應設頭指標head指向開始結點。

注意:鍊錶由頭指標唯一確定,單鏈表可以用頭指標的名字來命名。

【例】頭指標名是head的鍊錶可稱為表head。

終端結點無後繼,故終端結點的指標域為空,即null。

4、單鏈表的一般圖示法

5、單鏈表型別描述

│    │    指標變數    │     結點變數      │

├────┼────────────┼─────────────┤

│  定義  │在變數說明部分顯式定義  │在程式執行時,通過標準    │

│        │                        │函式malloc生成            │

├────┼────────────┼─────────────┤

│  取值  │ 非空時,存放某型別結點 │實際存放結點各域內容      │

│        │的位址                  │                          │

├────┼────────────┼─────────────┤

│操作方式│ 通過指標變數名訪問     │ 通過指標生成、訪問和釋放 │

└────┴────────────┴─────────────┘

①生成結點變數的標準函式

p=( listnode *)malloc(sizeof(listnode));

//函式malloc分配乙個型別為listnode的結點變數的空間,並將其首位址放入指標變數p中

②釋放結點變數空間的標準函式

指標變數p的值——結點位址

結點變數*p的值——結點內容

(*p).data的值——p指標所指結點的data域的值

(*p).next的值——*p後繼結點的位址

*((*p).next)——*p後繼結點

注意:① 若指標變數p的值為空(null),則它不指向任何結點。此時,若通過*p來訪問結點就意味著訪問乙個不存在的變數,從而引起程式的錯誤。

② 有關指標型別的意義和說明方式的詳細解釋。

具體方法【參見動畫演示】

注意:該方法生成的鍊錶的結點次序與輸入順序相反。

② 具體演算法實現

① 演算法思路

具體方法【參見動畫演示】

注意:⒈採用尾插法建表,生成的鍊錶中結點的次序和輸入順序一致

⒉必須增加乙個尾指標r,使其始終指向當前鍊錶的尾結點

② 具體演算法實現

2.單鏈表的查詢運算

(1)按序號查詢

① 鍊錶不是隨機訪問結構

在鍊錶中,即使知道被訪問結點的序號i,也不能像順序表中那樣直接按序號i訪問結點,而只能從鍊錶的頭指標出發,順鏈域next逐個結點往下搜尋,直至搜尋到第i個結點為止。因此,鍊錶不是隨機訪問結構。

② 查詢的思想方法

計數器j置為0後,掃瞄指標p指標從鍊錶的頭結點開始順著鏈掃瞄。當p掃瞄下乙個結點時,計數器j相應地加1。當j=i時,指標p所指的結點就是要找的第i個結點。而當p指標指為null且j≠i時,則表示找不到第i個結點。

注意:頭結點可看做是第0個結點。

③具體演算法實現

④演算法分析

(2) 按值查詢

①思想方法

listnode* locatenode (linklist head,datatype key)

③演算法分析

該演算法的執行時間亦與輸入例項中key的取值相關,其平均時間複雜度分析類似於按序號查詢,為o(n)。

附源**

#include

#include

typedef struct node

listnode;

typedef listnode * linklist;

//頭插入法

linklist creatlistf(void)

s->data=ch;

s->next=head;

head=s;//head要不斷向前移動,一直指著最前線,這樣儲存的資料與輸入的資料順序相反

ch=getchar();

}return head;

}//尾插入法

linklist creatlistr(void)

return head;

}//根據查詢第i個結點

listnode * getnodebyi(linklist head,int i)

//迴圈結束後,要不p為null,要不j=i

if(j==i)

else

return null;

}listnode * getnodebykey(linklist head,char key)

return p;//若p=null,則查詢失敗,否則p指向值為key的結點

void print(linklist head)

}int main()

單向鍊錶的查詢 openjudge

總時間限制 2ms記憶體限制 1024kb 描述建立乙個鏈式儲存的線性表,要求找出該煉表中值為x的元素有多少個?輸入輸入若干整數,以0結束。再輸入x的值 輸出 x在鍊錶中出現的次數 樣例輸入 3 2 3 3 5 8 5 3 0 3 樣例輸出 4 提示本題只有一組測試資料,不需要重複 這答題咋一看挺水...

單向鍊錶的查詢問題

題目 輸入乙個單向鍊錶。如果該鍊錶的結點數為奇數,輸出中間的結點 如果鍊錶結點數為偶數,輸出中間兩個結點前面的乙個。思考 最簡單的解法 從頭到尾遍歷一遍陣列,得到鍊錶大小n。然後再從頭走n 2次,則一共需要的時間為1.5n。優化 想起以前一道題目,用n的方法反轉乙個單向鍊錶。如果只用乙個變數head...

單向鍊錶的遍歷 查詢

單向鍊錶的建立在這裡不在贅述,詳細請看另一篇文章 單向鍊錶的建立 在本篇文章中,主要通過舉例的方式來幫大家理解單向鍊錶的基本遍歷。本篇文章中建立節點用以下表示 typdef struct node elemsn 例一 輸出單向鍊錶尾節點的值 void printtail elemsn head 傳遞...