我們來看單鏈表的銷毀,排序,逆置
首先還是來看一下單鏈表的銷毀
我們能不能將單鏈表的操作像順序表一樣直接將他的size變成0然後直接釋放掉指向他的空間?
void
listdestory
(slist *psl)
我們知道鍊錶儲存資料最大的不同就是不是一段連續的空間,如果釋放鍊錶空間,需要釋放每乙個節點的空間,而不是直接將頭節點的空間釋放就可以。這個函式操作就是將鍊錶斷開然後直接對頭結點進行free;但是剩下的節點不僅沒有釋放掉空間還找不到了,因此我們對於鍊錶空間的釋放還需要進行深究
在銷毀鍊錶之前我們先做出鍊錶清除的函式
注意,在釋放空間的時候,稍有不慎就有可能斷鏈,導致後面所有的找不到。
}這樣就能實現鍊錶的清除,節點依次釋放;
接下來看鍊錶的銷毀操作
只需要在清除操作上加一點,將頭節點釋放掉就行。
void
listdestory
(slist *psl)
接下來我們來看鍊錶的逆置問題,注意,鍊錶逆置並非將鍊錶倒著列印出來 ,而是將節點逆置。實質上是修改節點的指標
常見的方法有2指標方法和3指標方法
方法一:將乙個鍊錶看成2個鍊錶,第乙個鍊錶只有乙個頭結點個乙個節點,剩餘的構成第二個節點,每次從第二個鍊錶中取出1個節點在第乙個鍊錶上進行頭插。這就將不會的轉換成會的。
首先我們來看三指標逆置
void
reservelist
(slist* psl)
}
我們來分析一下這段**,首先3個指標的位置一定要確定好,p指標一直指向psl->first->next,temp 指標用來記錄q指標的位置,q指標是斷鏈後的後面你的鍊錶,一直指向第二個鍊錶的頭位置,然後將其做頭**入到前面的鍊錶中。
還有一種方法是二指標法,其實三指標的操作雙指標萬全可以完成但是鍊錶操作不好很容易斷鏈。我們來看下雙指標解決逆置問題
其實說的雙指標,但是真正見到**是加上還是3指標,但是這個額外的指標是用的是這個鍊錶本身就帶有的指標 last ,只不過我們再三指標的時候並沒有用到這個指標。
來看雙指標時刻的**
void
reservelist1
(slist* psl)
}
我們繼續看操作,鍊錶的排序問題,這裡面的排序指的並不是更改鍊錶的資料域,而是更改其指標與讓整個鍊錶按照規定順序排列。
鍊錶排序問題進行之前我們先來回顧一下鍊錶的按值插入問題
首先就是這個指標如何找到這個插入點的位置,我們可以用while迴圈來操作,找到後看情況是否在鍊錶末尾處。
void
insertbyval
(slist* psl,
int x)
listnode* l =
_buynode
(x);
if(p->next ==
null
)else
psl->size++
;}
有了按值插入我們來看下排序問題,實際上可以將鍊錶斷成個鍊錶,然後將第二個鍊錶的值做按值插入操作。
void
slistsort
(slist* psl)
//還是將鍊錶斷開然後按值插入
else
p = q;}}
}
單鏈表操作(帶頭節點)
帶頭節點的單鏈表 include include typedef struct lnodenode linklist bool initlist linklist 初始化單鏈表 bool listinsert linklist int int 在指定位置插入資料 bool empty linklis...
單鏈表的操作(帶頭節點)
typedef struct lnodelnode,linklist 鍊錶的各種具體操作函式 bool initlist linklist l 鍊錶的初始化 bool empty linklist l 判斷鍊錶是否為空 intlength linklist l 求單鏈表的長度 bool listin...
帶頭節點的單鏈表
需要注意 include define maxlen 20 define elementtype char using namespace std typedef struct slnode node 函式宣告 void initiallist node l int listlength node ...