XDOJ 258 鍊錶去重

2021-10-12 03:00:10 字數 1970 閱讀 1113

問題描述

給定乙個鍵值為整數的單鏈表 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。輸入格...