首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

早上写好的一个集合运算器,中午修改一下,就不知道咋回事,错了,错了

2013-11-20 
早上写好的一个集合运算器,中午修改一下,就不知道怎么回事,错了,错了。痛苦啊,学了数据结构,做的第一个稍微

早上写好的一个集合运算器,中午修改一下,就不知道怎么回事,错了,错了。
  痛苦啊,学了数据结构,做的第一个稍微有点技术含量的程序就是这个用链表来来处理这个集合程序。现在程序输出居然错误了。早上还好好的,但是中午的一个修改,就全错误了,狂抓啊。对于我们这种新手来说,调试很痛苦,又不知道问谁,,,
  
suanfa.h

#include "head.h"

Status Init(linklist &L)
{
L=(linklist )malloc(sizeof(lnode));
if(!L)return ERROR;
L->data='0';
L->next=NULL;

return OK;
}

Status Insert(linklist &L,elemtype *Set)
{
linklist p,s;
p=L;

int index=0;
while(Set[index]!='\0')
{
s=(linklist )malloc(sizeof(lnode));
p->next=s;
p=p->next;
p->data=Set[index];
index++;
}
p->next=NULL;

return OK;
}

Status Tranver(linklist L)
{
linklist p=L->next;
int flag=1;
for(;p!=NULL;p=p->next)
{
if(flag==1)
{
printf("%c",p->data);
flag=0;
}
else
{
printf(",%c",p->data);
}
}

return OK;
}

//交集运算
Status jiaoji(linklist la,linklist lb,linklist &lc)
{
linklist qa=la->next,qb=lb->next,qc=lc,s;
while(qa&&qb)
{
if(qa->data==qb->data)
{
if(qc->data!=qa->data)
{
s=(linklist )malloc(sizeof(lnode));
if(!s)return ERROR;
qc->next=s;
s->next=NULL;
s->data=qa->data;
qc=qc->next;
}
qa=qa->next;
qb=qb->next;
}
else
if(qa->data<qb->data)
{
qa=qa->next;
}
else
qb=qb->next;
}
return OK;
}

void sort(linklist &L)
{
int n=length(L);
elemtype temp;
linklist p=L->next,q;
int i,j;
for(i=1,p=L->next;i<=n;i++,p=p->next)
for(j=1+i,q=p->next;j<=n;j++,q=q->next)
if(p->data>q->data)
{
temp=p->data;
p->data=q->data;
q->data=temp;
}
}

int length(linklist L)
{
int count=0;
linklist p;
for(p=L->next;p!=NULL;p=p->next)
count++;
return count;
}

void Bubble_sort (linklist &l) {
linklist p, q;
p = l->next;
elemtype temp;
for(p=l->next;p->next!=NULL;p=p->next)
{
for(p=l->next;p->next!=p||p->next!=NULL;p=p->next)
{
if(p->data>p->next->data)
{
temp=p->data;
p->data=p->next->data;
p->next->data=temp;
}
}
q=p;
}
return;
}

//求并集
Status bingji(linklist la,linklist lb,linklist &lc)
{
linklist qa=la->next,qb=lb->next,qc=lc,s;
while(qa&&qb)
{
if(qa->data==qb->data)
{
if(qc->data!=qa->data)
{
s=(linklist )malloc(sizeof(lnode));
if(!s)return ERROR;
qc->next=s;
s->next=NULL;
s->data=qa->data;
qc=qc->next;
}
qa=qa->next;
qb=qb->next;
}
else
if(qa->data<qb->data)
{
if(qc->data!=qa->data)
{
s=(linklist )malloc(sizeof(lnode));
if(!s)return ERROR;
qc->next=s;
s->next=NULL;
s->data=qa->data;
qc=qc->next;
}
qa=qa->next;
}
else
{
if(qc->data!=qb->data)
{
s=(linklist )malloc(sizeof(lnode));
if(!s)return ERROR;
qc->next=s;
s->next=NULL;
s->data=qb->data;
qc=qc->next;
}
qb=qb->next;
}
}

while(qa)
{
if(qc->data!=qa->data)
{
s=(linklist )malloc(sizeof(lnode));
if(!s)return ERROR;
qc->next=s;
s->next=NULL;
s->data=qa->data;
qc=qc->next;
}
qa=qa->next;
}

while(qb)
{
if(qc->data!=qb->data)
{
s=(linklist )malloc(sizeof(lnode));
if(!s)return ERROR;
qc->next=s;
s->next=NULL;
s->data=qb->data;
qc=qc->next;
}
qb=qb->next;
}

return OK;
}


menu.h
#include "suanfa.h"
#include <string.h>

void menu(void)
{
linklist a,b,c;
printf("*******************************************************************************\n");
printf("              集合运算器1.0        by 张**\n\n");
printf("1.输入集合A     2.输入集合B     3.求集合的交集   4.求集合的并集     0.退出\n");
char Set[100];
char choose;
do{
scanf("%c",&choose);
switch(choose)
{
case '1':
Init(a);
printf("请输入要运算的A集合:\n");
scanf("%s",Set);
Insert(a,Set);
sort (a); 
printf("集合A=[");
Tranver(a);
printf("]   请继续...\n");
break;


case '2':
Init(b);
printf("请输入要运算的B集合:\n");
scanf("%s",Set);
Insert(b,Set);
sort (b);
printf("集合B=[");
Tranver(b);
printf("]   请继续...\n");
break;
case '3':
Init(c);
if(jiaoji(a,b,c)==OK)
printf("A与B交集=[");
Tranver(c);
printf("]   请继续...\n");
break;
case '4':
Init(c);
if(bingji(a,b,c)==OK)
printf("A与B并集=[");
Tranver(c);
printf("]   请继续...\n");
break;
}
}while(choose!='0');

}



head.h
#include<stdio.h>
#include<malloc.h>

typedef int Status;
#define OK 1
#define ERROR -1
typedef char elemtype;
typedef struct node{
elemtype data;
struct node *next;
} lnode, *linklist;

Status Init(linklist &L);
Status Insert(linklist &L,elemtype e);
Status Tranver(linklist L);
Status add(linklist la,linklist lb,linklist &lc);
void sort(linklist &L);
int length(linklist L);


main.cpp
#include"menu.h"

int main(void)
{
menu();

return 0;
}

错误描述:集合A输入5476499,集合B输入【5476488】,正确输出应该是:【4567】,但是此程序输出是【57】. 数据结构 技术 链表 调试
[解决办法]
仅供参考
#include <algorithm>
#include <iostream>
#include <functional>
#include <cstring>
using namespace std;
int main() {
    char *Alphabet = "abcdefghijklmnopqrstuvwxyz" ;
    char *Vowels   = "aeiou" ;
    char *AlphaNum = "0123456789abcdef" ;
    char result[45] ;
    char *last ;

    int lenA  = strlen(Alphabet) ;
    int lenV  = strlen(Vowels  ) ;
    int lenAN = strlen(AlphaNum) ;

    cout << "Alphabet = " << Alphabet << endl ;
    cout << "Vowels   = " << Vowels   << endl ;
    cout << "AlphaNum = " << AlphaNum << endl ;

    cout << "\nusing non-predicate versions" << endl ;

    //non-predicate set_difference
    last = set_difference(Alphabet, Alphabet+lenA,
                          AlphaNum, AlphaNum+lenAN,
                          result) ;
    *last = 0 ;
    cout << "set_difference(Alphabet, AlphaNum) =  " << result << endl ;

    //non-predicate set_intersection
    last = set_intersection(Alphabet, Alphabet+lenA,
                            AlphaNum, AlphaNum+lenAN,
                            result) ;
    *last = 0 ;
    cout << "set_intersection(Alphabet, AlphaNum) =  " << result << endl ;

    //non-predicate set_symmetric_difference
    last = set_symmetric_difference(Alphabet, Alphabet+lenA,
                                    Vowels  , Vowels  +lenV,
                                    result) ;
    *last = 0 ;
    cout << "set_symmetric_difference(Alphabet, Vowels) =  " << result << endl ;



    //non-predicate set_union
    last = set_union(Alphabet, Alphabet+lenA,
                     AlphaNum, AlphaNum+lenAN,
                     result) ;
    *last = 0 ;
    cout << "set_union(Alphabet, AlphaNum) =  " << result << endl ;

    cout << "\nusing predicate versions" << endl ;

    //predicate set_difference
    last = set_difference(Alphabet, Alphabet+lenA,
                          AlphaNum, AlphaNum+lenAN,
                          result  , less<char>()) ;
    *last = 0 ;
    cout << "set_difference(Alphabet, AlphaNum) =  " << result << endl ;

    //predicate set_intersection
    last = set_intersection(Alphabet, Alphabet+lenA,
                            AlphaNum, AlphaNum+lenAN,
                            result  , less<char>()) ;
    *last = 0 ;
    cout << "set_intersection(Alphabet, AlphaNum) =  " << result << endl ;

    //predicate set_symmetric_difference
    last = set_symmetric_difference(Alphabet, Alphabet+lenA,
                                    Vowels  , Vowels  +lenV,
                                    result  , less<char>()) ;
    *last = 0 ;
    cout << "set_symmetric_difference(Alphabet, Vowels) =  " << result << endl ;

    //predicate set_union
    last = set_union(Alphabet, Alphabet+lenA,
                     AlphaNum, AlphaNum+lenAN,
                     result  , less<char>()) ;
    *last = 0 ;
    cout << "set_union(Alphabet, AlphaNum) =  " << result << endl ;

    return 0 ;
}


[解决办法]
LZ有些坑,跟了半天发现结果是正确的(仅限于你提供的两个输入)!!!
在公司,上传不了东西,
其实简单的实现是
一个双重循环
用第一个集合的所有元素一个一个和第二个集合比,比到相等的就存起来,break,
继续用第二个去比....
[解决办法]
求并集也一样简单,
将集合B作为并集基础,然后用A中的数据区跟B的数据比,
比到相等的就break,
一直到结束都没有比到相等的就直接放到最后,
循环....
[解决办法]
任何修改前要做好backup
学会debug
[解决办法]
早上是好的,说明基本代码思路框架还是好的!现在乱了估计是某处一点修改导致逻辑错误了!
可以单步调试分析下,要学会调试程序!分析代码走向
[解决办法]
但看程序的话没啥问题,你自己再调试看看。话说你中午改了哪里,可以说说么?

调试的话其实也不难,比如交集吧,你先输入a、b然后在进入交集函数的地方设个断点,然后看看a、b的原始状态是否是符合要求的(已排序),然后一步步单步下来就可以了,看看是不是哪里的运算顺序不符合你的想法。如果没什么错误的话,然后看看打印是否有问题。总之就是一步步单步下来的。

我粗略的看了下,没看出啥明显的错误。和3楼一样,我照你的样本输入,执行的结果是对的。你是否哪里搞错了?还是有特殊的样本?你再试试看吧。
[解决办法]
LZ程序是先排序后显示,所以显示的是排序过后的结果。如下改为先显示后排序:

      printf("请输入要运算的B集合:\n");
      scanf("%s",Set);
      Insert(b,Set);
      printf("集合B=[");
      Tranver(b);
      printf("]");
      sort (b);
      printf("请继续...\n");

对于A集合也应如此修改。
[解决办法]
集合有可重复集,和不重复集
一般的集合的实现,多半都是不重复集。

不重复集的元素顺序,一般不重要;
所以一般实现为排序集,方便处理集合的各种操作。

对于,不重复集的运算,
并集,一般就是归并两个集,并排除其中的重复元素。
差集,去掉另一个集合中有的元素,由于已经排序,实现起来也比较方便。

可重复集,需要定义何为并,何为交,才能运算。


[解决办法]
交集


两个集合都有的存入交集。

估计楼主,没有搞清楚
自己要实现可重复集,还是不重复集,如何定义并,交,差等集合运算。

[解决办法]
不重复集 
A =1,2,5,8};
B =2,4,6,8};
并,交,差:
Union(A,B) = {1,2,4,5,6,8}
Add(A,B)   ={2,8}

Diff(A,B)  ={1,5}
Diff(B,A)  ={4,6}
    
可重复集的一种方案:  
A ={1,2,5,8};
B ={2,4,6,8};
并,交,差:
Union(A,B) = {1,2,2,4,5,6,8,8}
Add(A,B)   ={2,8}
Diff(A,B)  ={1,5}
Diff(B,A)  ={4,6}

集合,一般不考虑顺序;
集合排序,是为了更方便操作。


热点排行