目录
1.顺序有序表的合并
        重复式合并
        不重复式合并
2.链式有序表的合并
        重复式合并
        不重复式合并
3.链式有序表的反序合并
4.两个递增链表的交集
5.两个递增链表的差集
6.6.稀疏多项式的合并

1.顺序有序表的合并

1.1重复式合并

已知有两个有序集合A和B按照递增有序排列,现在有一个集合C =AUB,C也要按照递增有序排列,举例:A={3,5,8,11},B={2,6,8,9,11,15,20},那么C={2,3,5,6,8,8,9,11,11,15,20}


void MergeList(SqList La,SqList Lb,SqList &Lc)
{Lc.length=La.length+Lb.length;Lc.elem=new ElemType[Lc.length];ElemType *pc=Lc.elem;//pc指向集合C的第一个元素 ElemType *pa=La.elem;//pa指向集合A的第一个元素 ElemType *pb=Lb.elem;//pb指向集合B的第一个元素 ElemType *pa_last=La.elem+La.length-1;//指向A集合的尾元素 ElemType *pb_last=Lb.elem+Lb.length-1;//指向B集合的尾元素 while((pa<=pa_last)&&(pb<=pb_last)){if(*pa<=*pb)//比较两个元素大小,小的在前大的在后 *pc++=*pa++;//赋值的同时指针向后移动 else*pc++=*pb++;}while(pa<=pa_last)//谁先结束谁再次循环 *pc++=*pa++;while(pb<=pb_last)*pc++=*pb++;
} 

1.2不重复式合并

已知有两个有序集合A和B按照递增有序排列,现在有一个集合C =AUB,C也要按照递增有序排列,举例:A={3,5,8,11},B={2,6,8,9,11,15,20},那么C={2,3,5,6,8,9,11,15,20}

void MergeList(SqList La,SqList Lb,SqList &Lc)
{Lc.length=La.length+Lb.length;Lc.elem=new ElemType[Lc.length];ElemType *pc=Lc.elem;//pc指向集合C的第一个元素 ElemType *pa=La.elem;//pa指向集合A的第一个元素 ElemType *pb=Lb.elem;//pb指向集合B的第一个元素 ElemType *pa_last=La.elem+La.length-1;//指向A集合的尾元素 ElemType *pb_last=Lb.elem+Lb.length-1;//指向B集合的尾元素 while((pa<=pa_last)&&(pb<=pb_last)){if(*pa<*pb)//比较两个元素大小,小的在前大的在后 *pc++=*pa++;//赋值的同时指针向后移动 else if(*pa>*pb){*pc++=*pb++;}else{*pc++=*pa++;//把两者之一插入即可pb++;//两个表的指针都要向后移动Lc.length--;//对于长度需要减1}}while(pa<=pa_last)//谁先结束谁再次循环 *pc++=*pa++;while(pb<=pb_last)*pc++=*pb++;
}

2.链式有序表的合并

已知有两个有序集合A和B按照递增有序排列,现在有一个集合C =AUB,C也要按照递增有序排列,举例:A={3,5,8,11},B={2,6,8,9,11,15,20},那么C={2,3,5,6,8,8,9,11,11,15,20}

2.1重复式合并

已知有两个有序集合A和B按照递增有序排列,现在有一个集合C =AUB,C也要按照递增有序排列,举例:A={3,5,8,11},B={2,6,8,9,11,15,20},那么C={2,3,5,6,8,8,9,11,11,15,20}

void MergeList(LinkList &La,LinkList &Lb,LinkList &Lc)//两链表合并
{LinkList pa,pb,pc;pa=La->next;pb=Lb->next;Lc=La;//让la的头结点作为lc的头结点 pc=Lc; //pc初始化也指向la的头结点 while(pa&&pb)//两集合如果都没到最后那么进行此循环进行,按照从小到大的顺序将结点依次相连 {if(pa->data<=pb->data){pc->next=pa;pc=pa;pa=pa->next;}else{pc->next=pb;pc=pb;pb=pb->next;}}pc->next=pa?pa:pb;//当其中一个链表结束,那么插入另外一个链表的剩余的部分 delete Lb;//释放Lb的头结点
} 

2.2不重复式合并

已知有两个有序集合A和B按照递增有序排列,现在有一个集合C =AUB,C也要按照递增有序排列,举例:A={3,5,8,11},B={2,6,8,9,11,15,20},那么C={2,3,5,6,8,9,11,15,20}

void MergeList(LinkList &La,LinkList &Lb,LinkList &Lc)//两链表合并
{LinkList pa,pb,pc,q;pa=La->next;pb=Lb->next;Lc=La;//让la的头结点作为lc的头结点 pc=Lc; //pc初始化也指向la的头结点 while(pa&&pb)//两集合如果都没到最后那么进行此循环进行,按照从小到大的顺序将结点依次相连 {if(pa->data<pb->data){pc->next=pa;pc=pa;pa=pa->next;}else if(pa->data>pb->data){pc->next=pb;pc=pb;pb=pb->next;}else{pc->next=pa;pc=pa;pa=pa->next;q=pb->next;delete pb;pb=q;}}pc->next=pa?pa:pb;//当其中一个链表结束,那么插入另外一个链表的剩余的部分 delete Lb;//释放Lb的头结点
}

3.链式有序表的反序合并

已知有两个有序集合A和B按照递增有序排列,现在有一个集合C =AUB,C也要按照递减有序排列,举例:A={3,5,8,11},B={2,6,8,9,11,15,20},那么C={20,15,11,11,11,9,8,8,6,5,3,2}

#include<stdio.h>
#include<iostream>
using namespace std;
#define OK  1
#define ERROR 0
#define MAXSIZE 100
typedef  int  Status;
typedef  int  ElemType;
typedef struct LNode{ElemType data;struct LNode *next;
}LNode,*LinkList;
Status InitList(LinkList &L)//初始化单链表
{L=new LNode;L->next=NULL;return OK;
}
void CreateList(LinkList &L,int n)//创建顺序表函数,初始化前几个元素
{LinkList p,q;q=L;for(int i=n;i>0;i--){p=new LNode;cin>>p->data;p->next=NULL;q->next=p;q=p;}
}
void TraverseList_L(LinkList l)//遍历集合
{l=l->next;while(l){if(l->next!=NULL)cout<<l->data<<",";elsecout<<l->data;    l=l->next;}
}
void MergeList(LinkList &La,LinkList &Lb)//两链表合并
{LinkList pa,pb,p;pa=La->next;pb=Lb->next; La->next=NULL;while(pa&&pb)//两集合如果都没到最后那么进行此循环进行,按照从小到大的顺序将结点依次相连 {if(pa->data<=pb->data){p=pa->next;pa->next=La->next;La->next=pa;pa=p; }else{p=pb->next;pb->next=La->next;La->next=pb;pb=p;}}while(pa){p=pa->next;//把pa的后继暂存于ppa->next=La->next;//将pa结点链接于结果表中,同时实现倒置La->next=pa;pa=p;}while(pb){p=pb->next;pb->next=La->next;La->next=pb;pb=p;}delete Lb;//释放Lb的头结点
}
int main()
{   LinkList La;LinkList Lb;InitList(La);InitList(Lb);int n;int m;cout<<"请输入在表A中添加的元素个数:";cin>>n; CreateList(La,n);cout<<"请输入在表B中添加的元素个数:";cin>>m; CreateList(Lb,m);cout<<"两表合并后的表c元素依次为:"; MergeList(La,Lb);TraverseList_L(La);
}

4.两个递增链表的交集

已知有两个有序集合A和B按照递增有序排列,现在有一个集合C =AUB,C也要按照递减有序排列,举例:A={3,5,8,11},B={2,6,8,9,11,15,20},那么C={8,11}

void Intersection(LinkList &La,LinkList &Lb,LinkList &Lc)
{LinkList pa,pb,pc,q;pa=La->next;pb=Lb->next;Lc=pc=La;while(pa&&pb){if(pa->data==pb->data){pc->next=pa;pc=pa;pa=pa->next;q=pb;pb=pb->next;delete q;  } else if(pa->data<pb->data){q=pa;pa=pa->next;delete q;}else{q=pb;pb=pb->next;delete q;}while(pa){q=pa;pa=pa->next;delete q;}while(pb){q=pb;pb=pb->next;delete q;}pc->next=NULL;delete Lb;    }
}

5.两个递增链表的差集

我们有两个链表A,B,差集表示的是指仅在A中出现而不再B中出现的元素所构成的集合,并返回该集合的个数

void Difference(LinkList &La,LinkList &Lb,LinkList &Lc)
{LinkList pa,pb,pre,q;pa=La->next;pb=Lb->next;pre=La;int n=0;while(pa&&pb){if(pa->data<pb->date){n++;pre=pa;pa=pa->next;}else if(pa->data>pb->data)pb=pb->next;else{pre->next=pa->next;q=pa;pa=pa->next;delete q;}}while(pa){n++;pa=pa->next; }
}

6.稀疏多项式的合并

比如我们有两个多项式A(x)=7+3x+9x8+5x17,B(x)=8x+22x7-9x8,要求把他们俩相加合并

#include<iostream>
using namespace std;
typedef struct PNode{float coef;//系数 int expn;//指数  struct PNode *next;
}PNode,*Polynomial;
void CreatePolyn(Polynomial &P,int n)//输入n项系数和指数,建立多项式有序链表P
{Polynomial s,pre,p,q;P=new PNode;//建立一个带头结点的单链表 P->next=NULL;for(int i=1;i<=n;i++){s=new PNode;//生成新的结点 cin>>s->coef>>s->expn;pre=P;//pre用于保存q的前驱,初值为头结点 q=P->next;//q初始化指向第一个有元素的结点 while(q&&q->expn<s->expn)//通过比较指数找到第一个大于输入项指数的项*q {pre=q;q=q->next;}s->next=q;//把新的结点s插在q和前驱结点之间 pre->next=s;}
}
void AddPolyn(Polynomial &pa,Polynomial &pb)//计算多项式的和
{float sum; Polynomial p1,p2,p3,r;p1=pa->next;//p1,p2分别指向第一个有元素的结点 p2=pb->next;p3=pa;//p3就是运算后的结果链表的头指针,初始值为pa while(p1&&p2)//p1和p2均为非空 {if(p1->expn==p2->expn)//如果两个指数相同 {sum=p1->coef+p2->coef;//系数相加 if(sum!=0){p1->coef=sum;//修改pa当前结点的系数值为两项系数之和 p3->next=p1;// 将修改后的pa当前结点链在p3之后,p3指向p1 p3=p1;p1=p1->next;r=p2;p2=p2->next;delete r;}else{r=p1;p1=p1->next;delete r;r=p2;p2=p2->next;delete r;}}else if(p1->expn<p2->expn){p3->next=p1;p3=p1;p1=p1->next;}else{p3->next=p2;p3=p2;p2=p2->next;}} p3->next=p1?p1:p2;delete pb;
}
void print(Polynomial L1)//依次打印各个结点的系数和指数
{L1=L1->next;while(L1){cout<<endl<<L1->coef<<" "<<L1->expn<<endl; L1=L1->next;}
}
int main()
{Polynomial L1;Polynomial L2;int n;int m;cout<<"请输入第一个链表的元素个数和各个元素的系数和指数值:";cin>>n; CreatePolyn(L1,n);cout<<"请输入第一个链表的元素个数和各个元素的系数和指数值:";cin>>m;CreatePolyn(L2,m);AddPolyn(L1,L2);cout<<"------------------------运行结果为----------------------------------\n"; print(L1);
}

线性表应用之线性表算法设计六大经典案例相关推荐

  1. DL:深度学习(神经网络)的简介、基础知识(神经元/感知机、训练策略、预测原理)、算法分类、经典案例应用之详细攻略

    DL:深度学习(神经网络)的简介.基础知识(神经元/感知机.训练策略.预测原理).算法分类.经典案例应用之详细攻略 目录 深度学习(神经网络)的简介 1.深度学习浪潮兴起的三大因素 深度学习(神经网络 ...

  2. 高贵灰html设计,设计时代 经典案例 | 极简水泥灰,一种高贵的朴素

    原标题:设计时代 经典案例 | 极简水泥灰,一种高贵的朴素 混凝土显示的是一种最本质的美感 体现的是"素面朝天"的品位 我们通常把素混凝土俗称为"水泥墙" 它具 ...

  3. ML之DT之CART:分类与回归树CART算法的简介、应用、经典案例之详细攻略

    ML之DT之CART:分类与回归树CART算法的简介.应用.经典案例之详细攻略 目录 分类与回归树CART算法简介 1.CART原理-比较ID3.C4.5 2.CART算法描述 CART算法的案经典案 ...

  4. AI之NLP:自然语言处理技术简介(是什么/学什么/怎么用)、常用算法、经典案例之详细攻略(建议收藏)

    AI之NLP:自然语言处理技术简介(是什么/学什么/怎么用).常用算法.经典案例之详细攻略(建议收藏) 目录 NLP是什么? 1.NLP前置技术解析 2.python中NLP技术相关库 3.NLP案例 ...

  5. DL之ANN/DNN: 人工神经网络ANN/DNN深度神经网络算法的简介、应用、经典案例之详细攻略

    DL之ANN/DNN: 人工神经网络ANN/DNN深度神经网络算法的简介.应用.经典案例之详细攻略 相关文章 DL:深度学习(神经网络)的简介.基础知识(神经元/感知机.训练策略.预测原理).算法分类 ...

  6. AI之NLP:自然语言处理技术简介(是什么/学什么/怎么用)、常用算法、经典案例之详细攻略(建议收藏)daiding

    AI之NLP:自然语言处理技术简介(是什么/学什么/怎么用).常用算法.经典案例之详细攻略(建议收藏) 目录 NLP是什么? 1.NLP前置技术解析 2.python中NLP技术相关库 3.NLP案例 ...

  7. 线性表--算法设计题2.25

    假设以两个元素依值递增有序排列的线性表A和B分别表示两个集合(即同一表中的元素值各不相同),现要求另辟空间构成一个线性表C,其元素为A和B中元素的交集,且表C中的元素有依值递增有序排列.试对顺序表编写 ...

  8. 数据结构之【线性表】(顺序表、链表的基本操作实现)

    概念 线性表:是N个数据元素的有限序列. 顺序表:用一组地址连续的存储单元依次存储[线性表 ]的数据元素.(区别于有序表:表中的数据元素存在非递增或非递减有序) 链表:用一组任意的存储单元来存储[线性 ...

  9. Problem C: 顺序表基本运算(线性表)

    问题 C: 顺序表基本运算(线性表) 时间限制: 1 Sec  内存限制: 128 MB Description 编写一个程序,实现顺序表的各种基本运算(假设顺序表的元素类型为char),主函数已给出 ...

最新文章

  1. python表白源代码-python浪漫表白源码
  2. Java时间对比------实际时间和设置时间对比
  3. VS2010 使用GDI+创建图片水印的MFC程序
  4. Julia 排坑指南
  5. java 租车管理系统_jsp+servlet+jdbc实现的java web共享租车信息管理系统,包括登陆注册,页面框架Easy UI...
  6. “未在本地计算机上注册“Microsoft.ACE.OLEDB.12.0”提供程序”的解决方案
  7. pandas时间序列与自回归ARIMA模型
  8. 我的docker随笔21:web 服务器部署
  9. 如何修改vue打包的名字_教你如何修改Mac的电脑名字
  10. IDEA中安装TeaVM插件
  11. 数据资产管理及数据管控体系建设思路
  12. 2022年安全员-B证题库及答案
  13. mysql中的cube和rollup_【hive】cube和rollup函数
  14. 利用python如何进行数据挖掘
  15. 安装nodejs时:The error code is 2503.
  16. Web Service的基本定义
  17. UE5 live-coding和build中version“1.2“ not support build failed解决方法
  18. pta基础编程题目集 7-1 厘米换算英尺英寸
  19. 织梦后台登陆界面如何修改
  20. 查理·芒格提炼的9个思维模型

热门文章

  1. 视频云直播:场景、技术及优化
  2. 8.22 13.1-13.3
  3. pac (PAC(Proxy Auto Config) 是一个 Script;经由编写这个 Script,我们可以让系统判断在怎么样的情形下,要利用哪一台 Proxy 来进行联机。)...
  4. Hbase的基本认识
  5. sqlite数据库的基本增删改查操作
  6. gSoap的“error LNK2001: 无法解析的外部符号 _namespaces”解决方法
  7. Windons Server2008R2_向域中批量创建用户
  8. [java]apache server与 tomcat 的区别以及整合
  9. 前端趋势榜:上周最实用和 yyds 的 10 大前端项目 - 211128
  10. 【IDEA】自动导入无歧义的包