(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语言算法(线性表顺序结构实现):

[cpp]  view plain  copy
  1. /**求集合的并集的函数**/  
  2. void Union_Sq(SqList La,SqList Lb,SqList &Lc){  
  3. int i;  
  4. ElemType elem;  
  5. Lc.length=0;  
  6. for(i = 0; i < La.length; i++)  
  7. Lc.elem[Lc.length++]=La.elem[i];  
  8. for(i = 1; i <= Lb.length; i++){  
  9. elem = Lb.elem[i-1];  
  10. if(!LocateElem_Sq(La,elem,Equal))  
  11. ListInsert_Sq(Lc,Lc.length+1,elem);  
  12.    }  
  13. }  


(3)两个集合的交运算:把数组A中元素逐一与数组B中的元素进行比较,将相同的元素放在数组C中,数组C便是集合A和集合B的交。
  c语言算法(线性表顺序结构实现):

[cpp]  view plain  copy
  1. /**求集合的交集的函数**/  
  2. void Mix_Sq(SqList La,SqList Lb,SqList &Lc){  
  3. int i;  
  4. ElemType elem;  
  5. Lc.length = 0;  
  6. for(i = 1; i <= La.length; i++){  
  7. elem = La.elem[i-1];  
  8. if(LocateElem_Sq(Lb,elem,Equal))  
  9. ListInsert_Sq(Lc,Lc.length+1,elem);  
  10.    }  
  11. }  


(4)两个集合的差运算:将数组A中的元素逐一与数组B中的元素进行比较,把数组A与数组B不同的元素保存在数组C中,数组C便是集合A和集合B的差A-B。
  C语言算法(线性表顺序结构实现):

[cpp]  view plain  copy
  1. /**求集合的差集函数**/  
  2. void Differ_Sq(SqList La,SqList Lb,SqList &Lc){  
  3. int i;  
  4. ElemType elem;  
  5. Lc.length = 0;  
  6. for(i = 1; i <= La.length; i++){  
  7. elem = La.elem[i-1];  
  8. if(!LocateElem_Sq(Lb,elem,Equal))  
  9. ListInsert_Sq(Lc,Lc.length+1,elem);  
  10.    }  
  11. }  


(5)集合的补运算:将数组E中的元素逐一与数组A中的元素进行比较,把不相同的元素保存到数组C中,数组C便是集合A关于集合E的补集。
  求补集是一种特殊的集合差运算。
   C语言算法(线性表顺序结构实现):

[cpp]  view plain  copy
  1. /**求集合的补集函数**/  
  2. void Comple_Sq(SqList La,SqList Lb,SqList &Lc,SqList &Ld){  
  3. int i;  
  4. ElemType elem;  
  5. Ld.length = 0;  
  6. Union_Sq(La,Lb,Lc);  
  7. for(i = 1; i <= Lc.length; i++){  
  8. elem = Lc.elem[i-1];  
  9. if(!LocateElem_Sq(La,elem,Equal))  
  10. ListInsert_Sq(Ld,Ld.length+1,elem);  
  11. }  
  12. }  

二.源程序如下:

[cpp]  view plain  copy
  1. #include<stdio.h>  
  2. #include<stdlib.h>  

  3. #define LIST_INIT_SIZE 100 //初始表空间大小  
  4. #define LISTINCREMENT 10 //表长增量  


  5. /**顺序表的定义**/  
  6. typedef struct
  7. {  
  8. char *elem; /**储存空间基地址**/  
  9. int length; /**当前长度**/  
  10. int listsize; /**当前分配的储存容量(以sizeof(Elemtype)为单位)**/  
  11. }SqList;  
  12.    
  13. SqList La,Lb,Lc,Ld; /**定义全局变量**/  
  14.    
  15. /**构造一个空的线性表L**/  
  16. int InitList_Sq(SqList &L)
  17. {  
  18. L.elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType));  
  19. if(!L.elem) exit(OVERFLOW); /**储存分配失败**/  
  20. L.length = 0; /**空表长度为0**/  
  21. L.listsize = LIST_INIT_SIZE; /**初始储存容量**/  
  22. return 0;  
  23. /**该函数的时间复杂度为O(n)**/  
  24.    
  25. /**在顺序表的逻辑为i的位置插入新元素e的函数**/  
  26. int ListInsert_Sq(SqList &L,int i,int e)
  27. {  
  28. char *newbase,*p,*q;  
  29. //i的合法值为(1 <= i <= L.length_Sq(L) + 1)  
  30. //异常处理  
  31. if(i < 1 || i > L.length + 1) return ERROR;  
  32. if(L.length >= L.listsize)
  33. //当前储存空间已满,增加分配  
  34. newbase = (ElemType *)realloc(L.elem,(L.listsize + LISTINCREMENT) * sizeof(int));  
  35. if(!newbase) exit(OVERFLOW); //储存分配失败  
  36. L.elem = newbase; //新基址  
  37. L.listsize += LISTINCREMENT; //增加储存容量  
  38. }  
  39. q = &(L.elem[i - 1]); //q为插入位置  
  40. for(p = &(L.elem[L.length - 1]); p >= q; --p)   
  41. *(p + 1) = *p; //插入位置及之后的元素往右移  
  42. *q = e; //插入e  
  43. ++L.length; //表长加1  
  44. return 0;  
  45. }  
  46.    
  47. /**创建一个线性表,即输入数据,根据集合定义:集合中的元素不能相等创建**/  
  48. void CreateList_Sq(SqList &L){  
  49. char ch;  
  50. int inlist = FALSE,j;  
  51. while((ch) != '\n'){  
  52. scanf("%c",&ch);  
  53. for(j = 0; j < L.length; j++)  
  54. if(ch == L.elem[j]){  
  55. inlist = TRUE;  
  56. break;  
  57. }  
  58. else  
  59. inlist = FALSE;  
  60. if(!inlist && ch != '\n') ListInsert_Sq(L,L.length+1,ch);  
  61. }  
  62. }  
  63. /**判断两元素是否相等,若相等则返回TRUE;否则返回FALSE**/  
  64. int Equal(int a,int b)
  65. {  
  66. if(a == b) return TRUE;  
  67. else return FALSE;  
  68. }  
  69.    
  70. /**在顺序线性表L中查找第1个与e满足compare()的元素位序,若找到,则返回其在L中的位序,否则返回0**/  
  71. int LocateElem_Sq(SqList L,char e,int(* compare)(int,int))
  72. {  
  73. char *p;  
  74. int i;  
  75. i = 1; //i的初值为第1个元素的位序  
  76. p = L.elem; //p的初值为第1个元素的储存位置  
  77. while(i <= L.length && !(* compare)(*p++,e)) ++i;  
  78. if(i <= L.length) return i;  
  79. else return 0;  
  80. //该函数的时间复杂度为O(n)  
  81.    
  82. /*销毁线性表的函数*/  
  83. int Clear_Sq(SqList &L)
  84. {  
  85. char elem;  
  86. free(L.elem);  
  87. L.elem = NULL;  
  88. return OK;  
  89. }  
  90.    
  91. /**打印顺序表函数**/  
  92. void Print_Sq(SqList L)
  93. {  
  94. int i;  
  95. for(i = 0; i < L.length; i++)  
  96. printf("%2c",L.elem[i]);  
  97. if(L.length == 0) printf("该集合为空集");   
  98. printf(" n = %d\n\n",L.length);  
  99. }  
  100.    
  101. /**求集合的并集的函数**/  
  102. void Union_Sq(SqList La,SqList Lb,SqList &Lc)
  103. {  
  104. int i;  
  105. char elem;  
  106. Lc.length=0;  
  107. for(i = 0; i < La.length; i++)  
  108. Lc.elem[Lc.length++]=La.elem[i];  
  109. for(i = 1; i <= Lb.length; i++)
  110. {  
  111. elem = Lb.elem[i-1];  
  112. if(!LocateElem_Sq(La,elem,Equal))  
  113. ListInsert_Sq(Lc,Lc.length+1,elem);  
  114.    }  
  115. }  
  116.    
  117. /**求集合的交集的函数**/  
  118. void Mix_Sq(SqList La,SqList Lb,SqList &Lc)
  119. {  
  120. int i;  
  121. char elem;  
  122. Lc.length = 0;  
  123. for(i = 1; i <= La.length; i++){  
  124. elem = La.elem[i-1];  
  125. if(LocateElem_Sq(Lb,elem,Equal))  
  126. ListInsert_Sq(Lc,Lc.length+1,elem);  
  127.    }  
  128. }  
  129.    
  130. /**求集合的差集函数**/  
  131. void Differ_Sq(SqList La,SqList Lb,SqList &Lc)
  132. {  
  133. int i;  
  134. char elem;  
  135. Lc.length = 0;  
  136. for(i = 1; i <= La.length; i++){  
  137. elem = La.elem[i-1];  
  138. if(!LocateElem_Sq(Lb,elem,Equal))  
  139. ListInsert_Sq(Lc,Lc.length+1,elem);  
  140.    }  
  141. }  
  142.    
  143. /**求集合的补集函数**/  
  144. void Comple_Sq(SqList La,SqList Lb,SqList &Lc,SqList &Ld)
  145. {  
  146. int i;  
  147. char elem;  
  148. Ld.length = 0;  
  149. Union_Sq(La,Lb,Lc);  
  150. for(i = 1; i <= Lc.length; i++)
  151. {  
  152. elem = Lc.elem[i-1];  
  153. if(!LocateElem_Sq(La,elem,Equal))  
  154. ListInsert_Sq(Ld,Ld.length+1,elem);  
  155. }  
  156. }  


  • 2
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值