集合我們高中都學過吧?
最重要的幾個特點:元素不能重複、各個元素之間沒有關係、沒有順序
集合內的元素可以是單元素或者是集合。
對集合的操作:交集並集差集等,還有對自身的加減等。
需要頻繁的加減元素,所以順序儲存效率較低,但是我們還是說一下是怎麼實現的:
用01向量表示集合,因為現實中任何乙個有窮集合都能對應到乙個0、1、2.....n這麼乙個序列中。所以可以對應過來,每位的01代表這個元素存在與否即可。
鏈結儲存表示使用有序鍊錶來實現,雖然集合是無序的,但是我們的鍊錶可以是有序的。可以按公升序排列。而鍊錶理論上可以無限增加,所以鍊錶可以表示無限集。
下面我們來實現一下:
我們定義乙個節點:
typedef int elemtype;
typedef struct setnode*linkedset//集合定義
然後要實現那些操作了,首先想插入吧:我們對於乙個新元素,查詢集合中是否存在,存在就不插入,不存在就插入到查詢失敗位置。
刪除也簡單,查詢存在就刪除。
我們說兩個集合的操作:
求兩個集合的並:
兩個鍊錶,都是公升序。把他們去重合併即可。
其實和鍊錶歸併的merge過程是一樣的,只是相等的時候插入乙個,兩個指標都向後走就行了。
我就再寫一遍吧。
void unionset(linkedset & a,linkedset & b,linkedset & c)
else if(pa->datadata)//插小的,小的向後
else
pc=pc->link;//注意指標
}if(pa)p=pa;//剩下的接上
else p=pb;//只執行乙個
while(p)//依次複製
pc->link=null;
}
求兩個集合的交,更簡單,還是這三種情況,誰小誰向後,相等才插入。
void unionset(linkedset & a,linkedset & b,linkedset & c)
else if(pa->datadata)//小的向後
else
}pc->link=null;
}
求兩個集合的差:高中可能沒學這個概念,其實就是a-b,就是b中的元素,a都不能有了。
運算你可以把b元素全過一遍,a中有就去掉,但是這樣時間複雜度太高了,我們需要o(a+b)而不是o(a*b)
因為有序,很好操作,還是兩個指標,
如果ab相同,都向後移。
或者,b小,b就向後移。
如果a小,說明b中不含這個元素,我們把它複製到結果煉表裡。
思想還行,實在懶得寫了,有時間再說吧。
順序表表示集合的操作
問題描述 本題要求定義並實現乙個用於存放整型資料的集合,程式設計實現集合的各種操作並在main函式中測試。基本要求 實現集合的以下操作 1 增加乙個數到集合中 完成 2 從集合中去掉乙個元素 完成 3 判斷乙個元素是否在集合中 完成 4 實現兩個集合的並運算 5 實現兩個集合的交運算 6 實現兩個集...
線性表順序表示
include include include define listlength 100 typedef struct datatype typedef struct initlist,list 建立並返回乙個空的線性表 list createlist void else printf out o...
資料結構2 線性表的鍊錶表示和實現
線性表的鍊錶結構,最重要的就是宣告出乙個資料結構,其他的建立,插入什麼的,我覺得就是邏輯問題吧,出錯了再慢慢改唄!寫多了,錯也就少了吧應該!但是有一點,為什麼給鍊錶結點取別名,要取兩個呢?乙個別名,乙個指標,用任何乙個都可以達到相同的目的呀?有懂的,跪求解釋一下啊!include include i...