能幫我講解一下連結串列的原理嗎,高手幫忙

時間 2022-11-23 06:21:12

1樓:匿名使用者

第一個問題:

struct student *creat(void)

這是一個函式體,就比如 int my_function(char a, char b)一樣;

其中 struct student * 就相當於上面比如中的 int , 是函式的返回型別,只不過這個型別有點複雜,準確的說是:student結構(自定義)的一個指標型別。

creat 是函式名(相當於比如中的 my_funcation)。

void 是指沒有引數(不需要引數)。

總結:函式是c語言組成的基本單位(是c語言的細胞)。每一個程式都是有若干函式組合在一起,按照一定得邏輯順序合作完成預定目標的。

所以一定要認識清楚函式是如何構成的:(函式的組成如下)

函式的返回值型別 函式名( 引數列表 )

函式體第二個問題:

if(n==1) head=p1;

當n等於1時,將p1的值賦給head。(因為head和p1都是指標型別,所以該賦值的作用是:

讓指標head指向p1所指向的地址。)

第三個問題和第四個問題:

顯然,這2個問題都是由於你還沒有認清什麼是結構體連結串列。下面我試圖給你解釋下結構體連結串列的構成方式:

首先,你要知道程式(或說計算機)是如何來儲存一個變數的。

我們把計算機的記憶體比作一個大賓館,這個賓館中有若干房間,房間可以用來住人(存放資料),每個房間都是有房間編號的(記憶體地址)。

下面我們舉例,在程式中定義一個變數並給它賦值為100:“int a = 100; ”

對於這條語句計算機在記憶體中開闢一個空間(地址為01),並將100這個數寫入到這個空間。

這就相當於有個旅客(100)住進了大賓館的某個房間(房間編號為01)。

在c語言中任何一個變數都是這樣處理的。下面我們來看看【結構體】是怎樣構成的:

struct student

long num;

float score;

struct student *next;

以這個結構體為例,用該結構體定義一個變數struct student a;

則在記憶體中開闢一個空間來存放a的內容,

(而a不是一個人來賓館住店,a是個小團體,成員有num,score,next,所以賓館給a開了個套房!)

下面我們圖示說明如何用【結構體】來構成一張【連結串列】:

如果圖中的連結串列你看懂了,那麼這個程式應該就沒什麼大問題了,當然還有最後一點,關於

【為什麼又搞一個p1=(struct student *)malloc(len),之前不是已經為p1分配了空間了嗎?】

正是因為有一個【新的結構體型別資料】要加入這張【連結串列】,所以要給新資料分配新空間(也就是在大賓館中,又來個個小團體,所以再開一個套房!當然scanf要給這個小團體的成員進行登記。)

2樓:百度網友

1:struct student *creat(void) ,這個函式實際上就是實現了連結串列的建立,struct student,是連結串列中存 儲的資料結構。所以不能不要,而且非常重要。

2.void 如果用在引數時 就像你這個程式,struct student *creat(void),在這裡函式create(),不接受任何引數的話最好寫成create(void);所以上面的程式是比較規範的寫法,而返回值的型別,是函式名前面的那個 型別,struct student *,create()這個函式返回的是一個struct student型別的指標。如果是 void create(void); 不接收任何引數,也不返回任何值。

void create(int x); 接收 int 型引數,不返回任何值。

3. if(n==1)head=p1;用你的話說是把p1所指的結構體地址給head,也可以說,p1和head 都指向一塊記憶體,那塊就是 p1=(struct student *)malloc(len) 這裡malloc出來的記憶體。

4.這裡的邏輯,你可能不是很清楚,通俗的講吧,p1 代表一個學生的資料,p2 也代表一個學生的資料, p2 其實起到了一個傳遞的作用,就是 第一步.p1和p2指向一個資料 , 第二步,p1去接收新值, 第三步 p1 把這個資料放到p2 後面(p2->next),第四步,p2後移一個,也就是指向了新加進來的資料p1,也就是指向了當前這個連結串列的最後一個資料,返回第二步,這樣迴圈執行。

5.它要新開闢一個空間來儲存新的資料,通俗的說我們為你開闢的記憶體進行編號,你之前開闢的空間假設為1,1這裡面的資料是同學a的資訊,連結串列的第一個資料,實際上就是你開闢的空間1,如果你想要再加入另外同學b的資訊,那麼你就要開闢出來空間2來存b的資訊。即 (空間1) -> (空間2) 。

我們假設你沒有新開闢空間接收新資料的話,那麼b的資訊,將會存到空間1裡面,也就說會覆蓋掉,a的資訊,而你連結串列裡面存在的這兩個資料,實際上都是空間1,資料都為你最新的資料,即b同學的資料。就程式設計了(空間1)->(空間1).

6.scanf 重複,因為你要一直接收資料呀,你看,當你進入到while迴圈裡的時候,如果資料處理完不用scanf新的資料的話,你就只能接收一次資料了呀。

3樓:匿名使用者

1、struct student *create(void)

這個函式是構造連結串列,括號內的void表示沒有形參,可以不寫的;如果是沒有返回值就該在函式名前加void,但這顯然不是我們create()函式想要的;

此函式的意思就是說:函式create()不需要形參,函式最後返回一個指向struct student型的指標。

2、head=p1,很簡單的賦值語句。就是把變數p1的值賦給head變數:具體點,就是p1變數的值是個指向struct student型的指標,也就是p1儲存的是個地址,將此地址賦給head,那麼head的儲存內容也就是這個地址。

簡單點,就是讓head和p1的內容相同,不過由於他們的內容是可供再次訪問的地址;所以,也就是讓head和p1指向同一個struct student型的變數。

所以,這句話是將p1所指的結構體的地址給head,而不是p1這個變數的地址。

3、p2->next=p1;就是讓p2->next這個指標變數儲存p1的值,也就是說讓p2的後繼節點是p1,這就是連結串列了。然後p2=p1,就是改變現在的p2值,把p1的值賦予給p2,直觀點,就是讓p2指向這個新的節點。

如果在繼續往下執行就是這樣:

p1去申請一個新的節點;

把p1的值賦給p2->next,就是讓p1成為p2的後繼節點;

p2=p1,讓p2指向這個新的節點;

就這樣重複,重複,直至p1->num==0,也就是直到,你輸入一個0值。

4、接著第3條的分析,當p1指向一個新申請的結構體,然後讓你輸入p1的num和score值;

你輸入,並且將你的輸入值賦給num和score;迴圈開始檢測,發現p1->num==0,迴圈不成立,該退出了。

但是現在有個問題遺留:

p2->next不確定,如果迴圈成立,它該指向p1,但迴圈不成立,導致p2->next的指標是個不確定的值。

所以在結尾處p2->next=null;將此指標置空,防止它會有不可訪問的記憶體空間。

而最後一個輸入的num=0的p1,由於不符合條件,自然被捨棄。

-------------

最好對照程式,在紙上畫畫圖就明白了

4樓:匿名使用者

是想學習還是應付考試?

如果想學習的話,估計你前面的章節的基礎知識掌握的不夠好,建議再重看一下,譚的書我自己看的時候感覺比較基礎,挺適合初學的.

如果應付考試,我就不發表意見了..

5樓:匿名使用者

你知道的太多了。你要知道的再少一些,就不會有這麼多問題了。

1.請深刻理解函式的概念及使用方法。

2.再學習下指標與指標操作。(譚老的書上有)3.這個要理解連結串列的結構,建議先從書上找到圖,自己畫一下。。。

4.畫程式流程圖,要理解迴圈結構的使用。

不要找哥,哥也菜過。。。基礎打好,以上自然通。

請分析一下這個電路圖的工作原理,那個電路高手幫忙分析下這個耳機電路圖工作原理?

1樓 匿名使用者 ne555構成了一個振盪電路,它的工作與否取決於其4腳電壓。4腳為高電平時工作,低電平時停止工作。工作時從3腳輸出一定頻率...

VB中的elseif的用法,哪位高手能舉個例子並解釋一下,謝謝了

1樓 巨歌龍吟 1 if必以end if結束 2 elseif與else if不同 3 if then elseif end if 是 vb...

有人知道上海地鐵隧道里的動態廣告是什麼原理嗎?能詳細解釋一下嗎

1樓 煊王府 這種廣告10年前在北京就有了 事實上 那就是用100多張平面圖組成的一個平面廣告,從頭到尾鋪成的,以列車為靜態參照物,這些圖在...