關於鍊錶,已經寫了三篇部落格研究了,雖然考研的資料結構並沒有細緻入微,但是關於書上的不同寫法,我心裡總是有個疙瘩。
所以今天進行一次系統的總結,徹底寫清鍊錶在c/c++中作為函式被傳遞的問題。
先建立結構體。
typedef struct link
link, *linkpointer;
定義了乙個名為link的資料形式,以及乙個名為linkpointer的指向link形式資料的指標。
在初始化鍊錶時,有時需要這樣寫:
linkpointer p;//建立乙個頭指標
initlink(linkpointer &q);//將頭指標傳入
學資料結構只寫過c的我,當時就蒙了,這&是個什麼東西?取位址嗎?為什麼要在這裡取位址啊?
我們將這一句單獨摘出來看。
linkpointer &q = p;
將乙個結構體指標p的值,賦予給另乙個結構體指標q的位址?什麼玩意兒
c++中的引用是什麼意思,可以自己看教程,作者看的是:
c++中引用&的使用
在函式傳參中使用&,相當於q與函式外的p完全等價,資料形式相同,指向同一塊記憶體。
我們寫一段c++的程式來驗證這一點
#include#includetypedef struct link
link, *linkpointer;
void init(linkpointer &p)
int main()
經過斷點除錯,我們確實驗證了,p和q,兩者完全等價。
傳入前:
+ p 0xcccccccccccccccc link *
傳入後:
+ q 0xcccccccccccccccc link *
//一模一樣
所以也有了我們在書上看到的寫法
#include#includetypedef struct link
link, *linkpointer;
void init(linkpointer &p)
int main()
我說實話,這種寫法挺離譜的,main函式中的linkpointer p完全是個沒有意義的宣告,p既沒有被分配記憶體,結構體內也沒有資料,還非要通過&這種困難的方式傳遞給函式。
如果沒有這個&
void init(linkpointer q)
init(p);
q為形參,而p又沒有任何資料,在這裡就會直接報錯。
the variable 'p' is being used without being initialized.
我們來看另一種情況,在對鍊錶進行操作時的情況。
void nodeinsert(linkpointer p,int target,int element)
nodeinsert(l,target,element)
這裡的l一般已經初始化過了,摘出來是這樣的
linkpointer p = l;
將結構體指標l的值,即鍊錶的位址直接賦給形參p,p也就能在函式中正確操作記憶體中的鍊錶了。
接下來還有乙個問題,那在c語言中,沒有引用這個用法,那怎麼辦呢?
想信弄懂了前面的知識,這個問題也難不住你了。
我們只需要用c語言的常規方法,將變數取址,傳入時多加乙個*即可。
void init(linkpointer *q)
init(&p)
而在普通對鍊錶進行操作時,和c++完全一樣,直接傳就完事了
void nodeinsert(linkpointer p,int target,int element)
nodeinsert(l,target,element)
一句話總結:需要更改鍊錶指標本身的值時,必須加&,否則不需要加。
前者是呼叫了完全相同的變數,後者則是新定義了乙個形參指標,指向相同的記憶體。
嚴蔚敏老師版的資料結構,說是c語言,又用了c++的」引用「傳參,真的搞心態。
被傳參戲耍了三天,和幾個同學討論了很久,也請教了老師。今天終於是徹徹底底弄明白了,討論了每一種情況,在此總結,也希望可以幫到你。
鳴謝吉吉同學和魚同學
資料結構賈老師
資料結構刷題day1
pat乙級原來和資料結構錘子關係都沒有啊,但我沒寫過c語言,就當學c了。卡拉茲 callatz 猜想 對任何乙個正整數 n,如果它是偶數,那麼把它砍掉一半 如果它是奇數,那麼把 3n 1 砍掉一半。這樣一直反覆砍下去,最後一定在某一步得到 n 1。卡拉茲在 1950 年的世界數學家大會上公布了這個猜...
資料結構刷題 剪枝
在刷題中會遇到,比如二叉樹問題中會遇到剪枝的問題,我們需要,研究一下什麼是剪枝 剪枝可謂是搜尋的靈魂所在,我們知道搜尋是個愣頭青小伙,一路撞到底可能都撞不到答案,他還可能要撞很多次。所以有什麼方法可以讓他撞的次數少一點呢?我們知道搜尋會形成乙個搜尋樹,這其中有很多的枝杈,但是他們中許多其實是無用或者...
資料結構刷題 陣列
給定乙個矩陣 a,返回 a 的轉置矩陣。先建立乙個與原始矩陣行列數互換的新矩陣 做兩個迴圈巢狀,內迴圈遍歷原始矩陣的行轉列,外矩陣遍歷原始矩陣的列 class solution return v 逐行的細緻解釋 vector 建立了二維陣列,兩個空格可以在c 11標準中可以剔除 a 0 size 獲...