線性表表示集合

2021-08-28 21:30:17 字數 1372 閱讀 3681

集合我們高中都學過吧?

最重要的幾個特點:元素不能重複、各個元素之間沒有關係、沒有順序

集合內的元素可以是單元素或者是集合。

對集合的操作:交集並集差集等,還有對自身的加減等。

需要頻繁的加減元素,所以順序儲存效率較低,但是我們還是說一下是怎麼實現的:

用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...