我是靠谱客的博主 花痴豆芽,最近开发中收集的这篇文章主要介绍链表的集合交集与并集1 例题2 链表合并另一种思路参考文章,请点击,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

文章目录

  • 1 例题
  • 2 链表合并另一种思路[参考文章,请点击](https://blog.csdn.net/weixin_39916039/article/details/80516790#commentBox)

1 例题

在这里插入图片描述
在这里插入图片描述

#include <bits/stdc++.h>

using namespace std;

typedef int ElemType;

typedef struct ListNode
{
    int val;
    ListNode *next;
    //ListNode(int x):val(x),next(NULL){}
}ListNode;

typedef struct ListNode *LinkList;

void Create(LinkList *L ,int EndTag);
int locate_elem(LinkList L ,ElemType e);
void Insert_elem(LinkList *L,int i,ElemType e);
void Delete_elem(LinkList *L,ElemType e);
void inter_sec(LinkList *A,LinkList *B);
void uni(LinkList *A,LinkList *B);
void show_afterSort(LinkList A);

int main()
{
    //freopen("1.txt","r",stdin);
    std::ios::sync_with_stdio(false);

    int end_tag;
    cin>>end_tag;

    LinkList A_;
    LinkList B_;

    Create(&A_,end_tag);
    LinkList pa=A_;
    pa=pa->next;
    cout<<"A is created as: ";
    while(pa)
    {
        cout<<pa->val<<" ";
        pa=pa->next;
    }
    cout<<endl;

    int ind;
    int ele;
    cin>>ind>>ele;
    Insert_elem(&A_,ind,ele);

    int elem;
    cin>>elem;
    Delete_elem(&A_,elem);

    int find_ele;
    cin>>find_ele;
    locate_elem(A_,find_ele);

    int not_find;
    cin>>not_find;
    locate_elem(A_,not_find);

    int end_tag2;
    cin>>end_tag2;

    Create(&B_,end_tag2);
    LinkList pb=B_;
    pb=pb->next;
    cout<<"B is created as: ";
    while(pb)
    {
        cout<<pb->val<<" ";
        pb=pb->next;
    }
    cout<<endl;

    inter_sec(&A_,&B_);
    uni(&A_,&B_);
    show_afterSort(A_);

    free(A_);
    free(B_);

    return 0;
}

/*
* 建立 带 表头结点的单线性链表L(尾插法)
* L为头结点
*/
void Create(LinkList *L ,int EndTag)
{
    LinkList p,r;

    int tmp;
    cin>>tmp;

    *L=(LinkList)malloc(sizeof(ListNode));

    r=*L;//r为指向尾部的节点

    while(tmp!=EndTag)
    {
        p=(ListNode*)malloc(sizeof(ListNode));//产生新节点
        p->val=tmp;

        /*尾插法*/
        r->next=p;
        r=p;

        cin>>tmp;
    }

    r->next=NULL;//表示当前链表结束

}


/*  寻找元素,并返回在链表中的位置
*   在指定链表L(注意没用LinkList *L,By value,非By reference)里面寻找elem
*
*/
int locate_elem(LinkList L ,ElemType e)
{
    int i=0;

    LinkList tmp;
    tmp=L->next;

    while(tmp)
    {
        i++;
        if(e==tmp->val)
            {
                cout<<e<<" is located at index of "<<i<<endl;
                return 1;
            }
        tmp=tmp->next;
    }

    cout<<e<<" is not found"<<endl;
    return 0;
}

/*
* 插入元素,向*L这个链表插入元素
* By reference,函数参数传递地址,以便在主函数里面可以修改链表
*
*/
void Insert_elem(LinkList *L,int i,ElemType e)//By reference,函数参数传递地址,以便在主函数里面可以修改链表
{
    LinkList tmp;
    tmp=*L;
    //tmp=tmp->next;//tmp这个时候是第一个元素

    int j=1;
    while(tmp&&j<i)
    {
        j++;
        tmp=tmp->next;
    }

    //tmp这个时候就是链表第i个元素,开始插入
    LinkList inse;
    inse=(LinkList)malloc(sizeof(ListNode));//产生新节点
    inse->val=e;
    inse->next=tmp->next;
    tmp->next=inse;//巨他妈呢坑

    LinkList p=*L;
    p=p->next;
    cout<<"After inserted A is ";
    while(p)
    {
        cout<<p->val<<" ";
        p=p->next;
    }
    cout<<endl;
}


/*
** 删除链表*L中的元素,函数参数By reference
*/
void Delete_elem(LinkList *L,ElemType e)
{
    LinkList tmp;
    tmp=*L;//tmp这个时候是链表的第一个元素

    LinkList q;//用来回收被删除的节点
    while(tmp->next)
    {
        if(tmp->next->val==e)
        {
            q=tmp->next;
            tmp->next=q->next;
            free(q);//而不是free(tmp->next)
            break;
        }
        tmp=tmp->next;
    }

    LinkList p=*L;
    p=p->next;
    cout<<"After deleted A is ";
    while(p)
    {
        cout<<p->val<<" ";
        p=p->next;
    }
    cout<<endl;
}


/*
* 求交集,链表A和B,修改了链表A和B
*
*
*/
void inter_sec(LinkList *A,LinkList *B)
{
    LinkList a_tmp=*A;
    LinkList b_tmp=*B;

    a_tmp=a_tmp->next;
    //b_tmp=b_tmp->next;
    vector<int> arr;//存储交集
    while(a_tmp)
    {
        while(b_tmp->next)
        {
            if(b_tmp->next->val==a_tmp->val)
            {
                arr.push_back(a_tmp->val);
                LinkList p=b_tmp->next;
                b_tmp->next=p->next;
                free(p);
                break;
            }
            b_tmp=b_tmp->next;
        }
        a_tmp=a_tmp->next;
    }

    sort(arr.begin(),arr.end());
    cout<<"A cross B is ";
    for(int i=0;i<=arr.size()-1;i++)
        cout<<arr[i]<<" ";
    cout<<endl;
}

/*
* 求并集,
* 修改A和B, By reference
*
*/
void uni(LinkList *A,LinkList *B)
{
    LinkList a_tmp=*A;
    LinkList b_tmp=*B;
    a_tmp=a_tmp->next;
    b_tmp=b_tmp->next;

    while(a_tmp->next)//巨他妈坑
        a_tmp=a_tmp->next;

    a_tmp->next=b_tmp;

    LinkList a_tmp2=*A;
    cout<<"A union B is ";
    a_tmp2=a_tmp2->next;
    while(a_tmp2)
    {
        cout<<a_tmp2->val<<" ";
        a_tmp2=a_tmp2->next;
    }
    cout<<endl;
}

void show_afterSort(LinkList A)
{
    vector<int> arr;
    LinkList p=A->next;

    while(p)
    {
        arr.push_back(p->val);
        p=p->next;
    }

    sort(arr.begin(),arr.end());
    cout<<"A union B in sequence is ";
    for(int i=0;i<=arr.size()-1;i++)
        cout<<arr[i]<<" ";
}

2 链表合并另一种思路参考文章,请点击

最后

以上就是花痴豆芽为你收集整理的链表的集合交集与并集1 例题2 链表合并另一种思路参考文章,请点击的全部内容,希望文章能够帮你解决链表的集合交集与并集1 例题2 链表合并另一种思路参考文章,请点击所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(32)

评论列表共有 0 条评论

立即
投稿
返回
顶部