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