1.思惟導圖及學習體會
1.1思惟導圖
1.2 學習體會
- 1. 我以爲學習的順序表還有單鏈表就像上學期所學習的數組與鏈表,順序表是結構體裏面有個數組還有個數組長度。順序表操做還有理解起來相對容易些,而單鏈表就…呵呵…難度大了不少,特別是在作PTA時候,有時候沒有考慮到空指針的狀況,而後還總是找不出來,一旦對空指針進行操做程序就崩潰了,因此作題時候仍是得拿着紙拿着筆在那畫線,還要考慮充分,否則有時候下一個節點爲空之類的沒考慮到又去進行操做這相似的狀況,還有刪除元素插入元素等等,感受寫代碼就是寫bug,以爲本身涼颼颼的。雖然在一些操做上順序表是比鏈表時間複雜度上來的多,但我以爲仍是順序表看起來好理解 。
- 2. 也學習到了一些牛逼的方法如重構鏈表的方法還有兩個有序表的歸併也以爲挺神奇的,還有得多看書上的代碼,有講解好懂一些以及課堂派上的方法技巧,之後作相關題纔有思路。
2.PTA實驗做業
2.1.題目1:順序表刪除重複元素
設計一個算法,從順序表中刪除重複的元素,並使剩餘元素間的相對次序保存不變。
輸入格式: 第一行輸入順序表長度。 第二行輸入順序表數據元素。中間空格隔開。
輸出格式:數據之間空格隔開,最後一項尾部不帶空格。
輸出刪除重複元素後的順序表。
2.1.1設計思路(僞代碼)
void CreateSqList(List &L,int a[],int n)
動態申請內存;
for循環遍歷數組a[n]將數組a[n]一個個賦入線性表中;
void DelSameNode(List &L)
定義i和j:
定義靜態數組temp用來記錄數據是否重複和TEMP用來存儲順序表的值;
for i=0 to L->length
將順序表中的數據賦入data數組;
end for
for i=0 to L->length //遍歷整個順序表 查找重複數據 若是有重複數據 則記錄下該位置並將temp值爲1
for j=i+1 to L->length
if L->data[i]=L->data[j]
then temp[j]=1;
end for
end for
//重構數組 將沒有重複數據的重構 以前存儲在TEMP的值能夠用了
for i=0 to L->length
if temp[i]==0 then
L->data[k++]=TEMP[i];
end for
L->length=k; //新的數組長度
2.1.2代碼截圖
2.1.3本題PTA提交列表說明。
- Q1:一開始只對了個空表的測試點後來改着改着連空表這個測試點也錯了變成另一個測試點過了
- A1:我起初不是用這種方法的,而是利用比較麻煩的方法,我一邊查找一旦找到重複的數據就後面的數組都往前一位,這樣子很麻煩,並且沒法處理一些測試點
- Q2:後來我改用這種方法來解決,而後全是重複數據以及無重複數據這兩個測試點常常一個能過另一個就過不了
- A2:一開始全是重複數據這一測試點過不了,我發現是我直接在L上面直接進行修改數據,這樣子若是這個順序表全是重複的話會直接所有刪光一個也沒有,我改正就是在定義一個數組用來修改
- Q3:最後一個測試點是無重複數據這一點過不去,修改好久一直無法改正
- A3:舍友幫助我修改的,我一開始定義的中間變量數組data和flag,我忘記了得用static定義,致使他們裏面不是爲0,後面出錯了
2.2.題目1:-鏈表倒數第m個數
已知一個帶有表頭節點的單鏈表,查找鏈表中倒數第m個位置上的節點。
輸入要求:先輸入鏈表結點個數,再輸入鏈表數據,再輸入m表示倒數第m個位置。
輸出要求,若能找到則輸出相應位置,要是輸入無效位置,則輸出-1。
2.2.1設計思路(僞代碼)
int Find(LinkList L, int m )
if L爲空 或 m爲負數 //空指針或者m不合法
return -1
定義 temp=0 ,n=-1
定義LinkList類型的指針 s,r,r指向L下一個節點
while r不爲空 do //查找倒數第m個
if n等於m+1 then //找到倒數第m個
temp=1 返回r->data
end if
n++
r指針往下移
end while
if temp等於0 then//沒找到
return -1
end if
2.2.2代碼截圖
2.2.3本題PTA提交列表說明。
- Q1:一開始位置無效的測試點過不去 沒搞懂什麼意思,覺得是鏈表爲空或者是m爲負數 ,可我也加了這些條件後仍是錯的
- A1:是我忘記了倒數第m個數就是正數第m+1個數,致使錯誤,我舉了例子來看看,才發現我判斷條件錯誤,也是測試數據跟答案不同的緣由
- Q2:我就改了判斷條件交上去。。。沒想到對了,而後還有些地方搞不太懂,就又改了點地方,又交了上去。。。就錯了
- A2:好比我還想了下當這個m超過了這條鏈長該怎樣作,後來改的改的,才發現,好像倒數的就沒有超過這鏈長的說法
2.3.題目1:有序鏈表合併
已知兩個遞增鏈表序列L1與L2,2個鏈表都是帶頭結點鏈表。設計函數實現L1,L2的合併,合併的鏈表仍然遞增有序,頭結點爲L1的頭結點。 合併後須要去除重複元素。
輸入格式: 輸入分兩行,先輸入數據項個數,再輸入數據項,數字用空格間隔。
輸出格式: 在一行中輸出合併後新的遞增鏈表,數字間用空格分開,結尾不能有多餘空格;
2.3.1設計思路(僞代碼)
定義LinkList類型的指針,PL1爲L1的遍歷指針並指向L1的首結點,PL2爲L2的遍歷指針並指向L2的首結點,temp3,
定義LinkList類型的指針 s爲放置數據域
temp3爲保存L1的指針
while PL1&&PL2 do //查找兩鏈表共同的長度 將者共同的部分進行排序
if PL1指向的data大於PL2指向的data while PL1不爲空 then //當L1的數據域大於L2的時候 將L2的數據存入新創建的接點s中 並將PL2後移
創立新節點s 並將PL2的數據域存入s數據域中
利用尾插法將temp3連起來
PL2繼續日後移
else if PL1指向的data小於PL2指向的data //當L2的數據大於L1 將L1的數據存入新創建的接點s中 並將PL1後移
重複上一步驟 只是存進的是PL1的數據域以及PL1後移
else //當兩個數據同樣時候只要移動一個就能夠 在這個條件語句中至關於只移動L1
if 1 then
PL1後移
else PL2後移
end while
while PL1不爲空 then //當PL1不空時候將後面的數據不斷存入新建的s接在L1後
創立新節點s 並將PL1的數據域存入s數據域中
利用尾插法將temp3連起來
PL1繼續日後移
end while;
while PL2不爲空 then
創立新節點s 並將PL2的數據域存入s數據域中
利用尾插法將temp3連起來
PL2繼續日後移
end while;
temp3尾節點設爲空
}
2.3.2代碼截圖
2.3.3本題PTA提交列表說明。
- Q1:各類錯誤都有,後面還有死循環這種很久沒出現的問題
- A1:空表是一開始正確的測試點,後面連這五分也沒了,我起初是直接在L1上進行修改的,原本也沒考慮太多,想着既然是要合併到L1,就直接修改L1,致使一開始不少錯誤
- Q2:重複數據這一測試點過不了,並且看不出哪裏有錯改的時候Devc還會崩潰
- A2:而後就請教大佬來幫忙看下哪裏有錯,原來是當二者重複的時候,我只移動了兩個指針,沒有將他們重複的數據至少存一個進去,而後我就只移動一個另外一個不動,在下一次循環的時候,就能夠將重複數據存進去了
三、閱讀代碼
3.1 題目 單鏈表冒泡排序
3.2 解題思路
作法相似於數組的冒泡法算法
- 1.比較相鄰的元素。若是第一個比第二個大,就交換他們兩個。
- 2.對每一對相鄰元素做一樣的工做,從開始第一對到結尾的最後一對。
- 3.針對全部的元素重複以上的步驟,直到沒有任何一對數字須要比較。
3.3 代碼截圖
3.4 學習體會
- 1. 一開始若是本身來寫代碼的話,在交換數值這一作法上我不會再去構造個函數的,會直接在這函數裏面寫進去,他在構造個函數感受會更好用,能夠在該函數內更少操做
- 2.對於單鏈表的排序,在pta啊有過兩條鏈表的歸併, 但在單條鏈表上的排序沒作過,以前也沒想過這個問題。。。看到有人用熟悉的冒泡法作了就拿出來分享了
- 3.還有一點我搞不懂,就是爲何在第一個for循環中每次循環cur要等於head,那樣在下一個循環中的if比較中不會有問題嗎