資料結構(三)

2021-10-17 18:49:01 字數 2030 閱讀 4556

一、以查詢為基礎的演算法設計

1、按照條件進行節點查詢

2、進行插入或者刪除操作

例一:找到乙個單鏈表除表頭外,其內部的最大值並將它刪除(假設單鏈表內的最大值唯一)

分析:這個例子中我們要做的有兩件事,一件事是找到單鏈表內的最大值,另一件是刪除最大值。

那麼接下來我們分別去考慮如何實現這兩件事情,再將它們合併起來,就能解決問題。

首先是刪除,我們知道,要在鍊錶內刪除乙個資料,需要知道這個資料的前乙個鏈節。

其次是找最大值,我們知道,找最大值,最簡單的方法是比較,所以我們需要比較鏈節本身,也就是我們最後會知道,這個資料所在的鏈節。

綜上所述,我們可以知道我們最後知道的是最大值所在的鏈結,以及最大值所在鏈結的前乙個鏈節。

那麼實現方法可以是這樣:

1、設定兩個指標p、q,去遍歷整個鍊錶

2、還要設定兩指標,(pre、max)在p、q遍歷整個鍊錶的時侯去做比較

3、在結束後,讓pre=max->next,刪除最大值

void

delete_max

(struct chain*head)

//完成比較

p=p->next;

q=q->next;

//p、q去遍歷這個鍊錶

}

pre->next=max->next;

//將最大值從鍊錶裡面剔除

free

(max)

;//釋放掉最大值的空間

}

差不多這樣就能完成找到最大值,並刪除最大值的方法。它的時間複雜度是o(n)。

例二:有乙個帶頭節點的單鏈表l(至少有乙個資料節點),設計乙個演算法使其元素遞增有序排列

分析:當我們要將乙個單鏈表進行排序的時候,我們要做的事有兩件,一是比較,二是排序,也就是把資料放到,資料該在的地方。

那麼我們依舊將兩部分拆開來實現,當然,比較要在排序之前。

比較部分我們這樣來想,我們把鍊錶拆成兩部分,第一部分是它的頭鏈節,第二部分是剩餘鏈節,我們比較頭鏈節和剩餘鏈節的第一節,如果頭鏈節比剩餘鏈節的第一節小,那麼就將剩餘鏈節的第一節放在頭鏈節之後,形成新的兩部分,然後再將剩餘鏈節的新的第一節與,新的頭鏈節的那一部分裡的所有資料比較,把它插入到正確的位置上就可以了。

void

sort

(linklist *

&l) p->next=pre->next;

pre->next=p;

p=q;

//完成插入,直到整個鍊錶排序完成。

}}

二、以建表演算法為基礎的演算法設計

1、單鏈表有尾插法和頭插法兩種建表演算法

2、很多演算法是以這兩個建表演算法為基礎進行設計的

例一:將乙個鍊錶逆序。

分析:這個實際上,我們可以用排序裡的拆開的想法,其實就是頭插法和尾插法,我們把鍊錶的頭鏈節拿出來作為一部分,將剩餘鏈節,一節一節的插在這一部分的頭部,一直這樣重複下去,直到插完,即可將整個鍊錶逆序。

struct chain*

turn

(struct chain*head)

//不斷地把剩餘部分的第乙個鏈節取下來頭插到頭鏈節的那一部分

return pre;

//返回新的鍊錶的頭指標

}

跟據以上的程式,即可完成乙個鍊錶的逆序。

單鏈表的演算法設計裡的方法大致可以先劃出這兩類:

1、鍊錶你要知道是可以拆的,拆了之後再重新組合(有點像原子的重組,組成新的物質,還要知道,不止可以拆成兩部分,根據需要可以拆卸成多組)。

2、拆了之後重組有兩種方式,一種是頭插,一種是尾插,如果你要逆序就頭插,順序就尾插。

3、單鏈表中,你想處理某個資料時,就一定需要操作他的前置資料,所以要注意記錄前置資料。

4、如果你的鍊錶被拆成了好多部分,記得拿指標去記錄這幾個部分,然後幾個部分的交流,需要新的指標去交流,就像是信使一樣,以後乾脆叫信使指標(自己取地名字,不是專有名詞)好了。

總而言之,單鏈表給我的感覺目前像是織毛衣,鍊錶本身是毛線,指標是毛衣針。

資料結構(三)

輸入分2行,每行分別先給出多項式非零項的個數,再以指數遞降方式輸入乙個多項式非零項係數和指數 絕對值均為不超過1000的整數 數字間以空格分隔。輸出分2行,分別以指數遞降方式輸出乘積多項式以及和多項式非零項的係數和指數。數字間以空格分隔,但結尾不能有多餘空格。零多項式應輸出0 0。4 3 4 5 2...

資料結構 三

用鍊錶做簡易的通訊錄 node.h 檔案 ifndef node h define node h define true 0 define error 1 define flast 2 typedef int data typedef struct node node typedef node he...

資料結構三

討論 兩個函式 g f 在函式 g 中呼叫函式 f 那麼 在f 中系統為f 分配的那些記憶體,在 g 中結束f 後,g 是否可以使用這塊記憶體 我們知道,當f 結束後,f 就沒有了 但是在呼叫f 的過程中 記憶體確實是為f 分配了一塊記憶體 是否可以在g 的下面 繼續呼叫這塊記憶體的東西 inclu...