阿强134 2018-03-02 03:33 采纳率: 0%
浏览 2831
已结题

用单链表实现集合的交、并、差运算

三段式c++
主函数里,
1.如何调用指针函数(下方蓝色字体函数如何调用)。
2.函数中的参数(指针类型的对象,应该如何传入)。
3.如何让指针对象初始化(指向单链表的表头)

“LinlList.h”
#define SLIST
template
struct Node{
T data;
struct Node *next;
};
template
class LinkList
{
public:
LinkList();
LinkList(T a[],int n); //尾插
LinkList(int n,T a[]);
~LinkList();
int GetLength();
T Get(int i);
void Set(int i,T x);
int Locate(T x);
void Insert (int i,int j,T a[]);
T Delete(int i);
void PrintLinkList();
Node *GetFirst();
Node *Union(LinkList *la,LinkList *lb);
Node *Intersection(LinkList *la,LinkList *lb);
Node *Difference(LinkList *la,LinkList *lb);
Node *Judge(LinkList *la,LinkList *lb);
private:
T data;
Node *first;
};

“LinkList.cpp”
#include "LinkList.h"
#include
#include
using namespace std;
template
LinkList::LinkList()
{
first=new Node;
first->next=NULL;
}
template
LinkList::LinkList(T a[],int n)
{
first=new Node;Node *s;
first->next=NULL;
for (int i=0;i {
s=new Node; s->data=a[i];
s->next=first->next;first->next=s;
}
}
template
LinkList::LinkList(int n,T a[])
{
first=new Node;first->next=NULL;
Node *r=first,*s;
for(int i=0;i {
s=new Node;s->data=a[i];r->next=s;r=s;
}
r->next=NULL;
}
template
LinkList::~LinkList()
{
Node *p=first;
while (p)
{
Node *q=p;
p=p->next;delete q;
}
}
template
int LinkList::GetLength()
{
Node *p=first; int j=0;
while (p)
{
p=p->next;j++;
}
return j;
}
template
T LinkList::Get(int i)
{
Node *p=first->next;int j=1;
while(p&&jnext;j++;}
if(!p) throw"位置錯誤";else return p->data;
}
template
void LinkList::Set(int i,T x) //把i位置的元素用X替代
{
Node *p=first->next; int j=1;
while (p&&jnext;j++;
}
if(!p) throw "位置error";
else p->data=x;
}

/*
template
void LinkList::Insert(int i,T x)
{
Node *p=first;int j=0;
while (p&&i-1)
{

p=p->next;j++;
}
if(!p)throw"位置出錯";
else{ Node *s=new Node;
s->data=x;s->next=p->next;p->next=s;
}

}*/

template
void LinkList::Insert(int i,int j,T a[])
{
Node *p=first;int k=0;
while (p&&i-1)
{

p=p->next;k++;
}
if(!p)throw"位置出錯";
else{ Node *s=new Node;
s->data=a[j];s->next=p->next;p->next=s;
}

}

template
T LinkList::Delete(int i)
{
Node *p;
int j;
while (p&&j {p=p->next;j++;}
if(!p||!p->next) throw"位置";
else{Node *q=p->next;
T x=q->data;p->next=q->next;
delete q; return x;
}

}

template
void LinkList::PrintLinkList()
{
Node *p=first->next;
while (p)
{
cout<data;
p=p->next;
}
}
template
Node *LinkList::GetFirst()
{
return first;
}

template
Node *LinkList::Union(LinkList *la,LinkList *lb) //并运算
{
Node *pa,*pb,*p,*pc,*atail,*tail;
LinkList *lc;
pa=(la->GetFirst())->next;
pb=(lb->GetFirst())->next;
atail=pa;
while(atail->next!=NULL)
atail=atail->next; //atail指向la单链表的尾结点
tail=atail //tail指向la单链表与lb单链表合并处
lc=la; //对象la赋值给对象lc(la单链表头结点作为lc单链表头结点)

while(pb)
{
while(pb->data!=pa->data && pa!=atail)
pa=pa->next;

if (pb->data==pa->data)
{
p=pb;pb=pb->next;
delete p;
pa=la->GetFirst()->next;
}
else
if(pb->data!=pa->data)
{
atail->next=pb; atail=atail->next;
pb=pb->next; pa=la->GetFirst()->next;

    } 
    else
    {
     p=pb;pb=pb->next;  delete p;
     pa=la->GetFirst()->next;
    }

}
atail->next=NULL; lb->GetFirst()->next=NULL;
return lc->GetFirst()->next;

}

template
Node *LinkList::Intersection(LinkList *la,LinkList *lb) //交运算
{

return lc->GetFirst()->next;

}

template

Node *LinkList::Difference(LinkList *la,LinkList *lb) //差运算
{

return lc->GetFirst()->next;
}

template

Node *LinkList::Judge(LinkList *la,LinkList *lb) //子集判定
{

return lc->GetFirst()->next;

}

LinkList-main.cpp
#ifndef SLIST
#include "LinkList.cpp"
#endif
#include
using namespace std;
int main()
{
try{
int r1[]={1,2,3,4,5};
cout<<"\n前插方式新建单链表b!"< LinkList a(r1,5);
cout<<"单链表b的元素为:";
a.PrintLinkList() ;
cout<<"\n单链表b的长度为:"< int r2[]={6,7,8,9,10};
cout LinkList b(5,r2);
cout<<"单链表c的元素为:";
b.PrintLinkList() ;
cout<<"\n单链表c的长度为:";
cout< LinkList d;

LinkList *la;
LinkList *lb;

    d.Union(LinkList<T> *la,LinkList<T> *lb); 


    /*if(c.GetLength())
    {
        cout<<"执行删除第一个元素操作:"<<endl;
        c.Delete(1);
        cout<<"已删除成功,单链表c的长度为:";
        cout<<c.GetLength() <<endl;
    }
    else cout<<"单链表c长度为0"<<endl;*/
//  cout<<"单链表c为:";
//  c.PrintLinkList() ;

}
catch(const char *msg)
  {cout<<msg;
   } 
return 0;

}

  • 写回答

5条回答

  • woshixiaogeng 2018-03-02 03:55
    关注

    我是来挣积分的 不错很好的代码哦

    评论

报告相同问题?

悬赏问题

  • ¥15 NAO机器人的录音程序保存问题
  • ¥15 C#读写EXCEL文件,不同编译
  • ¥15 MapReduce结果输出到HBase,一直连接不上MySQL
  • ¥15 扩散模型sd.webui使用时报错“Nonetype”
  • ¥15 stm32流水灯+呼吸灯+外部中断按键
  • ¥15 将二维数组,按照假设的规定,如0/1/0 == "4",把对应列位置写成一个字符并打印输出该字符
  • ¥15 NX MCD仿真与博途通讯不了啥情况
  • ¥15 win11家庭中文版安装docker遇到Hyper-V启用失败解决办法整理
  • ¥15 gradio的web端页面格式不对的问题
  • ¥15 求大家看看Nonce如何配置