线性表----链式表
定義
線性表的鏈?zhǔn)酱鎯?chǔ)又稱單鏈表,它是指通過(guò)任意的存儲(chǔ)單元來(lái)存儲(chǔ)線性表的數(shù)據(jù)。注意此時(shí)的數(shù)據(jù)在物理地址上不在連續(xù),內(nèi)存是動(dòng)態(tài)分配的,而且數(shù)據(jù)是存放在結(jié)點(diǎn)中,結(jié)點(diǎn)組成鏈表,每個(gè)節(jié)點(diǎn)分為數(shù)據(jù)域和指針域,所以我們?cè)诙x的時(shí)候,數(shù)據(jù)域來(lái)存放數(shù)據(jù),指針域存放后面結(jié)點(diǎn)的地址(因?yàn)榈刂凡贿B續(xù)。必須有一個(gè)變量來(lái)知道下一個(gè)結(jié)點(diǎn)在哪里)
代碼描述:
特點(diǎn)
- 可以解決順序表需要大量連續(xù)存儲(chǔ)空間的缺點(diǎn)
- 單鏈表有指針域,我們只要存儲(chǔ)數(shù)據(jù),現(xiàn)在又存儲(chǔ)了個(gè)指針,浪費(fèi)了內(nèi)存
- 知道第i個(gè)位置,就知道后面所有的結(jié)點(diǎn)內(nèi)容了,但不能知道前面的結(jié)點(diǎn)
基本操作
再說(shuō)基本操作之前,我們先來(lái)了解頭指針和頭結(jié)點(diǎn)
- 頭指針:標(biāo)識(shí)一個(gè)單鏈表
- 頭結(jié)點(diǎn):第一個(gè)結(jié)點(diǎn)之前附加的一個(gè)結(jié)點(diǎn),可有可無(wú)。頭結(jié)點(diǎn)的數(shù)據(jù)域可以不設(shè)置任何信息,指針域指向第一個(gè)元素結(jié)點(diǎn),就是數(shù)據(jù)域有存放我們要的數(shù)據(jù)的結(jié)點(diǎn)
- 區(qū)別:頭指針就是鏈表的名字,指向第一個(gè)結(jié)點(diǎn),這個(gè)理解的時(shí)候,可以聯(lián)想數(shù)組,數(shù)組名就是頭指針。如果有頭結(jié)點(diǎn),假如數(shù)組名叫a,a[1]就是頭結(jié)點(diǎn),只是這個(gè)里面不存放數(shù)據(jù),頭指針指向頭結(jié)點(diǎn),頭指針的值就是頭結(jié)點(diǎn)的首地址,,頭結(jié)點(diǎn)的指針域的值是存放第一個(gè)數(shù)據(jù)的首地址
1、建立單鏈表:
1.1頭插法
假如現(xiàn)在鏈表只有一個(gè)數(shù)據(jù)是1,按照頭插法在插入數(shù)據(jù)2,那么現(xiàn)在的數(shù)據(jù)是2,1,第一個(gè)數(shù)據(jù)是2,這就是頭插法
我們知道頭結(jié)點(diǎn)L是第一個(gè)結(jié)點(diǎn),里面不存放數(shù)據(jù),所以我們?cè)诓迦霐?shù)據(jù)s時(shí),只需將頭結(jié)點(diǎn)L的指針域的值賦值給新插入數(shù)據(jù)S的指針,這樣新插入的數(shù)據(jù)S就指向頭指針L指向的結(jié)點(diǎn),現(xiàn)在新插入的結(jié)點(diǎn)s和頭結(jié)點(diǎn)L都指向了一個(gè)結(jié)點(diǎn),相當(dāng)于兩個(gè)頭結(jié)點(diǎn)了,但頭結(jié)點(diǎn)只能有一個(gè),所以我們的L還要指向S,始終保證L都是第一個(gè)節(jié)點(diǎn),s就是第一個(gè)帶有我們存放數(shù)據(jù)的結(jié)點(diǎn)
1.2 尾插法
/* 尾插法:在尾部插入數(shù)據(jù) */ LinkList List_TailInsert(LinkList& L) {int x;L = (LinkList)malloc(sizeof(LNode));LNode* s, * r = L; //r為表尾指針scanf("%d", &x);while (x != 9999) //輸入9999表示結(jié)束{s = (LNode*)malloc(sizeof(LNode));s->data = x;r->next = s;r = s;scanf("%d", &x);}r->next = NULL;return L; }此時(shí)多了個(gè)r指針,r始終表示最后一個(gè)結(jié)點(diǎn),它的值是最后一個(gè)結(jié)點(diǎn)的首地址,我們插入一個(gè)新結(jié)點(diǎn)s時(shí),尾插法要把s放到數(shù)據(jù)最后,沒(méi)有插入s前,r表示最后一個(gè)結(jié)點(diǎn),所以讓r的指針域指向s,r現(xiàn)在是倒數(shù)第二個(gè)結(jié)點(diǎn),但r始終表示最后一個(gè)結(jié)點(diǎn),所以要把r指向s
1.3 尾插法和頭插法
- 尾插法生成的鏈表結(jié)點(diǎn)的次序與輸入數(shù)據(jù)的順序相同,而頭插法不一致
- 每個(gè)結(jié)點(diǎn)插入的時(shí)間為0(1),鏈表表長(zhǎng)為n,則時(shí)間復(fù)雜度為0(n)
- 頭插法的L始終表示頭結(jié)點(diǎn),尾插法的r始終要表示最后一個(gè)結(jié)點(diǎn)
2、按序號(hào)查找結(jié)點(diǎn)值
思路:從第一個(gè)節(jié)點(diǎn)出發(fā),順指針next依次往下找,當(dāng)找到第i個(gè)結(jié)點(diǎn)結(jié)束,否則返回null
頭結(jié)點(diǎn)為第一個(gè)結(jié)點(diǎn),不存放值,所以不必要查找,直接j=1就行,為什么要p&&j<i呢?因?yàn)槲覀冊(cè)趧?chuàng)建我們的鏈表時(shí),沒(méi)有定義變量來(lái)記錄長(zhǎng)度,所以我們就不知道鏈表的長(zhǎng)度,當(dāng)j<i,但已經(jīng)超過(guò)鏈表的長(zhǎng)度時(shí),我們就不能查找下去了,剛好最后一個(gè)結(jié)點(diǎn)的next是null,能判斷有沒(méi)有到達(dá)最后一個(gè)結(jié)點(diǎn)
3、按值查找
返回第一個(gè)等于我們要查找值的結(jié)點(diǎn)
4、插入結(jié)點(diǎn)
將數(shù)據(jù)e插入到第i個(gè)結(jié)點(diǎn)上,首先判斷i的合法性
首先查找第i-1位置結(jié)點(diǎn),為什么不是i呢?因?yàn)椴迦氲臅r(shí)候,相當(dāng)于第i個(gè)位置后移一步,所以第i-1的next要指向新插入的i位置,新插入的i位置要指向舊的i位置結(jié)點(diǎn),如果查找i,就沒(méi)辦法知道i-1位置。根據(jù)查找i-1位置來(lái)判斷i的合法性。如果不合法返回false
5、刪除操作
將單鏈表的第i個(gè)結(jié)點(diǎn)刪除。
思路:先判斷刪除位置的合法性,然后查找第i-1個(gè)結(jié)點(diǎn),刪除第i位置
總結(jié)
以上是生活随笔為你收集整理的线性表----链式表的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 颐和园怎么买联票
- 下一篇: 利用xor给shellcode加壳