資源簡介
題目:
7. 集合運算 (單循環鏈表)
1.問題描述:
設有兩個帶頭結點的單循環鏈表存儲的集合A、B,其元素類型為字符或者整形,且以非遞減方式存儲,其頭結點分別為ha、hb。要求下面各問題中的結果集合同樣以非遞減方式存儲,結果集合不影響原集合。
2.實現要求:
⑶ 編寫集合元素測試函數IN_SET,如果元素已經在集合中返回0,否則返回1;
⑷ 編寫集合元素輸入并插入到單鏈表中的函數INSERT_SET,保證所輸入的集合中的元素是唯一且以非遞減方式存儲在單循環鏈表中;
⑶ 編寫求集合A、B的交C=A∩B的函數,并輸出集合C的元素;
⑷ 編寫求集合A、B的并D=A∪B的函數,并輸出集合D的元素;
⑸ 求集合A與B的對稱差E=(A-B)∪(B-A) 的函數,并輸出集合D的元素;
⑹ 設計一個菜單,具有輸入集合元素、求集合A、B的交C、求集合A、B的并D、求集合A與B的對稱差E、退出等基本的功能。
3.測試數據:字符型和整形由同學們自定,但集合A、B的元素個數不得少于15個。

代碼片段和文件信息
#include?
#include
#include
#include
using?namespace?std;
typedef?char?DataType;?
typedef?struct?Aggreage//集合結構體
{
DataType?element;//元素
struct?Aggreage?*next;
}SAggreage;
int?print_Aggreage(SAggreage?*head);//輸出一個集合?
void?AggreageInitiate(SAggreage?**head);//初始化函數(創建頭結點)
int?IN_SET(SAggreage?*headDataType?elem);//判斷A元素是否在這個集合中
int?newspace(SAggreage?**headDataType?elem);//給結點開辟空間?
int?isempty(SAggreage?*head);//判斷該集合是否為空
int?INSERT_SET(SAggreage?*headDataType?elem);//插入唯一元素
int?create(SAggreage?**head);
SAggreage*?Intersection(SAggreage*?ASAggreage*?B);//交?
SAggreage*?Union(SAggreage*?ASAggreage*?B);//并?
SAggreage*?Unionn(SAggreage*?ASAggreage*?B);
SAggreage*?Difference(SAggreage*?ASAggreage*?B);//差
void?load(SAggreage*?haSAggreage*?hb);//讀文件數據到鏈表
void?save(SAggreage*?haSAggreage*?hb);//保持鏈表數據到文件中
//菜單
void?mainmenu()
{
cout<<“==============================集合運算==============================“< cout<<“||????????????1.交????????????2.并???????????????3.對稱差?????????||“< cout<<“||????????????4.輸入集合AB????5.導入集合AB???????6.查看集合???????||“< cout<<“||????????????7.保存集合AB????8.退出程序??????????????????????????||“< cout<<“====================================================================“< }
void?menu6()
{
cout<<“=======================查看集合=======================“< cout<<“||?????????????????1.集合A????2.集合B???????????????||“< cout<<“||?????????????????3.返回上一級菜單?????????????????||“< cout<<“======================================================“< }
//初始化函數(創建一個頭指針)
void?AggreageInitiate(SAggreage?**head)
{
*head?=?(SAggreage?*)malloc(sizeof(SAggreage));
(*head)->next?=?*head;//循環單鏈表//之前:(*head)->next?=?head;
}
//判斷A元素是否在這個集合中
int?IN_SET(SAggreage?*headDataType?elem)
{
int?flag?=1;//初始假設集合中沒有這個元素,檢查到有后再將標志改為0;
//如果元素已經在集合中返回0,否則返回1;
SAggreage?*p?=?head;
while(p->next?!=?head)//從頭指針開始,當p不是最后一個的時候(只有頭指針的話,不執行里面的語句)
{
p?=?p->next;//p指向下一個(從第一個數據開始),到最后一個,如果中間有和a元素一樣的,就break
//返回0,否則返回1;(是1就可以繼續添加)
if(p->element?==?elem)
{
flag?=?0;
break;
}
}
return?flag;
}
//開辟一塊內存的函數(后來根據功能和代碼重復出現的次數自己添加的函數)
int?newspace(SAggreage?**headDataType?elem)//////////?int?newspace(SAggreage?*headDataType?elem)
{
//cout<<“辟一塊內存的函數“?< SAggreage?*p?=?*head;//////////////////?head;
SAggreage?*s;
s?=?(SAggreage?*)malloc(sizeof(SAggreage));
s->element?=?elem;
s->next?=?p->next;
p->next?=?s;
return?1;
}
//判斷該集合是否為空(判斷頭指針的下一個是否為頭指針)
int?isempty(SAggreage?*head)
{
//是空返回1
//int?num;
SAggreage?*p?=?head;
if(p->next?==?head)//if(p->next?=?head)應該是==,哎,搞死我了
{
return?1;
}
else
{
return?0;
}
}
//插入唯一元素
int?INSERT_SET(SAggreage?*headDataType?elem)//SAggreage?*head因為是指針,修改了也可以保存數據,
//若插入成功則返回1,否則返回0;
{
//cout<<“進入插入唯一元素的函數“< //1.先檢查集合中是否有這個元素//&head還是head
if
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件?????????10??2019-04-01?09:21??集合運算\B.txt
?????文件??????18580??2019-04-01?09:17??集合運算\ccc.cpp
?????文件????1929440??2019-04-01?09:28??集合運算\ccc.exe
?????文件?????????10??2019-04-01?09:21??集合運算\A.txt
?????目錄??????????0??2019-04-01?09:39??集合運算
-----------?---------??----------?-----??----
??????????????1948040????????????????????5
- 上一篇:C++加載百度地圖demo
- 下一篇:C語言連接mysql,實現通訊錄功能
評論
共有 條評論