回 帖 发 新 帖 刷新版面

主题:求集合的并的函数[单链表]

我的思路是:先把集合A中的元素全部输出,然后遍历集合B的每个元素,如果B的某个元素不能够在A中找到,则输出那个元素。
我测试了下,输入A={5,6},B={3,5,7},结果一运行就显示出现故障什么的问我要不要发送,请问这是怎么回事?

以下是我编的求集合的并的函数:
void Unionl(linklist &A,linklist &B)
{
    node *pA,*pB;
    int temp;
    pA=A.Trace(1);
    pB=B.Trace(1);
    cout<<"A和B的并是:";
    while(pA!=NULL)
    {
        cout<<pA->data<<",";
        pA=pA->next;
    }
    while(pB!=NULL)
    {
        temp=pB->data;
        if(!A.Locate(temp)) cout<<temp<<" ";
        pB=pB->next;
    }
    cout<<endl;
}

结点类和链表类定义为:
class node
{
    public:
        int data;
        node* next;
        node(node* pnext=NULL);
        node(int item,node* pnext=NULL);
        void setnext(node* p) { next=p; }
        void setdata(int inpt) { data=inpt; }
        ~node() {}
};

class linklist
{
    private:
        node* head;
        node* pCurrent;
    public:
        linklist();
        ~linklist();
        int Length();
        node* Trace(int i);
        int GetCurrent();
        node* Locate(int x);
        void InsertAfter(int n);
        int DeleteCurrent();
        int Isempty();
        void Clear();
        node* Next();
        int EndofList();
        void PrintList();
};

//------------------------------------------------

node::node(node* pnext)           //构造头结点
{
    next=pnext;
}

node::node(int item,node* pnext)    //构造非头结点
{
    data=item;
    next=pnext;
}

//------------------------------------------------

linklist::linklist()
{
    head=pCurrent=new node();
    head->next=NULL;
}

linklist::~linklist()
{
}

int linklist::Length()
{
    node* p=head->next;
    int len=0;
    while(p!=NULL)
    {
        len++;
        p=p->next;
    }
    return len;
}

node* linklist::Trace(int i)
{
    if(head==NULL || i<0) return NULL;
    if(i==0) { pCurrent=head; return head; }
    node* p=head;
    int k=0;
    while(p!=NULL && k<i) { p=p->next; k++; }
    pCurrent=p;
    return p;
}

int linklist::GetCurrent()
{
    if(pCurrent==head || pCurrent==NULL)
    {
        cerr<<"未取到数据值"<<endl;
        return NULL;
    }
    return pCurrent->data;
}

node* linklist::Locate(int x)
{
    pCurrent=head->next;
    while(pCurrent->data!=x)  { pCurrent=pCurrent->next; }
    return pCurrent;
}

void linklist::InsertAfter(int n)
{
    if(head->next==NULL || pCurrent==NULL)
    {
        node* newnode=new node(n,head->next);
        head->next=pCurrent=newnode;
    }
    else{
        node* newnode=new node(n,pCurrent->next);
        pCurrent->next=newnode;
        pCurrent=newnode;
    }
}

int linklist::DeleteCurrent()
{
    if(pCurrent==head || pCurrent==NULL)
    {
        cerr<<"结点不可删"<<endl;
        return NULL;
    }
    node* p=head;
    while(p->next!=pCurrent) { p=p->next; }
    p->next=pCurrent->next;
    int datatemp=pCurrent->data;
    delete pCurrent;
    pCurrent=p->next;
    return datatemp;
}

int linklist::Isempty()
{
    if(head->next==NULL) return 1;
    else return 0;
}

void linklist::Clear()
{
    pCurrent=head;
    node *p,*q;
    p=head->next;
    while(p!=NULL)
    {
        q=p;
        p=p->next;
        delete q;
    }
}

node* linklist::Next()
{
    if(pCurrent==NULL)
        cerr<<"已指向最后一个结点"<<endl;
    else pCurrent=pCurrent->next;
    return pCurrent;
}

int linklist::EndofList()
{
    if(pCurrent==NULL) return 1;
    else return 0;
}

void linklist::PrintList()
{
    node* p=head->next;
    while(p!=NULL)
    {
        cout<<p->data<<" ";
        p=p->next;
    }
    cout<<endl;
}

回复列表 (共2个回复)

沙发

以下为数据结构说明:

ADT node is
Data: nodes'data area & their pointer area
Operation
  node
    初始化值:数据项和next
    动作:    构造头结点
  setnext
    输入:    结点的指针p
    前置条件:无
    动作:    修改结点的next域,使指向p
    输出:    无
    后置条件:无
  setdata
    输入:    数据项
    前置条件:无
    动作:    修改结点的数据域
    输出:    无
    后置条件:无
End ADT node


ADT linklist is
Data: head,pCurrent
Operation
  linklist
    初始化值:无
    动作:    使头指针和当前指针指向头结点
  ~linklist
    动作:    释放所有结点
  Length
    输入:    无
    前置条件:无
    动作:    计算链表的长度
    输出:    链表的长度
    后置条件:无
  Trace
    输入:    链表的序号i
    前置条件:0<=i<=len
    动作:    取第i个结点的地址
    输出:    如果是合法序号,则返回第i个结点的地址;否则返回NULL
    后置条件:无
  GetCurrent
    输入:    无
    前置条件:非空表
    动作:    取当前结点的数据元素
    输出:    非空表则返回当前结点的数据元素;否则返回NULL
    后置条件:无
  Locate
    输入:    要定位的项x
    前置条件:无
    动作:    查找数据域为x的结点,并置为当前结点
    输出:    当前结点的指针
    后置条件:当前指针指向数据域为x的结点或空指针
  Insert
    输入:    要插入的项x
    前置条件:无
    动作:    插入新的项x
    输出:    无
    后置条件:当前指针指向该新结点
  DeleteCurrent
    输入:    无
    前置条件:非空表
    动作:    删除当前结点
    输出:    返回被删结点的数据值
    后置条件:当前指针指向被删结点的下一个结点
  Isempty
    输入:    无
    前置条件:无
    动作:    检查链表是否空
    输出:    空表输出1,否则输出0
    后置条件:无
  Clear
    输入:    无
    前置条件:无
    动作:    删除所有非头结点
    输出:    无
    后置条件:当前指针指向头结点
  Next
    输入:    无
    前置条件:非空链表
    动作:    当前指针后移一个位置
    输出:    当前结点的指针
    后置条件:当前指针后移一个位置
  EndofList
    输入:    无
    前置条件:无
    动作:    检查当前指针是否为空
    输出:    当前指针为空,则返回1;否则返回0
    后置条件:无
End ADT linklist

板凳

问题已解决!

我来回复

您尚未登录,请登录后再回复。点此登录或注册