p45-09

数据结构与算法 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;  
}  


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值