数据结构与算法 p45-09
已知两个元素按值递增有序排列的线性表A和B,且同一表中的元素值各不相同。
试构造一个线性表C,其为A和B中的元素的交集,且表C中的元素也按值递增有序排列
A,B,C都是顺序表时
http://blog.csdn.net/weimengnvbianba/article/details/15028171
A,B,C都是单链表表时
#include<iostream.h>
typedef int T;
template<class T>
struct Node
{
T data;//数据域,存放表元素
Node *next;//指针域,指向下一个结点
};
template <class T>
class LinkList
{
private:
Node<T> *Head;// 链表头指针
public:
LinkList() ;
~LinkList();
void CreateList(int n);//创建具有n个元素的线性链表
void createlist(int n,int a[]);//创建合并的线性链表
void Delete(int i);
T GetElem(int i);
int Length();
void ListDisplay();
};
template<class T>
LinkList<T>::LinkList()
{
Head=new Node<T>;
Head->next=NULL;
}
template<class T>
LinkList<T>::~LinkList()
{
Node<T> *p;
while(Head)//从头结点开始,依次释放结点
{
p=Head;
Head=Head->next;
delete p;
}
Head=NULL;//头结点指向空
}
template<class T>
void LinkList<T>::CreateList(int n)
{
Node<T> *p,*s;//设置工作指针。p指向尾结点
int start,step;
p=Head;
cout<<"请依次输入初始值和步长:"<<endl;
cin>>start>>step;
for(int i=1;i<=n;i++)
{
s=new Node<T>;
s->data=start+(i-1)*step;
s->next=p->next;
p->next=s;
p=s;
}
}
template<class T>
void LinkList<T>::createlist(int k,int a[])
{
Node<T> *p,*s;
p=Head;
for(int i=1;i<=k;i++)
{
s=new Node<T>;
s->data=a[i-1];//输入新建数据元素值
s->next=p->next;
p->next=s;
p=s;
}
}
template <class T>
void LinkList<T>::Delete (int i)
{//删除指定位置元素
Node<T> *p,*q;//设置工作指针
p=Head;//查找从头结点开始
int j=0;//计数器初始化
while(p->next && j<i-1)//p定位到删除点的前驱
{
p=p->next;//
j++;
}
if(!p->next||j>i-1) //删除位置不合理
throw"位置异常";
else //删除位置合理
{
q=p->next;// 暂存删除结点位置
p->next=q->next;//从链表中摘除删除结点
delete q;// 释放删除点
}
}
template<class T>
T LinkList<T>::GetElem(int i)
{//获取第i个元素的值
Node<T> *p;//设置工作指针
p=Head->next;//从首结点开始
int j=1;//计数器初始化
while(p&&j<i)//定位到第i个元素结点
{
p=p->next;j++;
}
if(!p||j>i)//定位位置不合理:空表或i小于0或i大于表长
throw "位置";
else //位置合理
return p->data;
}
template <class T>
int LinkList<T>::Length()
{
int len=0;//计数器初始化
Node<T> *p;//设置工作指针
p=Head;//指向头结点
while(p->next)
{
len++;p=p->next;
}
return len;
}
template <class T>
void LinkList<T>::ListDisplay()
{//遍历显示链表
Node<T> *p;//设置工作指针
p=Head->next;//从首元结点开始遍历
int i=1;//元素位序
while(p)
{
cout<<p->data<<" ";
p=p->next;
i++;
}
cout<<endl;
}
int main()
{
int t=0,la_len,lb_len,a,b,array[100],i,j;
LinkList<int> La,Lb,Lc;
cout<<"请输入要创建A集合中元素个数:";
cin>>la_len;
La.CreateList(la_len);
cout<<endl<<"La:"<<"\t";
La.ListDisplay();
cout<<endl<<"请输入要创建的B集合中元素个数:";
cin>>lb_len;
Lb.CreateList(lb_len);
cout<<endl<<"Lb:"<<"\t";
Lb.ListDisplay();
int a_length=La.Length();
int b_length=Lb.Length();
for(i=1;i<a_length;i++)
{
a=La.GetElem(i);
for(j=1;j<=b_length;j++)
{
b=Lb.GetElem(j);
if(a<b)
break;
if(a==b)
{
array[t]=b;
t++;
break;
}
}
}
cout<<endl<<"A集合和B集合的交集C的元素如下:";
Lc.createlist(t,array);
cout<<endl<<"Lc:"<<"\t";
Lc.ListDisplay();
cout<<endl;
return 0;
}