資料結構刷題day11

2022-10-09 05:39:07 字數 2282 閱讀 1297

關於鍊錶,已經寫了三篇部落格研究了,雖然考研的資料結構並沒有細緻入微,但是關於書上的不同寫法,我心裡總是有個疙瘩。

所以今天進行一次系統的總結,徹底寫清鍊錶在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 獲...