問題描述
給定乙個鍵值為整數的單鏈表 l,將鍵值的絕對值有重複的結點刪除:即對任意鍵值 k,只 有鍵值或其絕對值等於 k 的第乙個結點被保留在 l 中。例如,下面單鏈表 l 包含鍵值 21、 -15、15、7、-15,去重後的鍊錶 l 包含鍵值 21、-15、7。
輸入說明
輸入的第一行包含兩個整數,分別表示鍊錶第乙個結點的位址和結點個n(1≤n≤100)。結 點位址是乙個非負的 5 位整數,null 指標用-1 表示。 隨後 n 行,每行含 3 個整數,按下列格式給出乙個結點的資訊: address key next 其中 address 是結點的位址,key 是絕對值不超過 10000 的整數,next 是下乙個結點的位址。
輸出說明
輸出的第一行為去重後鍊錶 l 的長度,換行;接下來按順序輸出 l 的所有結點,每個結點 佔一行,按照 address key next 的格式輸出,間隔 1 個空格。
測試樣例
輸入樣例 1
00100 5
99999 7 87654
23854 -15 00000
87654 -15 -1
00000 15 99999
00100 21 23854
輸出樣例
1300100 21 23854
23854 -15 99999
99999 7 -1
解題思路
這道題看似是一道鍊錶題,但是我是拿結構體和陣列做的哈哈哈,當時是想著拿adress做陣列的下標,結果雖然做出來了但感覺程式稍微有些笨重。
首先建立了乙個結構體,flag的作用主要是為了去重,開始時flag都置為1,每遇到一組陣列,拿它和剩下各組資料的data值比較,如果與剩下的資料中data絕對值相等,則剩下的那個資料flag設為0,表示重複了。
struct lnodetable[
100000
],newtable[
100]
;
建立兩個結構體陣列,第乙個是亂序也就是按輸入的順序存在,陣列下標為自己的adress值,第二個中的資料是按指標排列後的資料,陣列下標為0,1,2~n-1。
然後通過乙個for迴圈給第乙個陣列賦值,再通過一直for迴圈將第乙個陣列的資料整理後賦給newtable陣列,此時newtable陣列存放的資料是按鍊錶順序,之後通過乙個雙重for迴圈逐一排查重複的元素,並將其flag置為0,計算去重後鍊錶的長度count,然後重新更新非重元素的後繼節點的位址。
輸出:如果不是最後乙個資料,則正常輸出,如果是最後乙個資料,則注意要把它的next資料域置為-1. //注意:因為int型別的原因,adress輸入有字首0的時候系統會消掉字首0,所以最後輸出的時候要根據位數補足字首0.因為此題要求adress和next為5位數,所以用到了乙個巧妙地方法:輸出時為 %05d ,這樣系統會自動讓這個將要被輸出的數變成5位數,缺位數的時候往前補字首0.
完整**
#include
#include
struct lnodetable[
100000
],newtable[
100]
;int
main()
int j;
j=num;
for(i=
0;i)for
(i=0
;i)//去重(使重複元素flag置為0)}}
for(i=
0;i)for
(j=i+
1;j}printf
("%d\n"
,count)
;for
(i=0
,t=0
;i(count==t)}}
return0;
}
PAT鍊錶去重
時間限制 300 ms 記憶體限制 65536 kb 長度限制 8000 b 判題程式 standard 作者 陳越 給定乙個帶整數鍵值的單鏈表l,本題要求你編寫程式,刪除那些鍵值的絕對值有重複的結點。即對任意鍵值k,只有鍵值或其絕對值等於k的第乙個結點可以被保留。同時,所有被刪除的結點必須被儲存在...
PAT 鍊錶去重
給定乙個帶整數鍵值的鍊錶 l,你需要把其中絕對值重複的鍵值結點刪掉。即對每個鍵值 k,只有第乙個絕對值等於 k 的結點被保留。同時,所有被刪除的結點須被儲存在另乙個鍊錶上。例如給定 l 為 21 15 15 7 15,你需要輸出去重後的鍊錶 21 15 7,還有被刪除的鍊錶 15 15。輸入在第一行...
PTA 鍊錶去重
題目重述 給定乙個帶整數鍵值的鍊錶 l,你需要把其中絕對值重複的鍵值結點刪掉。即對每個鍵值 k,只有第乙個絕對值等於 k 的結點被保留。同時,所有被刪除的結點須被儲存在另乙個鍊錶上。例如給定 l 為21 15 15 7 15,你需要輸出去重後的鍊錶21 15 7,還有被刪除的鍊錶 15 15。輸入格...