2.3集合交运算问题

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1.问题描述

用线性表表示两个集合,求两个集合的交。

2.算法实现(程序):

头文件:

template

struct Node

{

T data;

Node *next;

};

template

class LinkList

{

private:

Node *Head;

public:

LinkList() ;//构造函数,创建空链表

~LinkList();//析构函数,删除表空间

void CreateList(int n);//创建具有n个元素的线性链表

T Delete(int i);//删除表中第i个元素

T GetElem(int i);//获取第i个元素的值

int Locate(T e);//在链表中查找值为e的元素

void ListDisplay();//输出表元素

};

template

LinkList::LinkList()//构建函数,建一空链表

{

Head=new Node;

Head->next=NULL;

}

template

LinkList::~LinkList()//析构函数,释放链表所占空间

{

Node *p;

while(Head)

{//从头结点开始,依次释放结点

p=Head;

Head=Head->next;

delete p;

}

Head=NULL;//头结点指向空

}

template

void LinkList::CreateList(int n)

{//尾插法(正序)创建具有n个元素的线性表

Node *p,*s;//设置工作指针。p指向尾结点

p=Head;

cout<<"请依次输入"<

for(int i=1;i<=n;i++)

{

s=new Node;//新建元素结点

cin>>s->data;//输入新建数据元素值

s->next=p->next;//新结点链入表尾

p->next=s;

p=s;

}

}

template

T LinkList::Delete (int i)

{//删除指定位置元素

T x;

Node *p,*q;//设置工作指针

p=Head;//查找从头结点开始

int j=0;//计数器初始化

while(p->next && j

{

p=p->next;

j++;

}

if(!p->next||j>i-1) throw"位置异常";//删除位置不合理else //删除位置合理

{

q=p->next;// 暂存删除结点位置

p->next=q->next;//从链表中摘除删除结点

x=q->data;//取删除数据元素的值

delete q;// 释放删除点

return x;//返回删除元素的值

}

}

template

int LinkList::Locate (T e)

{//按值定位

int j=1;

Node *p;

p=Head->next;

while(p && p->data!=e)

{

p=p->next;

j++;

}

if(p==NULL) return 0;

else return j;

}

template

T LinkList::GetElem(int i)

{//获取第i个元素的值

Node *p;//设置工作指针

p=Head->next;//从首结点开始

int j=1;//计数器初始化

while(p&&j

{

p=p->next;j++;

}

if(!p||j>i)//定位位置不合理:空表或i小于0或i大于表长throw "位置";

else //位置合理

return p->data;

}

template

void LinkList::ListDisplay()

{//显示链表

Node *p;

p=Head->next;

int i=1;

if(!p)cout<<"该集合为空";

else

{

while(p)

{

cout<data<<"\t";

p=p->next;

i++;

}

}

cout<

}

源文件:

#include//cout,cin

#include"process.h"//exit()

#include "LinkList.h"

typedef char T;

void main()

{T e;

int i;

char ans;

int flag=1;

while(flag)

{ int a=0;

LinkList La,Lb;

int la_len,lb_len;

cout<<"请输入要创建A集合中元素个数:";

cin>>la_len;//将创建的链表中数据元素的个数La.CreateList(la_len);

cout<<"请输入要创建的B集合中元素个数:";

cin>>lb_len;//将创建的链表中数据元素的个数Lb.CreateList(lb_len);

cout<<"La:"<<"\t";

La.ListDisplay();

cout<<"Lb:"<<"\t";

Lb.ListDisplay();

for(i=1;i<=la_len-a;i++)

{

e=La.GetElem(i);

if(!Lb.Locate(e))

{La.Delete(i),a++;i--;}

}//for

cout<<"union:"<<"\t";

La.ListDisplay();

cout<<"继续吗(Y/N)?"<

cin>>ans;

if(ans=='Y'||ans=='y')

flag=1;

else

{

flag=0;

相关文档
最新文档