鱼C论坛

 找回密码
 立即注册
查看: 10997|回复: 11

数据结构 一个题目要求用C语言实现 求两个集合的交并补差集的运算 我的源代码有一点

[复制链接]
发表于 2013-6-21 11:58:22 | 显示全部楼层 |阅读模式
30鱼币
本帖最后由 权志龙_爱死你la 于 2013-6-21 12:00 编辑

数据结构  一个题目要求用C语言实现 求两个集合的交并补差集的运算 我的源代码有一点问题  不能运行出来  我感觉有问题的部分是void readdata_element(element *head)//键盘输入每个集合的元素  这个函数  求大家帮忙看看 谢谢
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #define NULL 0
  4. typedef struct element//集合元素的结构体
  5. {
  6. char data;
  7. struct element *next;
  8. }element;

  9. element init_element(element *head)//初始化集合(集合是用单链表存储结构存储的)
  10. {
  11. head=(element*)malloc(sizeof(struct element));
  12. head->next=NULL;
  13. return *head;
  14. }
  15. void readdata_element(element *head)//键盘输入每个集合的元素
  16. {
  17. char c;
  18. printf("请输入集合中的数据元素(以“F”为结束标志,结束输入):\n");
  19. scanf("%c",&c);
  20. while(c!='F')
  21. {
  22. if((c>'a' && c<'z') ||( c>'0' && c<'9'))
  23. {
  24. element *p;
  25. p=(element*)malloc(sizeof(struct element));
  26. p->data=c;
  27. p->next=head->next;
  28. head->next=p;
  29. scanf("%c",&c);
  30. }
  31. else
  32. printf("输入错误!必须是小写字母或者0~9的数字!请重新输入:\n");
  33. }

  34. }
  35. void display_element(element * head)//输出集合中的所有元素
  36. {
  37. element *p;
  38. p=head->next;
  39. while(p!=NULL)
  40. {
  41. printf("%c",p->data);
  42. p=p->next;
  43. }
  44. printf("\n");
  45. }
  46. void bing_element(element *head1,element * head2,element * head3)//求两个集合的并集
  47. {
  48. element *p1,*p2,*p3;
  49. p1=head1->next;
  50. while(p1!=NULL)
  51. {
  52. p3=(element*)malloc(sizeof(struct element));
  53. p3->data=p1->data;
  54. p3->next=head3->next;
  55. head3->next=p3;
  56. p1=p1->next;
  57. }
  58. p2=head2->next;
  59. while(p2!=NULL)
  60. {
  61. p1=head1->next;
  62. while((p1!=NULL) && (p1->data!=p2->data))
  63. p1=p1->next;
  64. if(p1==NULL)
  65. {
  66. p3=(element*)malloc(sizeof(struct element));
  67. p3->data=p2->data;
  68. p3->next=head3->next;
  69. head3->next=p3;
  70. }
  71. p2=p2->next;
  72. }
  73. }
  74. void jiao_element(element *head1,element *head2,element *head3)//求两个集合的交集
  75. {
  76. element *p1,*p2,*p3;
  77. p1=head1->next;
  78. while(p1!=NULL)
  79. {
  80. p2=head2->next;
  81. while((p2!=NULL) && (p2->data!=p1->data))
  82. p2=p2->next;
  83. if(p2->data==p1->data)
  84. {
  85. p3=(element*)malloc(sizeof(struct element));
  86. p3->data=p1->data;
  87. p3->next=head3->next;
  88. head3->next=p3;
  89. }
  90. p1=p1->next;
  91. }
  92. }
  93. void cha_element(element *head1,element *head2,element *head3)//求两个集合的差集
  94. {
  95. element *p1,*p2,*p3;
  96. p1=head1->next;
  97. while(p1!=NULL)
  98. {
  99. p2=head2->next;
  100. while((p2!=NULL) && (p2->data!=p1->data))
  101. p2=p2->next;
  102. if(p2==NULL)
  103. {
  104. p3=(element*)malloc(sizeof(struct element));
  105. p3->data=p1->data;
  106. p3->next=head3->next;
  107. head3->next=p3;
  108. }
  109. p1=p1->next;
  110. }
  111. }
  112. void bu_element(element *head1,element *head2,element *head3)//求集合的补集
  113. {
  114. element *p1,*p2,*p3;
  115. p1=head1->next;
  116. p2=head2->next;
  117. while(p1!=NULL)
  118. {
  119. while((p2!=NULL) && (p1->data!=p2->data))
  120. {
  121. p2=p2->next;
  122. }
  123. if(p2==NULL)
  124. {
  125. p3->data=p1->data;
  126. p3->next=head3->next;
  127. head3->next=p3;
  128. p3=head3->next;
  129. }
  130. p1=p1->next;
  131. }
  132. }
  133. void main()
  134. {
  135. element *head1,*head2,*head3,*head4;
  136. init_element(head1);
  137. init_element(head2);
  138. init_element(head3);
  139. init_element(head4);
  140. printf("请输入集合1:\n");
  141. readdata_element(head1);

  142. printf("请输入集合2:\n");
  143. readdata_element(head2);


  144. printf("请输入集合3(全集):\n");
  145. readdata_element(head3);

  146. printf("集合1为:\n");
  147. display_element(head1);
  148. printf("集合2为:\n");
  149. display_element(head2);
  150. printf("集合3(全集)为:\n");
  151. display_element(head3);
  152. char c1;
  153. printf("运算目录\nA、集合1与集合2的并集\nB、集合1与集合2的交集\nC、集合1与集合2的差集\nD、集合1的补集\nE、集合2的补集\n");
  154. scanf("%c",&c1);
  155. if(c1=='A')
  156. {
  157. printf("集合1与集合2的并集为:\n");
  158. bing_element(head1,head2,head4);
  159. display_element(head4);
  160. head4->next=NULL;
  161. }
  162. if(c1=='B')
  163. {
  164. printf("集合1与集合2的交集为:\n");
  165. bing_element(head1,head2,head4);
  166. display_element(head4);
  167. head4->next=NULL;
  168. }
  169. if(c1=='C')
  170. {
  171. printf("集合1与集合2的差集为:\n");
  172. bing_element(head1,head2,head4);
  173. display_element(head4);
  174. head4->next=NULL;
  175. }
  176. if(c1=='D')
  177. {
  178. printf("集合1的补集为:\n");
  179. bing_element(head3,head1,head4);
  180. display_element(head4);
  181. head4->next=NULL;
  182. }
  183. if(c1=='E')
  184. {
  185. printf("集合2的补集为:\n");
  186. bing_element(head3,head2,head4);
  187. display_element(head4);
  188. head4->next=NULL;
  189. }
  190. }
复制代码


最佳答案

查看完整内容

下面是把交集和补集改过之后的,顺便改成了c风格的 没有用到c++的引用,而是用的二级指针
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-6-21 11:58:23 | 显示全部楼层
本帖最后由 熊文杰 于 2013-6-23 00:57 编辑

下面是把交集和补集改过之后的,顺便改成了c风格的 没有用到c++的引用,而是用的二级指针
  1. #include <string.h>
  2. #include<stdio.h>
  3. #include<stdlib.h>
  4. #define NULL 0
  5. typedef struct element//集合元素的结构体
  6. {
  7.         char data;
  8.         struct element *next;
  9. }element;

  10. element* init_element(element *head)//初始化集合(集合是用单链表存储结构存储的)
  11. {
  12.         head=(element*)malloc(sizeof(struct element));
  13.         head->next=NULL;
  14.         return head;
  15. }
  16. void readdata_element(element **_head)//键盘输入每个集合的元素
  17. {
  18.         static char szBuf[256] = {0};
  19.         element *head = *_head;
  20.         
  21.         printf("请输入集合中的数据元素(以“F”为结束标志,结束输入):\n");
  22.         scanf("%s",szBuf);

  23.         int i = 0;
  24.         while(szBuf[i] != 'F')
  25.         {
  26.                
  27.                 if((szBuf[i]>='a' && szBuf[i]<='z') ||( szBuf[i]>='0' && szBuf[i]<='9'))
  28.                 {
  29.                         element *p;
  30.                         p=(element*)malloc(sizeof(struct element));
  31.                         p->data=szBuf[i];
  32.                         p->next=head->next;
  33.                         head->next=p;
  34.                 }
  35.                 else
  36.                 {
  37.                         printf("输入错误!必须是小写字母或者0~9的数字!请重新输入:\n");
  38.                         break;
  39.                 }
  40.                 i++;        
  41.         }
  42.         memset(szBuf,0,256);
  43. }


  44. void display_element(element *head)//输出集合中的所有元素
  45. {
  46.         element *p;
  47.         p=head->next;
  48.         while(p!=NULL)
  49.         {
  50.                 printf("%c",p->data);
  51.                 p=p->next;
  52.         }
  53.         printf("\n");
  54. }
  55. void bing_element(element *head1,element * head2,element * &head3)//求两个集合的并集
  56. {
  57.         element *p1,*p2,*p3;
  58.         p1=head1->next;
  59.         while(p1!=NULL)
  60.         {
  61.                 p3=(element*)malloc(sizeof(struct element));
  62.                 p3->data=p1->data;
  63.                 p3->next=head3->next;
  64.                 head3->next=p3;
  65.                 p1=p1->next;
  66.         }
  67.         p2=head2->next;
  68.         while(p2!=NULL)
  69.         {
  70.                 p1=head1->next;
  71.                 while((p1!=NULL) && (p1->data!=p2->data))
  72.                         p1=p1->next;
  73.                 if(p1==NULL)
  74.                 {
  75.                         p3=(element*)malloc(sizeof(struct element));
  76.                         p3->data=p2->data;
  77.                         p3->next=head3->next;
  78.                         head3->next=p3;
  79.                 }
  80.                 p2=p2->next;
  81.         }
  82. }
  83. void jiao_element(element *head1,element *head2,element **head3)//求两个集合的交集
  84. {
  85.         element *p1,*p2,*p3;
  86.         p1=head1->next;
  87.         while(p1!=NULL)
  88.         {
  89.                 p2=head2->next;
  90.                 while((p2!=NULL) && (p2->data!=p1->data))
  91.                 {
  92.                         p2=p2->next;
  93.                 }
  94.                         
  95.                 if(p2 != NULL  && p2->data==p1->data)
  96.                 {
  97.                         p3=(element*)malloc(sizeof(struct element));
  98.                         p3->data=p1->data;
  99.                         p3->next=(*head3)->next;
  100.                         (*head3)->next=p3;
  101.                 }
  102.                 p1=p1->next;
  103.         }
  104. }
  105. void cha_element(element *head1,element *head2,element **head3)//求两个集合的差集
  106. {
  107.         element *p1,*p2,*p3;
  108.         p1=head1->next;
  109.         while(p1!=NULL)
  110.         {
  111.                 p2=head2->next;
  112.                 while((p2!=NULL) && (p2->data!=p1->data))
  113.                         p2=p2->next;
  114.                 if(p2==NULL)
  115.                 {
  116.                         p3=(element*)malloc(sizeof(struct element));
  117.                         p3->data=p1->data;
  118.                         p3->next=(*head3)->next;
  119.                         (*head3)->next=p3;
  120.                 }
  121.                 p1=p1->next;
  122.         }
  123. }

  124. //第一个参数是全集
  125. void bu_element(element *head1,element *head2,element **head3)//求集合的补集
  126. {
  127.         element *p1,*p2,*p3;
  128.         p1=head1->next;
  129.         
  130.         while(p1!=NULL)
  131.         {
  132.                 p2=head2->next;
  133.                 while((p2!=NULL) && (p1->data!=p2->data))
  134.                 {
  135.                         p2=p2->next;
  136.                 }
  137.                 if(p2==NULL)
  138.                 {
  139.                         p3=(element*)malloc(sizeof(struct element));
  140.                         p3->data=p1->data;
  141.                         p3->next=(*head3)->next;
  142.                         (*head3)->next=p3;
  143.                 }
  144.                 p1=p1->next;
  145.         }
  146. }

  147. int main()
  148. {
  149.         element *head1,*head2,*head3,*head4;
  150.         element *p = NULL;
  151.         head1=init_element(p);
  152.         head2=init_element(p);
  153.         head3=init_element(p);
  154.         head4=init_element(p);
  155.         printf("请输入集合1:\n");
  156.         readdata_element(&head1);

  157.         printf("请输入集合2:\n");
  158.         readdata_element(&head2);


  159.         printf("请输入集合3(全集):\n");
  160.         readdata_element(&head3);

  161.         printf("集合1为:\n");
  162.         display_element(head1);
  163.         printf("集合2为:\n");
  164.         display_element(head2);
  165.         printf("集合3(全集)为:\n");
  166.         display_element(head3);
  167.         char c1 ;
  168.         printf("运算目录\nA、集合1与集合2的并集\nB、集合1与集合2的交集\nC、集合1与集合2的差集\nD、集合1的补集\nE、集合2的补集\n");

  169.         fflush(stdin);
  170.         scanf("%c",&c1);


  171.         if('A' == c1)
  172.         {
  173.                 printf("集合1与集合2的并集为:\n");
  174.                 bing_element(head1,head2,head4);
  175.                 display_element(head4);
  176.                 head4->next=NULL;
  177.         }
  178.         else if('B' == c1)
  179.         {
  180.                 printf("集合1与集合2的交集为:\n");
  181.                 jiao_element(head1,head2,&head4);
  182.                 display_element(head4);
  183.                 head4->next=NULL;
  184.         }
  185.         else if('C' == c1)
  186.         {
  187.                 printf("集合1与集合2的差集为:\n");
  188.                 cha_element(head1,head2,&head4);
  189.                 display_element(head4);
  190.                 head4->next=NULL;
  191.         }
  192.         else if('D' == c1)
  193.         {
  194.                 printf("集合1的补集为:\n");
  195.                 bu_element(head3,head1,&head4);
  196.                 display_element(head4);
  197.                 head4->next=NULL;
  198.         }
  199.         else if('E' == c1)
  200.         {
  201.                 printf("集合2的补集为:\n");
  202.                 bu_element(head3,head2,&head4);
  203.                 display_element(head4);
  204.                 head4->next=NULL;
  205.         }
  206.         system("pause");
  207.         return 0;
  208. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-6-21 21:59:46 | 显示全部楼层
学习学习!!!!!!!!!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-6-22 02:33:12 | 显示全部楼层
只帮你改得可以运行,还有一些逻辑上的问题,楼主自己处理一下把
  1. #include <string.h>
  2. #include<stdio.h>
  3. #include<stdlib.h>
  4. #define NULL 0
  5. typedef struct element//集合元素的结构体
  6. {
  7.         char data;
  8.         struct element *next;
  9. }element;

  10. element init_element(element *&head)//初始化集合(集合是用单链表存储结构存储的)
  11. {
  12.         head=(element*)malloc(sizeof(struct element));
  13.         head->next=NULL;
  14.         return *head;
  15. }
  16. void readdata_element(element *&head)//键盘输入每个集合的元素
  17. {
  18.         static char szBuf[256] = {0};
  19.        
  20.         printf("请输入集合中的数据元素(以“F”为结束标志,结束输入):\n");
  21.         scanf("%s",szBuf);

  22.         int i = 0;
  23.         while(szBuf[i] != 'F')
  24.         {
  25.                
  26.                 if((szBuf[i]>'a' && szBuf[i]<'z') ||( szBuf[i]>'0' && szBuf[i]<'9'))
  27.                 {
  28.                         element *p;
  29.                         p=(element*)malloc(sizeof(struct element));
  30.                         p->data=szBuf[i];
  31.                         p->next=head->next;
  32.                         head->next=p;
  33.                 }
  34.                 else
  35.                 {
  36.                         printf("输入错误!必须是小写字母或者0~9的数字!请重新输入:\n");
  37.                         break;
  38.                 }
  39.                 i++;       
  40.         }
  41.         memset(szBuf,0,256);
  42. }


  43. void display_element(element *head)//输出集合中的所有元素
  44. {
  45.         element *p;
  46.         p=head->next;
  47.         while(p!=NULL)
  48.         {
  49.                 printf("%c",p->data);
  50.                 p=p->next;
  51.         }
  52.         printf("\n");
  53. }
  54. void bing_element(element *head1,element * head2,element * &head3)//求两个集合的并集
  55. {
  56.         element *p1,*p2,*p3;
  57.         p1=head1->next;
  58.         while(p1!=NULL)
  59.         {
  60.                 p3=(element*)malloc(sizeof(struct element));
  61.                 p3->data=p1->data;
  62.                 p3->next=head3->next;
  63.                 head3->next=p3;
  64.                 p1=p1->next;
  65.         }
  66.         p2=head2->next;
  67.         while(p2!=NULL)
  68.         {
  69.                 p1=head1->next;
  70.                 while((p1!=NULL) && (p1->data!=p2->data))
  71.                         p1=p1->next;
  72.                 if(p1==NULL)
  73.                 {
  74.                         p3=(element*)malloc(sizeof(struct element));
  75.                         p3->data=p2->data;
  76.                         p3->next=head3->next;
  77.                         head3->next=p3;
  78.                 }
  79.                 p2=p2->next;
  80.         }
  81. }
  82. void jiao_element(element *head1,element *head2,element *&head3)//求两个集合的交集
  83. {
  84.         element *p1,*p2,*p3;
  85.         p1=head1->next;
  86.         while(p1!=NULL)
  87.         {
  88.                 p2=head2->next;
  89.                 while((p2!=NULL) && (p2->data!=p1->data))
  90.                         p2=p2->next;
  91.                 if(p2->data==p1->data)
  92.                 {
  93.                         p3=(element*)malloc(sizeof(struct element));
  94.                         p3->data=p1->data;
  95.                         p3->next=head3->next;
  96.                         head3->next=p3;
  97.                 }
  98.                 p1=p1->next;
  99.         }
  100. }
  101. void cha_element(element *head1,element *head2,element *&head3)//求两个集合的差集
  102. {
  103.         element *p1,*p2,*p3;
  104.         p1=head1->next;
  105.         while(p1!=NULL)
  106.         {
  107.                 p2=head2->next;
  108.                 while((p2!=NULL) && (p2->data!=p1->data))
  109.                         p2=p2->next;
  110.                 if(p2==NULL)
  111.                 {
  112.                         p3=(element*)malloc(sizeof(struct element));
  113.                         p3->data=p1->data;
  114.                         p3->next=head3->next;
  115.                         head3->next=p3;
  116.                 }
  117.                 p1=p1->next;
  118.         }
  119. }
  120. void bu_element(element *head1,element *head2,element *&head3)//求集合的补集
  121. {
  122.         element *p1,*p2,*p3;
  123.         p1=head1->next;
  124.         p2=head2->next;
  125.         while(p1!=NULL)
  126.         {
  127.                 while((p2!=NULL) && (p1->data!=p2->data))
  128.                 {
  129.                         p2=p2->next;
  130.                 }
  131.                 if(p2==NULL)
  132.                 {
  133.                         p3->data=p1->data;
  134.                         p3->next=head3->next;
  135.                         head3->next=p3;
  136.                         p3=head3->next;
  137.                 }
  138.                 p1=p1->next;
  139.         }
  140. }

  141. int main()
  142. {
  143.         element *head1,*head2,*head3,*head4;
  144.         init_element(head1);
  145.         init_element(head2);
  146.         init_element(head3);
  147.         init_element(head4);
  148.         printf("请输入集合1:\n");
  149.         readdata_element(head1);

  150.         printf("请输入集合2:\n");
  151.         readdata_element(head2);


  152.         printf("请输入集合3(全集):\n");
  153.         readdata_element(head3);

  154.         printf("集合1为:\n");
  155.         display_element(head1);
  156.         printf("集合2为:\n");
  157.         display_element(head2);
  158.         printf("集合3(全集)为:\n");
  159.         display_element(head3);
  160.         char c1 ;
  161.         printf("运算目录\nA、集合1与集合2的并集\nB、集合1与集合2的交集\nC、集合1与集合2的差集\nD、集合1的补集\nE、集合2的补集\n");

  162.         fflush(stdin);
  163.         scanf("%c",&c1);
  164.        

  165.         if('A' == c1)
  166.         {
  167.                 printf("集合1与集合2的并集为:\n");
  168.                 bing_element(head1,head2,head4);
  169.                 display_element(head4);
  170.                 head4->next=NULL;
  171.         }
  172.         else if('B' == c1)
  173.         {
  174.                 printf("集合1与集合2的交集为:\n");
  175.                 bing_element(head1,head2,head4);
  176.                 display_element(head4);
  177.                 head4->next=NULL;
  178.         }
  179.         else if('C' == c1)
  180.         {
  181.                 printf("集合1与集合2的差集为:\n");
  182.                 bing_element(head1,head2,head4);
  183.                 display_element(head4);
  184.                 head4->next=NULL;
  185.         }
  186.         else if('D' == c1)
  187.         {
  188.                 printf("集合1的补集为:\n");
  189.                 bing_element(head3,head1,head4);
  190.                 display_element(head4);
  191.                 head4->next=NULL;
  192.         }
  193.         else if('E' == c1)
  194.         {
  195.                 printf("集合2的补集为:\n");
  196.                 bing_element(head3,head2,head4);
  197.                 display_element(head4);
  198.                 head4->next=NULL;
  199.         }
  200.         system("pause");
  201.         return 0;
  202. }
复制代码

评分

参与人数 1鱼币 +1 收起 理由
fanki + 1 热爱鱼C^_^给力

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-6-22 10:03:17 | 显示全部楼层
哇,只知道并查集是怎么搞的,但是不知道交集和补集怎么求
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-6-22 11:55:58 | 显示全部楼层
三楼用了一些c++的语法,正解的,如果c的话把传参的引用& 不要就可以
判断那里应该要加=号吧。
我也看了看~~学习~~这是代码:
void readdata_element(element *head)//键盘输入每个集合的元素
{
        static char szBuf[256] = {0};
        printf( "请输入集合中的数据元素(以“F”为结束标志,结束输入):\n" );
        scanf( "%s", szBuf );
        int i = 0;
        while( szBuf[i] != 'F' )
        {
                if( ( szBuf[i] >= 'a' && szBuf[i] <= 'z') || ( szBuf[i] >= '0' && szBuf[i] <= '9' ) )
                {
                        element *p;
                        p = ( element* )malloc( sizeof( struct element ) );
                        p->data = szBuf[i];
                        p->next = head->next;
                        head->next = p;
                }
                else
                {
                        //printf("输入错误!必须是小写字母或者0~9的数字!请重新输入:\n");
                        break;
                }
                i++;        
        }
        memset( szBuf, 0, 256 );
}
一起学习,希望对大家有帮助。{:7_155:}支持支持
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-6-22 17:25:33 | 显示全部楼层
牛逼{:7_155:}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-6-22 20:00:20 | 显示全部楼层

根据你的建议 我将代码改成下面这样 但是不能正确计算补集和交集啊  两个函数看了很多遍 还是不知道是错在函数里 还是主函数里 麻烦你再帮我看一下,谢谢
  1. #include <string.h>
  2. #include<stdio.h>
  3. #include<stdlib.h>
  4. #define NULL 0
  5. typedef struct element//集合元素的结构体
  6. {
  7.         char data;
  8.         struct element *next;
  9. }element;

  10. element* init_element()//初始化集合(集合是用单链表存储结构存储的)
  11. {
  12.         element *head;
  13.         head=(element*)malloc(sizeof(struct element));
  14.         head->next=NULL;
  15.         return head;
  16. }
  17. void readdata_element(element *head)//键盘输入每个集合的元素
  18. {
  19.         static char szBuf[256] = {0};
  20.         printf( "请输入集合中的数据元素:\n" );
  21.         scanf( "%s", szBuf );
  22.         int i = 0;
  23.         while( szBuf[i] != 'F' )
  24.         {
  25.                 if( ( szBuf[i] >= 'a' && szBuf[i] <= 'z') || ( szBuf[i] >= '0' && szBuf[i] <= '9' ) )
  26.                 {
  27.                         element *p;
  28.                         p = ( element* )malloc( sizeof( struct element ) );
  29.                         p->data = szBuf[i];
  30.                         p->next = head->next;
  31.                         head->next = p;
  32.                 }
  33.                 else
  34.                 {
  35.                         //printf("输入错误!必须是小写字母或者0~9的数字!请重新输入:\n");
  36.                         break;
  37.                 }
  38.                 i++;        
  39.         }
  40.         memset( szBuf, 0, 256 );
  41. }


  42. void display_element(element *head)//输出集合中的所有元素
  43. {
  44.         element *p;
  45.         p=head->next;
  46.         while(p!=NULL)
  47.         {
  48.                 printf("%c",p->data);
  49.                 p=p->next;
  50.         }
  51.         printf("\n");
  52. }
  53. void bing_element(element *head1,element * head2,element * &head3)//求两个集合的并集
  54. {
  55.         element *p1,*p2,*p3;
  56.         p1=head1->next;
  57.         while(p1!=NULL)
  58.         {
  59.                 p3=(element*)malloc(sizeof(struct element));
  60.                 p3->data=p1->data;
  61.                 p3->next=head3->next;
  62.                 head3->next=p3;
  63.                 p1=p1->next;
  64.         }
  65.         p2=head2->next;
  66.         while(p2!=NULL)
  67.         {
  68.                 p1=head1->next;
  69.                 while((p1!=NULL) && (p1->data!=p2->data))
  70.                         p1=p1->next;
  71.                 if(p1==NULL)
  72.                 {
  73.                         p3=(element*)malloc(sizeof(struct element));
  74.                         p3->data=p2->data;
  75.                         p3->next=head3->next;
  76.                         head3->next=p3;
  77.                 }
  78.                 p2=p2->next;
  79.         }
  80. }
  81. void jiao_element(element *head1,element *head2,element *&head3)//求两个集合的交集
  82. {
  83.         element *p1,*p2,*p3;
  84.         p1=head1->next;
  85.         while(p1!=NULL)
  86.         {
  87.                 p2=head2->next;
  88.                 while((p2!=NULL) && (p2->data!=p1->data))
  89.                         p2=p2->next;
  90.                 if(p2->data==p1->data)
  91.                 {
  92.                         p3=(element*)malloc(sizeof(struct element));
  93.                         p3->data=p1->data;
  94.                         p3->next=head3->next;
  95.                         head3->next=p3;
  96.                 }
  97.                 p1=p1->next;
  98.         }
  99. }
  100. void cha_element(element *head1,element *head2,element *&head3)//求两个集合的差集
  101. {
  102.         element *p1,*p2,*p3;
  103.         p1=head1->next;
  104.         while(p1!=NULL)
  105.         {
  106.                 p2=head2->next;
  107.                 while((p2!=NULL) && (p2->data!=p1->data))
  108.                         p2=p2->next;
  109.                 if(p2==NULL)
  110.                 {
  111.                         p3=(element*)malloc(sizeof(struct element));
  112.                         p3->data=p1->data;
  113.                         p3->next=head3->next;
  114.                         head3->next=p3;
  115.                 }
  116.                 p1=p1->next;
  117.         }
  118. }
  119. void bu_element(element *head1,element *head2,element *&head3)//求集合的补集(head1是全集)
  120. {
  121.         element *p1,*p2,*p3;
  122.         p1=head1->next;
  123.         
  124.         while(p1!=NULL)
  125.         {
  126.                        p2=head2->next;
  127.                
  128.                            while((p2!=NULL) && (p1->data!=p2->data))
  129.                 {
  130.                         p2=p2->next;
  131.                 }
  132.                 if(p2==NULL)
  133.                 {
  134.                         p3->data=p1->data;
  135.                         p3->next=head3->next;
  136.                         head3->next=p3;
  137.                         p3=head3->next;
  138.                 }
  139.                 p1=p1->next;
  140.         }
  141. }

  142. int main()
  143. {
  144.         element *head1,*head2,*head3,*head4;
  145.         head1=init_element();
  146.         head2=init_element();
  147.         head3=init_element();
  148.         head4=init_element();
  149.         printf("请输入集合1:\n");
  150.         readdata_element(head1);

  151.         printf("请输入集合2:\n");
  152.         readdata_element(head2);


  153.         printf("请输入集合3(全集):\n");
  154.         readdata_element(head3);

  155.         printf("集合1为:\n");
  156.         display_element(head1);
  157.         printf("集合2为:\n");
  158.         display_element(head2);
  159.         printf("集合3(全集)为:\n");
  160.         display_element(head3);
  161.         char c1 ;
  162.         printf("运算目录\nA、集合1与集合2的并集\nB、集合1与集合2的交集\nC、集合1与集合2的差集\nD、集合1的补集\nE、集合2的补集\n");

  163.         fflush(stdin);
  164.         scanf("%c",&c1);
  165.         

  166.         if('A' == c1)
  167.         {
  168.                 printf("集合1与集合2的并集为:\n");
  169.                 bing_element(head1,head2,head4);
  170.                 display_element(head4);
  171.                 head4->next=NULL;
  172.         }
  173.         else if('B' == c1)
  174.         {
  175.                 printf("集合1与集合2的交集为:\n");
  176.                 jiao_element(head1,head2,head4);
  177.                 display_element(head4);
  178.                 head4->next=NULL;
  179.         }
  180.         else if('C' == c1)
  181.         {
  182.                 printf("集合1与集合2的差集为:\n");
  183.                 cha_element(head1,head2,head4);
  184.                 display_element(head4);
  185.                 head4->next=NULL;
  186.         }
  187.         else if('D' == c1)
  188.         {
  189.                 printf("集合1的补集为:\n");
  190.                 bu_element(head3,head1,head4);
  191.                 display_element(head4);
  192.                 head4->next=NULL;
  193.         }
  194.         else if('E' == c1)
  195.         {
  196.                 printf("集合2的补集为:\n");
  197.                 bu_element(head3,head2,head4);
  198.                 display_element(head4);
  199.                 head4->next=NULL;
  200.         }
  201.         system("pause");
  202.         return 0;
  203. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-6-22 20:02:50 | 显示全部楼层
fanki 发表于 2013-6-22 11:55
三楼用了一些c++的语法,正解的,如果c的话把传参的引用& 不要就可以
判断那里应该要加=号吧。
我也看了看 ...

根据你们的建议 我将代码改成下面这个样子 但是不能正确计算出交集和补集  我看了很多遍 不知道是函数的问题还是在主函数里出了问题 麻烦 你再帮我看一下好吗,谢谢
  1. 根据你的建议 我将代码改成下面这样 但是不能正确计算补集和交集啊  两个函数看了很多遍 还是不知道是错在函数里 还是主函数里 麻烦你再帮我看一下,谢谢
  2. #include <string.h>
  3. #include<stdio.h>
  4. #include<stdlib.h>
  5. #define NULL 0
  6. typedef struct element//集合元素的结构体
  7. {
  8.         char data;
  9.         struct element *next;
  10. }element;

  11. element* init_element()//初始化集合(集合是用单链表存储结构存储的)
  12. {
  13.         element *head;
  14.         head=(element*)malloc(sizeof(struct element));
  15.         head->next=NULL;
  16.         return head;
  17. }
  18. void readdata_element(element *head)//键盘输入每个集合的元素
  19. {
  20.         static char szBuf[256] = {0};
  21.         printf( "请输入集合中的数据元素:\n" );
  22.         scanf( "%s", szBuf );
  23.         int i = 0;
  24.         while( szBuf[i] != 'F' )
  25.         {
  26.                 if( ( szBuf[i] >= 'a' && szBuf[i] <= 'z') || ( szBuf[i] >= '0' && szBuf[i] <= '9' ) )
  27.                 {
  28.                         element *p;
  29.                         p = ( element* )malloc( sizeof( struct element ) );
  30.                         p->data = szBuf[i];
  31.                         p->next = head->next;
  32.                         head->next = p;
  33.                 }
  34.                 else
  35.                 {
  36.                         //printf("输入错误!必须是小写字母或者0~9的数字!请重新输入:\n");
  37.                         break;
  38.                 }
  39.                 i++;        
  40.         }
  41.         memset( szBuf, 0, 256 );
  42. }


  43. void display_element(element *head)//输出集合中的所有元素
  44. {
  45.         element *p;
  46.         p=head->next;
  47.         while(p!=NULL)
  48.         {
  49.                 printf("%c",p->data);
  50.                 p=p->next;
  51.         }
  52.         printf("\n");
  53. }
  54. void bing_element(element *head1,element * head2,element * &head3)//求两个集合的并集
  55. {
  56.         element *p1,*p2,*p3;
  57.         p1=head1->next;
  58.         while(p1!=NULL)
  59.         {
  60.                 p3=(element*)malloc(sizeof(struct element));
  61.                 p3->data=p1->data;
  62.                 p3->next=head3->next;
  63.                 head3->next=p3;
  64.                 p1=p1->next;
  65.         }
  66.         p2=head2->next;
  67.         while(p2!=NULL)
  68.         {
  69.                 p1=head1->next;
  70.                 while((p1!=NULL) && (p1->data!=p2->data))
  71.                         p1=p1->next;
  72.                 if(p1==NULL)
  73.                 {
  74.                         p3=(element*)malloc(sizeof(struct element));
  75.                         p3->data=p2->data;
  76.                         p3->next=head3->next;
  77.                         head3->next=p3;
  78.                 }
  79.                 p2=p2->next;
  80.         }
  81. }
  82. void jiao_element(element *head1,element *head2,element *&head3)//求两个集合的交集
  83. {
  84.         element *p1,*p2,*p3;
  85.         p1=head1->next;
  86.         while(p1!=NULL)
  87.         {
  88.                 p2=head2->next;
  89.                 while((p2!=NULL) && (p2->data!=p1->data))
  90.                         p2=p2->next;
  91.                 if(p2->data==p1->data)
  92.                 {
  93.                         p3=(element*)malloc(sizeof(struct element));
  94.                         p3->data=p1->data;
  95.                         p3->next=head3->next;
  96.                         head3->next=p3;
  97.                 }
  98.                 p1=p1->next;
  99.         }
  100. }
  101. void cha_element(element *head1,element *head2,element *&head3)//求两个集合的差集
  102. {
  103.         element *p1,*p2,*p3;
  104.         p1=head1->next;
  105.         while(p1!=NULL)
  106.         {
  107.                 p2=head2->next;
  108.                 while((p2!=NULL) && (p2->data!=p1->data))
  109.                         p2=p2->next;
  110.                 if(p2==NULL)
  111.                 {
  112.                         p3=(element*)malloc(sizeof(struct element));
  113.                         p3->data=p1->data;
  114.                         p3->next=head3->next;
  115.                         head3->next=p3;
  116.                 }
  117.                 p1=p1->next;
  118.         }
  119. }
  120. void bu_element(element *head1,element *head2,element *&head3)//求集合的补集(head1是全集)
  121. {
  122.         element *p1,*p2,*p3;
  123.         p1=head1->next;
  124.         
  125.         while(p1!=NULL)
  126.         {
  127.                        p2=head2->next;
  128.                
  129.                            while((p2!=NULL) && (p1->data!=p2->data))
  130.                 {
  131.                         p2=p2->next;
  132.                 }
  133.                 if(p2==NULL)
  134.                 {
  135.                         p3->data=p1->data;
  136.                         p3->next=head3->next;
  137.                         head3->next=p3;
  138.                         p3=head3->next;
  139.                 }
  140.                 p1=p1->next;
  141.         }
  142. }

  143. int main()
  144. {
  145.         element *head1,*head2,*head3,*head4;
  146.         head1=init_element();
  147.         head2=init_element();
  148.         head3=init_element();
  149.         head4=init_element();
  150.         printf("请输入集合1:\n");
  151.         readdata_element(head1);

  152.         printf("请输入集合2:\n");
  153.         readdata_element(head2);


  154.         printf("请输入集合3(全集):\n");
  155.         readdata_element(head3);

  156.         printf("集合1为:\n");
  157.         display_element(head1);
  158.         printf("集合2为:\n");
  159.         display_element(head2);
  160.         printf("集合3(全集)为:\n");
  161.         display_element(head3);
  162.         char c1 ;
  163.         printf("运算目录\nA、集合1与集合2的并集\nB、集合1与集合2的交集\nC、集合1与集合2的差集\nD、集合1的补集\nE、集合2的补集\n");

  164.         fflush(stdin);
  165.         scanf("%c",&c1);
  166.         

  167.         if('A' == c1)
  168.         {
  169.                 printf("集合1与集合2的并集为:\n");
  170.                 bing_element(head1,head2,head4);
  171.                 display_element(head4);
  172.                 head4->next=NULL;
  173.         }
  174.         else if('B' == c1)
  175.         {
  176.                 printf("集合1与集合2的交集为:\n");
  177.                 jiao_element(head1,head2,head4);
  178.                 display_element(head4);
  179.                 head4->next=NULL;
  180.         }
  181.         else if('C' == c1)
  182.         {
  183.                 printf("集合1与集合2的差集为:\n");
  184.                 cha_element(head1,head2,head4);
  185.                 display_element(head4);
  186.                 head4->next=NULL;
  187.         }
  188.         else if('D' == c1)
  189.         {
  190.                 printf("集合1的补集为:\n");
  191.                 bu_element(head3,head1,head4);
  192.                 display_element(head4);
  193.                 head4->next=NULL;
  194.         }
  195.         else if('E' == c1)
  196.         {
  197.                 printf("集合2的补集为:\n");
  198.                 bu_element(head3,head2,head4);
  199.                 display_element(head4);
  200.                 head4->next=NULL;
  201.         }
  202.         system("pause");
  203.         return 0;
  204. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-6-22 22:46:12 | 显示全部楼层
fanki 发表于 2013-6-22 11:55
三楼用了一些c++的语法,正解的,如果c的话把传参的引用& 不要就可以
判断那里应该要加=号吧。
我也看了看 ...

晚上又琢磨了几个小时  改了一下 现在就剩一个问题了 求交集的时候 集合1的元素个数要是大于集合2的元素个数  就不能执行  只有集合1的元素个数小于集合2的元素个数才能执行  求交集的函数 我隐藏每一行都检查了 就是if这个循环语句的问题 手动也搞了半天 就是不知道这是个啥问题 求帮助(下面是修改后的代码)
  1. #include <string.h>
  2. #include<stdio.h>
  3. #include<stdlib.h>
  4. #define NULL 0
  5. typedef struct element//集合元素的结构体
  6. {
  7.         char data;
  8.         struct element *next;
  9. }element;

  10. element* init_element()//初始化集合(集合是用单链表存储结构存储的)
  11. {
  12.         element *head;
  13.         head=(element*)malloc(sizeof(struct element));
  14.         head->next=NULL;
  15.         return head;
  16. }
  17. void readdata_element(element *head)//键盘输入每个集合的元素
  18. {
  19.         static char szBuf[256] = {0};
  20.         printf( "请输入集合中的数据元素:\n" );
  21.         scanf( "%s", szBuf );
  22.         int i = 0;
  23.         while( szBuf[i] != 'F' )
  24.         {
  25.                 if( ( szBuf[i] >= 'a' && szBuf[i] <= 'z') || ( szBuf[i] >= '0' && szBuf[i] <= '9' ) )
  26.                 {
  27.                         element *p;
  28.                         p = ( element* )malloc( sizeof( struct element ) );
  29.                         p->data = szBuf[i];
  30.                         p->next = head->next;
  31.                         head->next = p;
  32.                 }
  33.                 else
  34.                 {
  35.                         //printf("输入错误!必须是小写字母或者0~9的数字!请重新输入:\n");
  36.                         break;
  37.                 }
  38.                 i++;        
  39.         }
  40.         memset( szBuf, 0, 256 );
  41. }


  42. void display_element(element *head)//输出集合中的所有元素
  43. {
  44.         element *p;
  45.         p=head->next;
  46.         while(p!=NULL)
  47.         {
  48.                 printf("%c",p->data);
  49.                 p=p->next;
  50.         }
  51.         printf("\n");
  52. }
  53. void bing_element(element *head1,element * head2,element * &head3)//求两个集合的并集
  54. {
  55.         element *p1,*p2,*p3;
  56.         p1=head1->next;
  57.         while(p1!=NULL)
  58.         {
  59.                 p3=(element*)malloc(sizeof(struct element));
  60.                 p3->data=p1->data;
  61.                 p3->next=head3->next;
  62.                 head3->next=p3;
  63.                 p1=p1->next;
  64.         }
  65.         p2=head2->next;
  66.         while(p2!=NULL)
  67.         {
  68.                 p1=head1->next;
  69.                 while((p1!=NULL) && (p1->data!=p2->data))
  70.                         p1=p1->next;
  71.                 if(p1==NULL)
  72.                 {
  73.                         p3=(element*)malloc(sizeof(struct element));
  74.                         p3->data=p2->data;
  75.                         p3->next=head3->next;
  76.                         head3->next=p3;
  77.                 }
  78.                 p2=p2->next;
  79.         }
  80. }
  81. void jiao_element(element *head1,element *head2,element *head3)//求两个集合的交集
  82. {
  83.         element *p1,*p2,*p3;
  84.         p1=head1;
  85.         while(p1!=NULL)
  86.         {
  87.                 p2=head2;
  88.                 while((p2!=NULL) && (p2->data!=p1->data))
  89.                         p2=p2->next;
  90.                 if((p2->data)==(p1->data))
  91.                 {
  92.                         p3=(element*)malloc(sizeof(struct element));
  93.                         p3->data=p1->data;
  94.                         p3->next=head3->next;
  95.                         head3->next=p3;
  96.                         display_element(head3);
  97.                                                
  98.                                                
  99.                                                
  100.                 }
  101.                 p1=p1->next;
  102.         }
  103.                
  104. }
  105. void cha_element(element *head1,element *head2,element *&head3)//求两个集合的差集
  106. {
  107.         element *p1,*p2,*p3;
  108.         p1=head1->next;
  109.         while(p1!=NULL)
  110.         {
  111.                 p2=head2->next;
  112.                 while((p2!=NULL) && (p2->data!=p1->data))
  113.                         p2=p2->next;
  114.                 if(p2==NULL)
  115.                 {
  116.                         p3=(element*)malloc(sizeof(struct element));
  117.                         p3->data=p1->data;
  118.                         p3->next=head3->next;
  119.                         head3->next=p3;
  120.                 }
  121.                 p1=p1->next;
  122.         }
  123. }
  124. void bu_element(element *head1,element *head2,element *head3)//求集合的补集(head1是全集)
  125. {
  126.         element *p1,*p2,*p3;
  127.         p1=head1->next;
  128.                
  129.         
  130.         while(p1!=NULL)
  131.         {
  132.                        p2=head2->next;
  133.                
  134.                            while((p2!=NULL) && (p1->data!=p2->data))
  135.                {
  136.                        p2=p2->next;
  137.                 }
  138.                 if(p2==NULL)
  139.                 {
  140.                     p3=(element*)malloc(sizeof(struct element));   
  141.                                         p3->data=p1->data;
  142.                         p3->next=head3->next;
  143.                         head3->next=p3;
  144.                         p3=head3->next;
  145.                 }
  146.                 p1=p1->next;
  147.         }
  148. }

  149. int main()
  150. {
  151.         element *head1,*head2,*head3,*head4;
  152.         head1=init_element();
  153.         head2=init_element();
  154.         head3=init_element();
  155.         head4=init_element();
  156.         printf("请输入集合1:\n");
  157.         readdata_element(head1);

  158.         printf("请输入集合2:\n");
  159.         readdata_element(head2);


  160.         printf("请输入集合3(全集):\n");
  161.         readdata_element(head3);

  162.         printf("集合1为:\n");
  163.         display_element(head1);
  164.         printf("集合2为:\n");
  165.         display_element(head2);
  166.         printf("集合3(全集)为:\n");
  167.         display_element(head3);
  168.         char c1 ;
  169.         printf("运算目录\nA、集合1与集合2的并集\nB、集合1与集合2的交集\nC、集合1与集合2的差集\nD、集合1的补集\nE、集合2的补集\n");

  170.         fflush(stdin);
  171.         scanf("%c",&c1);
  172.         

  173.         if('A' == c1)
  174.         {
  175.                 printf("集合1与集合2的并集为:\n");
  176.                 bing_element(head1,head2,head4);
  177.                 display_element(head4);
  178.                 head4->next=NULL;
  179.         }
  180.         else if('B' == c1)
  181.         {
  182.                 printf("集合1与集合2的交集为:\n");
  183.                 jiao_element(head1,head2,head4);
  184.                 display_element(head4);
  185.                 head4->next=NULL;
  186.         }
  187.         else if('C' == c1)
  188.         {
  189.                 printf("集合1与集合2的差集为:\n");
  190.                 cha_element(head1,head2,head4);
  191.                 display_element(head4);
  192.                 head4->next=NULL;
  193.         }
  194.         else if('D' == c1)
  195.         {
  196.                 printf("集合1的补集为:\n");
  197.                 bu_element(head3,head1,head4);
  198.                 display_element(head4);
  199.                 head4->next=NULL;
  200.         }
  201.         else if('E' == c1)
  202.         {
  203.                 printf("集合2的补集为:\n");
  204.                 bu_element(head3,head2,head4);
  205.                 display_element(head4);
  206.                 head4->next=NULL;
  207.         }
  208.         system("pause");
  209.         return 0;
  210. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-6-22 22:47:25 | 显示全部楼层
熊文杰 发表于 2013-6-22 02:33
只帮你改得可以运行,还有一些逻辑上的问题,楼主自己处理一下把

晚上又琢磨了几个小时  改了一下 现在就剩一个问题了 求交集的时候 集合1的元素个数要是大于集合2的元素个数  就不能执行  只有集合1的元素个数小于集合2的元素个数才能执行  求交集的函数 我隐藏每一行都检查了 就是if这个循环语句的问题 手动也搞了半天 就是不知道这是个啥问题 求帮助(下面是修改后的代码)
  1. #include <string.h>
  2. #include<stdio.h>
  3. #include<stdlib.h>
  4. #define NULL 0
  5. typedef struct element//集合元素的结构体
  6. {
  7.         char data;
  8.         struct element *next;
  9. }element;

  10. element* init_element()//初始化集合(集合是用单链表存储结构存储的)
  11. {
  12.         element *head;
  13.         head=(element*)malloc(sizeof(struct element));
  14.         head->next=NULL;
  15.         return head;
  16. }
  17. void readdata_element(element *head)//键盘输入每个集合的元素
  18. {
  19.         static char szBuf[256] = {0};
  20.         printf( "请输入集合中的数据元素:\n" );
  21.         scanf( "%s", szBuf );
  22.         int i = 0;
  23.         while( szBuf[i] != 'F' )
  24.         {
  25.                 if( ( szBuf[i] >= 'a' && szBuf[i] <= 'z') || ( szBuf[i] >= '0' && szBuf[i] <= '9' ) )
  26.                 {
  27.                         element *p;
  28.                         p = ( element* )malloc( sizeof( struct element ) );
  29.                         p->data = szBuf[i];
  30.                         p->next = head->next;
  31.                         head->next = p;
  32.                 }
  33.                 else
  34.                 {
  35.                         //printf("输入错误!必须是小写字母或者0~9的数字!请重新输入:\n");
  36.                         break;
  37.                 }
  38.                 i++;        
  39.         }
  40.         memset( szBuf, 0, 256 );
  41. }


  42. void display_element(element *head)//输出集合中的所有元素
  43. {
  44.         element *p;
  45.         p=head->next;
  46.         while(p!=NULL)
  47.         {
  48.                 printf("%c",p->data);
  49.                 p=p->next;
  50.         }
  51.         printf("\n");
  52. }
  53. void bing_element(element *head1,element * head2,element * &head3)//求两个集合的并集
  54. {
  55.         element *p1,*p2,*p3;
  56.         p1=head1->next;
  57.         while(p1!=NULL)
  58.         {
  59.                 p3=(element*)malloc(sizeof(struct element));
  60.                 p3->data=p1->data;
  61.                 p3->next=head3->next;
  62.                 head3->next=p3;
  63.                 p1=p1->next;
  64.         }
  65.         p2=head2->next;
  66.         while(p2!=NULL)
  67.         {
  68.                 p1=head1->next;
  69.                 while((p1!=NULL) && (p1->data!=p2->data))
  70.                         p1=p1->next;
  71.                 if(p1==NULL)
  72.                 {
  73.                         p3=(element*)malloc(sizeof(struct element));
  74.                         p3->data=p2->data;
  75.                         p3->next=head3->next;
  76.                         head3->next=p3;
  77.                 }
  78.                 p2=p2->next;
  79.         }
  80. }
  81. void jiao_element(element *head1,element *head2,element *head3)//求两个集合的交集
  82. {
  83.         element *p1,*p2,*p3;
  84.         p1=head1;
  85.         while(p1!=NULL)
  86.         {
  87.                 p2=head2;
  88.                 while((p2!=NULL) && (p2->data!=p1->data))
  89.                         p2=p2->next;
  90.                 if((p2->data)==(p1->data))
  91.                 {
  92.                         p3=(element*)malloc(sizeof(struct element));
  93.                         p3->data=p1->data;
  94.                         p3->next=head3->next;
  95.                         head3->next=p3;
  96.                         display_element(head3);
  97.                                                
  98.                                                
  99.                                                
  100.                 }
  101.                 p1=p1->next;
  102.         }
  103.                
  104. }
  105. void cha_element(element *head1,element *head2,element *&head3)//求两个集合的差集
  106. {
  107.         element *p1,*p2,*p3;
  108.         p1=head1->next;
  109.         while(p1!=NULL)
  110.         {
  111.                 p2=head2->next;
  112.                 while((p2!=NULL) && (p2->data!=p1->data))
  113.                         p2=p2->next;
  114.                 if(p2==NULL)
  115.                 {
  116.                         p3=(element*)malloc(sizeof(struct element));
  117.                         p3->data=p1->data;
  118.                         p3->next=head3->next;
  119.                         head3->next=p3;
  120.                 }
  121.                 p1=p1->next;
  122.         }
  123. }
  124. void bu_element(element *head1,element *head2,element *head3)//求集合的补集(head1是全集)
  125. {
  126.         element *p1,*p2,*p3;
  127.         p1=head1->next;
  128.                
  129.         
  130.         while(p1!=NULL)
  131.         {
  132.                        p2=head2->next;
  133.                
  134.                            while((p2!=NULL) && (p1->data!=p2->data))
  135.                {
  136.                        p2=p2->next;
  137.                 }
  138.                 if(p2==NULL)
  139.                 {
  140.                     p3=(element*)malloc(sizeof(struct element));   
  141.                                         p3->data=p1->data;
  142.                         p3->next=head3->next;
  143.                         head3->next=p3;
  144.                         p3=head3->next;
  145.                 }
  146.                 p1=p1->next;
  147.         }
  148. }

  149. int main()
  150. {
  151.         element *head1,*head2,*head3,*head4;
  152.         head1=init_element();
  153.         head2=init_element();
  154.         head3=init_element();
  155.         head4=init_element();
  156.         printf("请输入集合1:\n");
  157.         readdata_element(head1);

  158.         printf("请输入集合2:\n");
  159.         readdata_element(head2);


  160.         printf("请输入集合3(全集):\n");
  161.         readdata_element(head3);

  162.         printf("集合1为:\n");
  163.         display_element(head1);
  164.         printf("集合2为:\n");
  165.         display_element(head2);
  166.         printf("集合3(全集)为:\n");
  167.         display_element(head3);
  168.         char c1 ;
  169.         printf("运算目录\nA、集合1与集合2的并集\nB、集合1与集合2的交集\nC、集合1与集合2的差集\nD、集合1的补集\nE、集合2的补集\n");

  170.         fflush(stdin);
  171.         scanf("%c",&c1);
  172.         

  173.         if('A' == c1)
  174.         {
  175.                 printf("集合1与集合2的并集为:\n");
  176.                 bing_element(head1,head2,head4);
  177.                 display_element(head4);
  178.                 head4->next=NULL;
  179.         }
  180.         else if('B' == c1)
  181.         {
  182.                 printf("集合1与集合2的交集为:\n");
  183.                 jiao_element(head1,head2,head4);
  184.                 display_element(head4);
  185.                 head4->next=NULL;
  186.         }
  187.         else if('C' == c1)
  188.         {
  189.                 printf("集合1与集合2的差集为:\n");
  190.                 cha_element(head1,head2,head4);
  191.                 display_element(head4);
  192.                 head4->next=NULL;
  193.         }
  194.         else if('D' == c1)
  195.         {
  196.                 printf("集合1的补集为:\n");
  197.                 bu_element(head3,head1,head4);
  198.                 display_element(head4);
  199.                 head4->next=NULL;
  200.         }
  201.         else if('E' == c1)
  202.         {
  203.                 printf("集合2的补集为:\n");
  204.                 bu_element(head3,head2,head4);
  205.                 display_element(head4);
  206.                 head4->next=NULL;
  207.         }
  208.         system("pause");
  209.         return 0;
  210. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-6-23 12:49:41 | 显示全部楼层
权志龙_爱死你la 发表于 2013-6-22 22:46
晚上又琢磨了几个小时  改了一下 现在就剩一个问题了 求交集的时候 集合1的元素个数要是大于集合2的元素个 ...

昨晚没有上线~~不好意思吖。
如果逻辑没有问题的话,你试试这样。把长的永远放在第一个集合里面放进去做吧。
我改了一下。
加了一个函数:
对比集合一集合二,如果集合一大于集合二不交换,如果不大于的话交换
void exchange( element* head1, element* head2 )
{
        element *p1 = head1;
        element *p2 = head2;
        int x1 = 0, x2 = 0;
        while( p1 == NULL )
        {
                x1++;
                p1 = p1->next;
        }
        while( p2 == NULL )
        {
                x2++;
                p2 = p2->next;
        }
        if ( x1 > x2 ) return;
        else
        {
                p1 = head1;
                head1 = head2;
                head2 = p1;
        }
}


原来判断的代码为:
        else if('B' == c1)
        {
                printf("集合1与集合2的交集为:\n");
                exchange( head1, head2 );
                jiao_element(head1,head2,head4);
                display_element(head4);
                head4->next=NULL;
        }

加一个exchange的判断。
这样做就可以了,这样改比较简单,如果要详细改的话,你可以在jiao_element里边改
原因是因为你只按照集合一大于集合二的方式做,没有考虑集合二大于集合一的考虑。
希望对你有帮助{:7_155:}一起学习学习,加油哦。

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-19 13:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表