全国 【切换城市】欢迎您来到装修百科!
关注我们
我要装修

线性表顺序存储结构求集合的并,交,补,差(源代码附上 超详细)

发布:2024-10-03 浏览:55

核心提示:一: 算法分析1)用数组A,B,C,E表示集合。假定A={1,3,4,5,6,7,9,10},  B={2,,3,4,7,8,10}, E={1,2,3,4,5,6,7,8,9,10},  输入数组A,B,E(全集),输入数据时要求检查数据是否重复(集合中的数据要求不重复),要求集合A,B是集合E的子集。    (2)两个集合的并运算:把数组A中各个元素先保存在数组C中。将数组B中的元素逐一与数组A中的元素进行比较,把不相同的元素添加到数组C中,数组C便是集合A和集合B的并。C语言算法(线性表顺序结构实现

一: 算法分析1)用数组A,B,C,E表示集合。
假定A={1,3,4,5,6,7,9,10},  B={2,,3,4,7,8,10}, E={1,2,3,4,5,6,7,8,9,10},  输入数组A,B,E(全集),输入数据时要求检查数据是否重复(集合中的数据要求不重复),要求集合A,B是集合E的子集。
    (2)两个集合的并运算:把数组A中各个元素先保存在数组C中。
将数组B中的元素逐一与数组A中的元素进行比较,把不相同的元素添加到数组C中,数组C便是集合A和集合B的并。
C语言算法(线性表顺序结构实现):void Union_Sq(SqList La,SqList Lb,SqList &Lc){int i;ElemType elem;Lc.length=0;for(i = 0; i < La.length; i++)Lc.elem[Lc.length++]=La.elem[i];for(i = 1; i <= Lb.length; i++){elem = Lb.elem[i-1];if(!LocateElem_Sq(La,elem,Equal))ListInsert_Sq(Lc,Lc.length+1,elem); }}3)两个集合的交运算:把数组A中元素逐一与数组B中的元素进行比较,将相同的元素放在数组C中,数组C便是集合A和集合B的交。
  C语言算法(线性表顺序结构实现void Mix_Sq(SqList La,SqList Lb,SqList &Lc){int i;ElemType elem;Lc.length = 0;for(i = 1; i <= La.length; i++){elem = La.elem[i-1];if(LocateElem_Sq(Lb,elem,Equal))ListInsert_Sq(Lc,Lc.length+1,elem);}}4)两个集合的差运算:将数组A中的元素逐一与数组B中的元素进行比较,把数组A与数组B不同的元素保存在数组C中,数组C便是集合A和集合B的差A-B。
  C语言算法(线性表顺序结构实现)void Differ_Sq(SqList La,SqList Lb,SqList &Lc){int i;ElemType elem;Lc.length = 0;for(i = 1; i <= La.length; i++){elem = La.elem[i-1];if(!LocateElem_Sq(Lb,elem,Equal))ListInsert_Sq(Lc,Lc.length+1,elem);}}5)集合的补运算:将数组E中的元素逐一与数组A中的元素进行比较,把不相同的元素保存到数组C中,数组C便是集合A关于集合E的补集。
  求补集是一种特殊的集合差运算。
   C语言算法(线性表顺序结构实现):void Comple_Sq(SqList La,SqList Lb,SqList &Lc,SqList &Ld){int i;ElemType elem;Ld.length = 0;Union_Sq(La,Lb,Lc);for(i = 1; i <= Lc.length; i++){elem = Lc.elem[i-1];if(!LocateElem_Sq(La,elem,Equal))ListInsert_Sq(Ld,Ld.length+1,elem);}}二 代码运行效果如下:三:源代码附上#include<stdio.h>#include<stdlib.h>#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define OVERFLOW -1#define LIST_INIT_SIZE 100 //初始表空间大小#define LISTINCREMENT 10 //表长增量typedef int Status; typedef char ElemType; typedef struct{ElemType *elem; int length; int listsize; }SqList;SqList La,Lb,Lc,Ld; Status InitList_Sq(SqList &L){L.elem = (ElemType )malloc(LIST_INIT_SIZE * sizeof(ElemType));if(!L.elem) exit(OVERFLOW); L.length = 0; L.listsize = LIST_INIT_SIZE; return OK;} Status ListInsert_Sq(SqList &L,int i,ElemType e){ElemType *newbase,*p,*q;//i的合法值为(1 <= i <= L.length_Sq(L) + 1)//异常处理if(i < 1 || i > L.length + 1) return ERROR;if(L.length >= L.listsize){ //当前储存空间已满,增加分配newbase = (ElemType *)realloc(L.elem,(L.listsize + LISTINCREMENT) * sizeof(ElemType));if(!newbase) exit(OVERFLOW); //储存分配失败L.elem = newbase; //新基址L.listsize += LISTINCREMENT; //增加储存容量}q = &(L.elem[i - 1]); //q为插入位置for(p = &(L.elem[L.length - 1]); p >= q; --p)*(p + 1) = *p; //插入位置及之后的元素往右移*q = e; //插入e++L.length; //表长加1return OK;}void CreateList_Sq(SqList &L){ElemType ch;int inlist = FALSE,j;while((ch) != 'n'){scanf("%c",&ch);for(j = 0; j < L.length; j++)if(ch == L.elem[j]){inlist = TRUE;break;}elseinlist = FALSE;if(!inlist && ch != 'n') ListInsert_Sq(L,L.length+1,ch);}}Status Equal(ElemType a,ElemType b){if(a == b) return TRUE;else return FALSE;}int LocateElem_Sq(SqList L,ElemType e,Status(* compare)(ElemType,ElemType)){ElemType *p;int i;i = 1; //i的初值为第1个元素的位序p = L.elem; //p的初值为第1个元素的储存位置while(i <= L.length && !(* compare)(*p++,e)) ++i;if(i <= L.length) return i;else return 0;} //该函数的时间复杂度为O(n)Status Clear_Sq(SqList &L){ElemType elem;free(L.elem);L.elem = NULL;return OK;}void Print_Sq(SqList L){int i;for(i = 0; i < L.length; i++)printf("%2c",L.elem[i]);if(L.length == 0) printf("该集合为空集");printf("nttt#t此集合中的个数 n = %dnn",L.length);}void Union_Sq(SqList La,SqList Lb,SqList &Lc){int i;ElemType elem;Lc.length=0;for(i = 0; i < La.length; i++)Lc.elem[Lc.length++]=La.elem[i];for(i = 1; i <= Lb.length; i++){elem = Lb.elem[i-1];if(!LocateElem_Sq(La,elem,Equal))ListInsert_Sq(Lc,Lc.length+1,elem);}}void Mix_Sq(SqList La,SqList Lb,SqList &Lc){int i;ElemType elem;Lc.length = 0;for(i = 1; i <= La.length; i++){elem = La.elem[i-1];if(LocateElem_Sq(Lb,elem,Equal))ListInsert_Sq(Lc,Lc.length+1,elem);}}void Differ_Sq(SqList La,SqList Lb,SqList &Lc){int i;ElemType elem;Lc.length = 0;for(i = 1; i <= La.length; i++){elem = La.elem[i-1];if(!LocateElem_Sq(Lb,elem,Equal))ListInsert_Sq(Lc,Lc.length+1,elem);}}void Comple_Sq(SqList La,SqList Lb,SqList &Lc,SqList &Ld){int i;ElemType elem;Ld.length = 0;Union_Sq(La,Lb,Lc);for(i = 1; i <= Lc.length; i++){elem = Lc.elem[i-1];if(!LocateElem_Sq(La,elem,Equal))ListInsert_Sq(Ld,Ld.length+1,elem);}}void Index_Sq(){char s;int l;l = 1;InitList_Sq(La);printf("ttt|****** 请输入你的第一个集合:******|n");printf("ttt");CreateList_Sq(La);printf("ttt#t集合A为");Print_Sq(La); //实现表LA的操作printf("tnn");InitList_Sq(Lb);printf("ttt|****** 请输入你的第二个集合:******|n");printf("ttt");CreateList_Sq(Lb);printf("ttt#t集合B为");Print_Sq(Lb); //实现表LB的操作printf("tnn");InitList_Sq(Lc); //初始化表LC的操作InitList_Sq(Ld); //初始化表Ld的操作while(l){printf("tt|******* 您可以选择a、b、c或者d执行以下操作 ******|nn");printf("tt|************* a、进行集合的并运算 ***************|n");printf("tt|************* b、进行集合的交运算 ***************|n");printf("tt|************* c、进行集合的差运算 ***************|n");printf("tt|************* d、进行集合的补运算 ***************|n");printf("tt|************* e、重新建立两个集合 ***************|n");printf("ttt");scanf("%c",&s);switch(s){case 'a' : Union_Sq(La,Lb,Lc);printf("ttt#t集合A与集合B的并集为:");Print_Sq(Lc); //实现表LA与表LB并集的操作printf("n");break;case 'b' : Mix_Sq(La,Lb,Lc);printf("ttt#t集合A与集合B的交集为:");Print_Sq(Lc); //实现表LA与表LB交集的操作printf("n");break;case 'c' : Differ_Sq(La,Lb,Lc);printf("ttt#t集合A与集合B的差集为:");Print_Sq(Lc); //实现表LA与表LB差集的操作printf("n");break;case 'd' : Comple_Sq(La,Lb,Lc,Ld);printf("ttt#t集合A的补集为:");Print_Sq(Ld); //实现表LA的补集操作printf("n");break;case 'e' : Clear_Sq(La);Clear_Sq(Lb);Clear_Sq(Lc);Clear_Sq(Ld);getchar();Index_Sq();break;default : printf("ttt#tenter data error!n");printf("n");}printf("tt|**** 您是否还想继续计算。
是请输入1,否请输入0 ****|n");printf("ttt");scanf("%d",&l);getchar();}//while语句判断是否继续printf("ntt|**************** 欢迎使用,谢谢!*****************|n");getchar();}int main(){printf("tt|************* 欢迎使用集合操作运算器 ************|n");Index_Sq();return 0;}如果觉得对你有帮助的话,可以关注点赞收藏支持下哦!

  • 收藏

分享给我的朋友们:

上一篇:《九成宫》结构之斜中求正范字:力、分、夕、乃 下一篇:天燃气热水器选购注意什么 天燃气热水器的禁忌是什么

一键免费领取报价清单 专享六大服务礼包

装修全程保障

免费户型设计+免费装修报价

已有312290人领取

关键字: 装修设计 装修公司 别墅装修设计

发布招标得免费设计

申请装修立省30%

更多装修专区

点击排行