首页 > 其他分享 >链表实现两个链表LA和LB的交集、并集、大整数相加

链表实现两个链表LA和LB的交集、并集、大整数相加

时间:2024-10-19 11:46:58浏览次数:8  
标签:LinkList LB ListInsert 并集 La int next 链表 Lc

#include<iostream>

using namespace std;

#include<math.h>

#define OK 1

#define ERROR 0

typedef int Status; 

typedef struct LNode {

        int data;  

        struct LNode *next;  

      } LNode, *LinkList;  

 

int ListLength (LinkList L) 

  {         

       LinkList p = L; int j = 0;

       while(p->next){

          p = p->next; ++j;

       }

       return j;

  return OK;

  }

 

Status ListInsert_L(LinkList &L, int i, int e) 

 {   

         if(i < 1 || i > ListLength(L)+1) return ERROR;

         LinkList p = L; int j = 0;

         while ( j<i-1 ) { p = p->next; ++j; } 

         LinkList s = new LNode; 

         s->data = e; 

         s->next = p->next;

         p->next = s; 

         return OK;

  } 

 

 Status GetElem_L(LinkList L, int i, int &e) 

  {

         if(i < 1 || i > ListLength(L)) return ERROR;

         LinkList p = L->next; int j = 1;

         for(;j<i;) {p = p->next; ++j;}

         e = p->data;

         return OK;

  }

int Locatead(LinkList L,int e){

    LinkList p;

    p=L->next;

    while(p){

        if(p->data==e){

            return 1;

        }

        p=p->next;

    }

    return 0;

}

Status ListDelete_L(LinkList &L, int i,int &e){

        if(i < 1 || i > ListLength(L)) return ERROR;

         LinkList p = L; int j = 0;

         while ( j<i-1 ) { p = p->next; ++j; } 

          //p指向第i-1个结点

 

         LinkList q=p->next; //临时保存被删结点的地址以备释放 

         e=q->data;

         p->next=q->next; //改变被删结点前驱结点的指针域 

         delete q; //释放删除结点的空间           

         return OK;

  } 

  //输出函数

void Print(LinkList L){

    LinkList p=L->next;

// int Ll=ListLength(L);

    while(p){

        cout<<p->data<<" ";

        p=p->next;

    }

// 并集函数

void SumList(LinkList &La,LinkList &Lb){

    int Lal=ListLength(La);

    int Lbl=ListLength(Lb);

    LinkList pa=La->next,pb=Lb->next;

    int i=1,e;

    for(int i=1;i<=Lbl;i++){

        GetElem_L(Lb,i,e);

        while(!Locatead(La,e)){

            ListInsert_L(La,Lal++,e);

        }

    }

}

 //交集函数

void jiaoList(LinkList &Lc,LinkList &Ld){

     int cl=ListLength(Lc);

     int dl=ListLength(Ld);

     LinkList pc=Lc->next;

     LinkList pd=Ld->next;

     int i,e;

     for(int i=1;i<=dl;i++){

         GetElem_L(Ld,i,e);

         if(!Locatead(Lc,e)){

             ListDelete_L(Lc,i,e);

         }

     }

 } 

//大整数相加函数

int BigsumList(LinkList &Le,LinkList &Lf){

    int el=ListLength(Le);

    int fl=ListLength(Lf);

    int m=pow(10,el-1);

    int n=pow(10,fl-1);

    int sum1=0,sum2=0;

    LinkList pe=Le->next;

    LinkList pf=Lf->next;

    for(int i=1;i<=el;i++){

        sum1+=(pe->data)*m;

        m=m/10;

        pe=pe->next;

    }

    for(int i=1;i<=fl;i++){

        sum2+=(pf->data)*n;

        n=n/10;

        pf=pf->next;

    }

    int s=sum1+sum2;

    return s;

 

int main()

{

    LinkList La,Lb; 

    int e;

    La=new LNode;

    Lb=new LNode;

    La->next=NULL;

    Lb->next=NULL;

// 输入La和Lb的值 

    ListInsert_L(La,1,20);

    ListInsert_L(La,2,30);

    ListInsert_L(La,3,15);

    ListInsert_L(Lb,1,12);

    ListInsert_L(Lb,2,18);

// 调用并集函数 

    SumList(La,Lb);

    cout<<"La和Lb的交集为:\n"; 

    Print(La);

    cout<<"\n";

    LinkList Lc,Ld; 

    Lc=new LNode;

    Ld=new LNode;

    Lc->next=NULL;

    Ld->next=NULL;

// 输入Lc和Ld的值 

    ListInsert_L(Lc,1,20);

    ListInsert_L(Lc,2,30);

    ListInsert_L(Lc,3,15);

    ListInsert_L(Ld,1,12);

    ListInsert_L(Ld,2,30);

    ListInsert_L(Ld,3,15);

    ListInsert_L(Ld,4,18);

    //调用交集函数 

    jiaoList(Lc,Ld);

    cout<<"Lc和Ld的的交集为:\n";

    Print(Lc);

    cout<<"\n";

 LinkList Le,Lf;

 Le=new LNode; //new一个新结点 

 Lf=new LNode;

 Le->next=NULL; //新结点置空

 Lf->next=NULL;

 //输入Le和Lf的值

    ListInsert_L(Le,1,2);

    ListInsert_L(Le,2,3);

    ListInsert_L(Le,3,4);

    ListInsert_L(Lf,1,1);

    ListInsert_L(Lf,2,1);

    ListInsert_L(Lf,3,2);

// 调用大整数相加函数

 int s=BigsumList(Le,Lf);

 cout<<"大整数相加和为:\n";

 cout<<s<<endl;

    return 0;

}

标签:LinkList,LB,ListInsert,并集,La,int,next,链表,Lc
From: https://blog.csdn.net/2301_80777156/article/details/143033263

相关文章

  • HDLBits中文版,标准参考答案 | 3.3 Building Larger Circuits | 构建更大的电路
    关注 望森FPGA 查看更多FPGA资讯这是望森的第21期分享作者|望森来源|望森FPGA目录1Counterwithperiod100024-bitshiftregisteranddowncounter3FSM:Sequence1101recognizer4FSM:Enableshiftregister5FSM:ThecompleteFSM6Thecomplet......
  • 02.数据结构介绍&顺序表、链表简述+对比
    目录一、什么是数据结构二、线性表三、顺序表四、链表五、顺序表和链表的区别一、什么是数据结构          数据结构是由“数据”和“结构”两个词组合而来。    数据:常见的数值1、2、3......,网页里的文字图片信息等都是数据。    ......
  • 代码随想录算法训练营第三天|203.移除链表元素,707.设计链表,206.反转链表
    1前言今日主要学习链表的基础leetcode203移除链表元素leetcode707设计链表leetcode206反转链表2链表的基础链表分为单链表和双链表,与字符串的区别就是链表是在一个里面存储了数据+下一个数据的内存地址链表中存储的内存空间是可以不连续的2.1链表的定义2.1.1......
  • 83. 删除排序链表中的重复元素 线性法&快慢双指针
    83.删除排序链表中的重复元素给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。示例1:输入:head=[1,1,2]输出:[1,2]示例2:输入:head=[1,1,2,3,3]输出:[1,2,3]提示:链表中节点数目在范围 [0,300] 内-100<=......
  • 109. 有序链表转换二叉搜索树【二叉树】
    文章目录109.有序链表转换二叉搜索树解题思路Go代码109.有序链表转换二叉搜索树109.有序链表转换二叉搜索树给定一个单链表的头节点head,其中的元素按升序排序,将其转换为平衡二叉搜索树。平衡二叉树是指该树所有节点的左右子树的深度相差不超过1。示例......
  • 力扣面试题02.07.链表相交
    题目链接:面试题02.07.链表相交-力扣(LeetCode)给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。图示两个链表在节点 c1 开始相交:题目数据 保证 整个链式结构中不存在环。注意,函数返回结果......
  • 力扣142.环形链表II
    题目链接:142.环形链表II-力扣(LeetCode)给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。为了表示给定链表中的环,评测系统内部使用整数 pos 来表示......
  • 【数据结构】之链表详解
    链表是一种常用的数据结构,它是一种线性数据结构,但与数组不同,它并非连续存储数据,而是通过指针将数据节点连接起来。每个节点都包含数据域和指向下一个节点的指针域。这种结构赋予链表独特的优势和局限性,使其在某些场景下优于数组,在另一些场景下则相对逊色。本文将深入探讨链表,包......
  • Scrollbar
    目录新建效果展示参数解释代码示例新建选中或者创建新节点手动挂载或者使用快捷键(GameObject->UI->Scrollbar)创建脚本Scrollbar效果展示参数解释Interactable此组件是否接受输入?此属性确定该组件是否接受输入。此属性设置为false时,交互被禁用,过渡状态也将设......
  • 翻转链表常用写法
    翻转链表常用写法循环写法classSolution{public:ListNode*reverseList(ListNode*head){ListNode*prev=nullptr,*next=nullptr,*now=head;while(now){next=now->next;now->next=prev;prev=......