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

時間 2021-07-19 11:22:29

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.畫程式流程圖,要理解迴圈結構的使用。

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

有誰幫我講解一下(物理)

當光照射時產生光電子,這時有的光電子是有速度的,因為左邊 則出來的電子會作減速運動,當u大於12.5v時,速度最大的光電子也不能夠達到右邊的極板即達到最右邊的時候速度為0,所以列乙個方程即可 很明顯這是光電效應的題,根據光電效應方程 動能 光子能量 逸出功 1 2 mv2 hv w 1 2 mv2 ...

哪位高手講解一下multisim的頻譜分析儀怎麼用啊?(莫復

遊俠 multisim頻譜分析儀不需要特別複雜的操作。1 把被測訊號與儀器內的基準頻率 基準電平進行對比。因為許多測量的本質都是電平測試,如載波電平 a v 頻響 c n cso ctb hm cm以及數字頻道平均功率等。擴充套件資料在量測高頻訊號時,外差式的頻譜分析儀混波以後的中頻因放大之故,能得...

古文一段!!各位高手,能幫我翻譯一下嗎

從現在算起到千餘年後,書中有交待,石碑大約為唐時所刻立 將有愛新覺羅氏建立清朝,從愛氏發源地向東會有一座島,此處省略了主語 島名為神龍 島 倒置句式 神龍島上有神龍教 聯絡上下文 教主叫洪 此處避名諱 得到了上天的恩寵和信任 攜帶有法力能救濟天下 人 所顯示的威力巨大 降伏妖魔,如太陽東昇一樣合乎天...