首页 > 编程语言 >线性表算法相关练习

线性表算法相关练习

时间:2023-01-09 16:46:43浏览次数:39  
标签:线性表 La 练习 next pb pc 算法 pa data

//将两个递增的有序链表合并为一个递增的有序链表。
//要求结果链表仍使用原来两个链表的存储空间,不另外占用其他的存储空间。表中不允许有重复的数据。
#include<iostream>
#include<cstdlib>
using namespace std;
#define OK 1
#define ERROR 0
typedef int Elemtype;
typedef int Status;
typedef struct LNode
{
Elemtype data;
struct LNode* next;
}LNode, * Linklist;
Status MergerList1(Linklist& La, Linklist& Lb, Linklist& Lc)
{
Lc = La;//La的头节点赋给Lc
LNode* pa, * pb, * pc, * q;
pa = La->next, pb = Lb->next;//pa为La的首元结点,pb为Lb的首元结点
pc = Lc;//pc指向Lc的头节点
while (pa && pb)
{
if (pa->data < pb->data)//取小的值
{
pc->next = pa;//链接在pc后面
pc = pa;
pa = pa->next;//pa指针后移
}
if (pa->data > pb->data)
{
pc->next = pb;
pc = pb;
pb = pb->next;
}
if (pa->data == pb->data)//相等取La的元素,删去Lb的元素
{
pc->next = pa;
pc = pa;
pc = pa->next;
q = pb->next;
delete pb;
pb = q;
}
}
pc->next = pa ? pa : pb;//剩余段
delete Lb;
return OK;
}
//将两个非递减的有序链表合并为一个非递增的有序链表。
//要求结果链表仍使用原来两个链表的存储空间,不另外占用其他的存储空间。表中允许有重复的数据。
Status MergerList2(Linklist& La, Linklist& Lb, Linklist& Lc)
{
Lc = La;//La的头节点赋给Lc
LNode* pa, * pb, * pc, * q;
pa = La->next, pb = Lb->next;//pa为La的首元结点,pb为Lb的首元结点
pc = Lc;//pc指向Lc的头节点
while (pa && pb)
{
if (pa->data <= pb->data)//取小的值
{
pc->next = pa;//链接在pc后面
pc = pa;
pa = pa->next;//pa指针后移
}
else
{
pc->next = pb;
pc = pb;
pb = pb->next;
}
}
pc->next = pa ? pa : pb;
delete Lb;
return OK;
}
//已知两个链表A和B分别表示两个集合,其元素递增排列。请设计一个算法,用于求出A与B的交集,并将结果存放在A链表中
Status MergerList3(Linklist& La, Linklist& Lb, Linklist& Lc)
{
Lc = La;//La的头节点赋给Lc
LNode* pa, * pb, * pc, * q;
pa = La->next, pb = Lb->next;//pa为La的首元结点,pb为Lb的首元结点
pc = Lc;//pc指向Lc的头节点
while (pa && pb)
{
if (pa->data < pb->data)
{
q = pa;
pa = pa->next;
delete q;
}
if (pa->data > pb->data)
{
q = pb;
pb = pb->next;
delete q;
}
if (pa->data == pb->data)
{
pc->next = pa;
pc = pa;
pa = pa->next;
q = pb->next;
delete q;
pb = q;
}
}
while (pa)
{
q = pa;
pa = pa->next;
delete q;
}
while (pb)
{
q = pb;
pb = pb->next;
delete q;
}
pc->next = NULL;
delete Lb;
return OK;
}
//已知两个链表A和B分别表示两个集合,其元素递增排列。请设计算法求出两个集合A和B的差集
//(仅由在A中出现而不在B中出现的元素所构成的集合),并将结果以同样的形式存储,同时返回该集合的元素个数。
Status MergerList4(Linklist& La, Linklist& Lb)
{
int n = 0;
LNode* pa, * pb, * pre, * q;
pa = La->next, pb = Lb->next;//pa为La的首元结点,pb为Lb的首元结点
pre = La;//pa所指的前驱节点
while (pa && pb)
{
if (pa->data < pb->data)
{
pre = pa;
pa = pa->next;
n++;
}
if (pa->data > pb->data)
{
pb = pb->next;
}
if (pa->data = pb->data)
{
pre->next = pa->next;
q = pa;
pa = pa->next;
delete pa;
pa = q;
}
}
return n;
}
//设计算法将一个带头节点的单链表A分解为两个具有相同结构的链表B和C,其中B表的节点为A表中值小于0的节点,
//而C表的节点为A表中值大于0的节点(链表A中的元素为非零整数,要求B、C表利用A表的节点)。
Status MergerList5(Linklist A)
{
Linklist B, C;
B = A;
B->next = NULL;
C = new LNode;
C->next = NULL;
LNode* p,* r;
p = A->next;//p为A的首元结点
while (p)
{
r = p->next;//r为p的后继结点
if (p->data < 0)
{
p->next = B->next;
B->next = p;//前插
}
else
{
p->next = C->next;
C->next = p;//前插
}
p = r;
}
return OK;
}
//设计一个算法,通过一趟遍历确定长度为n的单链表中值最大的节点。
Status MaxList(Linklist L)
{
if (L->next = NULL) return ERROR;
LNode* pmax, * p;
pmax = L->next;//假设首元结点是值最大节点
p = L->next->next;//p指向首元结点的后继结点
while (p)
{
if (p->data > pmax->data)
{
pmax = p;
}
p = p->next;//遍历
}
return pmax->data;
}
//设计一个算法,将链表中所有节点的链接方向“原地”逆转,即要求仅利用原表的存储空间,
//换句话说,要求算法的空间复杂度为O(1)。逆序
Status Inverlist(Linklist& L)
{
if (L->next = NULL) return ERROR;
LNode* p, * q;
p = L->next;
L->next = NULL;
while (p)
{
q = p->next;//q指向p的后继结点
p->next = L->next;
L->next = p;
p = q;
}
return OK;
}
//设计一个算法,删除递增有序链表中值大于mink且小于maxk的所有元素
//(mink和maxk是给定的两个参数,其值可以和表中的元素相同,也可以不同)。
Status Deletlist(Linklist& L, int mink, int maxk)
{
if (L->next = NULL) return ERROR;
LNode* p, * q, * pre, * s;
p = L->next;
pre = L;
while (p && p->data <= mink)
{
pre = p; p = p->next;
}
while (p && p->data < maxk)
{
q = pre->next; pre->next = p;
}
while (q != p)
{
s = q->next;
delete q;
q = s;
}
return OK;
}

标签:线性表,La,练习,next,pb,pc,算法,pa,data
From: https://www.cnblogs.com/shidawuyu/p/17037481.html

相关文章

  • 算法题基础知识汇总
     子串长度字符串python字符串的while()循环遍历​​http://www.cocoachina.com/articles/895083​​c-如何在std::vector中存储固定长度的字符串​​http://www.myexcep......
  • 每日算法之14. 最长公共前缀
    14.最长公共前缀题目描述编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串""。方法暴力算法先判断字符串数组是否有为空,为空直接......
  • Model-Agnostic Meta-Learning (MAML)模型介绍及算法详解
    paper:​​​https://link.zhihu.com/?target=https%3A//arxiv.org/pdf/1703.03400.pdf​​ MAML在学术界已经是非常重要的模型了,论文Model-AgnosticMeta-LearningforFa......
  • 算法--2023.1.9
    1.力扣128-最长连续序列classSolution{publicintlongestConsecutive(int[]nums){//通过hashset保存去重复后的所有数据intn=nums.lengt......
  • 贪心算法
    一、贪心算法思想1)贪心算法原理贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局......
  • 详解 Kruskal 最小生成树算法
     求最小生成树算一般有两种算法:Prim和Kruskal。Prim的时间复杂度为\(O(|V|^{2})\),更适合稠密图。而Kruskal的时间复杂度为\(O(logV)\)或\(O(logE)\)。更适......
  • ACM&OI 多项式算法专题
    ACM&OI基础数学算法专题一、FFT基础拉格朗日插值复数的运算性质和几何性质单位根和单位根反演快速傅里叶变换(FFT)的分治实现快速傅里叶逆变换(IFFT)快速傅里叶变换的......
  • 退火算法学习笔记
    初创建于2022-02-0900:29前段时间学习了一下退火算法。这里简单记一下踩过的坑~退火算法是一种搜索算法,我认为其核心思想便是”以一定的概率接受一个更差的解“,这样可......
  • 【车间调度】基于GA/PSO/SA/ACO/TS优化算法的车间调度比较(Matlab代码实现)
    目录1概述2 FJSP描述3运行结果3.1main1运行结果3.2main2运行结果4Matlab代码 5参考文献6写在最后1概述柔性作业车间调度问题(FlexibleJobshopSched-ulingPro......
  • 深度强化学习专栏 —— 2.手撕DQN算法实现CartPole控制
    我将文章发表在了古月居,一起来看看吧!​​戳这里​​......