线性表--数据结构设计与操作

单链表

1.单链表的定义:

typedef struct LNode{Elemtype data;struct Lnode *next;
}LNode ,*LinkList;
    //单链表的数据结构(手写)
#include<iostream>
#include<vector>
#include<algorithm>typedef int TypeElem;
//单链表的定义
typedef struct LNode {TypeElem data;struct LNode* next;
}LNode,*LinkList;//初始化单链表(带头结点)
boolInitLinkList_H(LinkList& L) {L = (LNode*)malloc(sizeof(LNode));//L = new LNode;等价写法c++L->next = NULL;return true;
}
//不带头结点的单链表初始化
bool InitLinkList_(LinkList&L){L = NULL;return ture;
}
/*求表长O(n),扫描链表*/
int Length(LinkList&L){int ltn=0;p = L->next;while(p){p=p->next;len++;}return len;}/*按位序查找节点*/
LNode* GetElem(LinkList L,int pos){LNode*p = L->next;int j=1;while(p&&j<=pos){j++;p = p->next;}return p;//返回第pos个节点的指针或NULL
}
/*按值查找表节点*/
LNode*LocateElem(LinkList&L,int val){LinkList p = L->next;while(p && p->data!=val)p = =->next;return p;}
/*插入节点O(n)时间主要消耗在查找到第i-1个节点上,若在指定节点后插入新节点则只需O(1)*/
bool ListInsert(LinkList&L,int pos,int e){LinkList p =L->next;int j=1;while(p && j<pos-1)p = p->next;if(!p)return false;LNode*s = (LNode*)malloc(sizeof(LNode));s->data = e;s->next =p->next;p->next = s;return true;}
/* 删除节点*/
bool ListDelete(LinkList&L,int pos,int &e){LinkList p = L->next;while(p&&j<pos-1){p = p->next;j++;}if(!p)return false;//链表为空LNode*q =p->next;e = q->data;//用e返回被删除的元素的值p->next = q->next;free(q);return true;}
bb2ad43e-72dc-4264-a176-46f0767c916e
2.单链表的插入与删除

2-1按位序插入(在某一节点的后面插入新节点)

//带头结点
bool ListInsert(LinkList &L,int i,Elemtype e){if(i<1)return false;LNode*p;int j =0;p = L;while(p!=NULL && j<i-1){//找到第i-1个节点(节点i的前驱节点)p = p->next;j++;}if(p==NULL)//i值不合法return false;//插入操作(可封装为函数)LNode *s = (LNode *)malloc(sizeof(LNode));s->data = e;s->next = p->next;p->next = s;return true;  
}
aa9534f4-63c8-49c2-8a75-a35676d1f9fb
3.单链表的建立(头插法/尾插法)

//迭代法
/*假设链表为 1→2→3→∅我们想要把它改成  ∅←1←2←3。
算法设计基本思想:在遍历链表时,将当前节点的 next 指针改为指向前一个节点。由于节点没有引用其前一个节点,因此必须事先存储其前一个节点。在更改引用之前,还需要存储后一个节点。最后返回新的头引用
时空复杂度分析:时间复杂度O(n),只需扫描一遍链表空间复杂度O(1),原地逆置
*/
ListNode* reverseList(ListNode* head) {ListNode*pre = nullptr;//节点的前一个结点ListNode*cur = head;while(cur){ListNode*ne = cur->next;//存储当前结点的后继节点cur->next = pre;//将当前节点的后继节点改为其前驱节点pre = cur;cur = ne;//迭代更新当前节点}return pre;}//递归法逆置ListNode* reverseList(ListNode* head) {if (!head || !head->next) {return head;}ListNode* newHead = reverseList(head->next);head->next->next = head;head->next = nullptr;return newHead;}
06eebb10-b37a-4e1e-898c-dea794fb482c

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

/*在带头结点的单链表L中删除所有值为x的节点,并释放其空间*/
void DeleteX(LinkList&L,int x){LNode*p = L;while(p->next){if(p->next-val==x){LNode*q = p->next;p->next = q->next;qfree(q);}else{p=p->next;}}
}
    int DeleteMinEle(LinkList& L,int e) {if (L->next == NULL) {// List is emptyreturn -1; // or any other appropriate value}LNode* min_pre = L;LNode* min_node = L->next;LNode* p = L->next->next; // Start from the second nodeLNode* pre = L->next;while (p) {if (p->data < min_node->data) {min_pre = pre;min_node = p;}pre = p;p = p->next;}e= min_node->data;min_pre->next = min_node->next;free(min_node);return e;//返回最小元素
}
/*就地逆置带头结点的单链表*/
void ReverseLinkList_H(LinkList& L) {if (L->next == NULL|| L->next->next==NULL)return;//链表为空或只有一个数据节点,无需逆置LNode* p = L->next;LNode* pre = NULL;while (p != NULL) {LNode* ne = p->next;p->next = pre;pre = p;p = ne;}L ->next=pre;//切记逆置后要更新头节点!!!return;
}

C = a 1 , b 1 , a 2 , b 2 , ⋅ ⋅ ⋅ , a n , b n C={a_1,b_1,a_2,b_2,···,a_n,b_n} C=a1,b1,a2,b2,⋅⋅⋅,an,bn为线性表,才用带头结点的单链表存放,设计一个就地工作算法,将其拆分为两个线性表 A = a 1 , a 2 , ⋅ ⋅ ⋅ , a n , B = b 1 , b 2 , ⋅ ⋅ ⋅ , b n A={a_1,a_2,···,a_n},B={b_1,b_2,···,b_n} A=a1,a2,⋅⋅⋅,an,B=b1,b2,⋅⋅⋅,bn

    void breakLinkList(LinkList&L){//先获取单链表的长度int len = Length(L);LNode*curr=L->next;//L->next=NULL;//摘取原链表的头节点LinkList A= new LNode;LinkList B = new LNode;A->next=NULL,B->next=NULL;LNode* s1=A,*s2=B;for(int i=1;i<=len;i++){LNode*ne = p->next;if(i&1){p->next=NULL;s1->next =p;s1 = p;}else{p->next=NULL;s2->next =p;s2 = p;}p = ne;}printList(A);printList(B);}

对一个有序单链表去重处理O(n)

//对一个有序单链表去重处理O(n)
void DeleteMulEle(LinkList& L) {if (L == NULL || L->next == NULL) // If the list is empty or has only one node, no duplicates to removereturn;LNode* p = L->next;LNode* pre = L;while (p!=NULL&&p->next!=NULL) {if (p->data != p->next->data) {pre = p;}else {LNode* q = p->next;p->next = q->next;free(q);}p = p->next;}}

已知两个单链表A和B分别表示两个集合,其元素递增有序,编写函数求A与B的交集,并存放于A链表中。

void MergePublicElem(LinkList& A, LinkList& B) {/*算法设计基本思想:由于链表元素单调有序,故采用归并的思想提取公共元素。时间复杂度:O(lenA+lenB);空间复杂度:O(1);*/LNode* pa = A->next;LNode* pb = B->next;LNode* La = A->next;LNode* pre = A;while (pa != nullptr && pb != nullptr) {if (pa->data == pb->data) {La->data = pa->data;pre = La;La = La->next;pa = pa->next;pb = pb->next;}else if (pa->data < pb->data) {pa = pa->next;}else {pb = pb->next;}}pre->next=NULL;delete La;printList(A);return;
}

两个整数序列A和B已经存放到两个单链表中,请设计算法,判断B序列是否是A序列的连续子序列。

bool AIsSubseqB(LinkList&A,LinkList &B){
/*算法设计基本思想:本题采用朴素匹配算法实现时间复杂度:O(nm);空间复杂度:O(1);      
*/LNode*pa= A->next;LNode*pb = B->next;LNode*pre = A;while(pa&&pb){if(pa->data== pb->data){pa = pa->next;pb = pb->next;}else{//如果值不相等pre = pre->next;pa = pre;//A链表新的开始比较的节点pb = B->next;//pb重新指向B链表首节点}  }if(!pb) return true;return false;
}

判断一个带头结点的循环双链表是否对称

#include<iostream>typedef int ElemType;
//双链表的定义
typedef struct Node{ElemType data;Node* pre;Node* next;
}DNode, * DLinkList;//初始化带头结点的循环双链表
bool InitDlist_H(DLinkList& L) {L = new DNode;L->pre = L;L->next = L;return true;
}
bool InsertElems(DLinkList& L, ElemType x) {DNode* s = new DNode;s->data = x;s->next = L->next;L->next->pre = s;s->pre = L;L->next= s;//L->pre = s;return true;
}
//头插法
void Print(DLinkList L) {auto p = L->next;while (p != L) {std::cout << p->data << "->";p = p->next;}std::cout << '\n';
}
bool issymmetry(DLinkList L) {/*Algorithm design:Scan from both ends of the list towards the middle, comparing corresponding elements.Time complexity: O(n)Space complexity: O(1)*/DNode *left = L->next; // Points to the first nodeDNode *right = L->pre; // Points to the last nodewhile (left != right && right->next != left) {if (left->data != right->data)return false;left = left->next;right = right->pre;}return true;
}int main()
{DLinkList L;InitDlist_H(L);for (int i = 1; i <= 9; i++)InsertElems(L, i);Print(L);printf("%d\n",issymmetry(L));return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/8028.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenAI API搭建的智能家居助手;私密大型语言模型(LLM)聊天机器人;视频和音频文件的自动化识别和翻译工具

✨ 1: GPT Home 基于Raspberry Pi和OpenAI API搭建的智能家居助手 GPT Home是一个基于Raspberry Pi和OpenAI API搭建的智能家居助手&#xff0c;功能上类似于Google Nest Hub或Amazon Alexa。通过详细的设置指南和配件列表&#xff0c;用户可以自行组装和配置这个设备&#x…

Ansible自动运维工具之playbook

一.inventory主机清单 1.定义 Inventory支持对主机进行分组&#xff0c;每个组内可以定义多个主机&#xff0c;每个主机都可以定义在任何一个或多个主机组内。 2.变量 &#xff08;1&#xff09;主机变量 [webservers] 192.168.10.14 ansible_port22 ansible_userroot ans…

使用sqlmodel实现唯一性校验

代码&#xff1a; from sqlmodel import Field, Session, SQLModel, create_engine# 声明模型 class User(SQLModel, tableTrue):id: int | None Field(defaultNone, primary_keyTrue)# 不能为空&#xff0c;必须唯一name: str Field(nullableFalse, uniqueTrue)age: int | …

Flutter弹窗链-顺序弹出对话框

效果 前言 弹窗的顺序执行在App中是一个比较常见的应用场景。比如进入App首页&#xff0c;一系列的弹窗就会弹出。如果不做处理就会导致弹窗堆积的全部弹出&#xff0c;严重影响用户体验。 如果多个弹窗中又有判断逻辑&#xff0c;根据点击后需要弹出另一个弹窗&#xff0c;这…

大数据Scala教程从入门到精通第五篇:Scala环境搭建

一&#xff1a;安装步骤 1&#xff1a;scala安装 1&#xff1a;首先确保 JDK1.8 安装成功: 2&#xff1a;下载对应的 Scala 安装文件 scala-2.12.11.zip 3&#xff1a;解压 scala-2.12.11.zip 4&#xff1a;配置 Scala 的环境变量 在Windows上安装Scala_windows安装scala…

docker搭建代码审计平台sonarqube

docker搭建代码审计平台sonarqube 一、代码审计关注的质量指标二、静态分析技术分类三、sonarqube流程四、快速搭建sonarqube五、sonarqube scanner的安装和使用 一、代码审计关注的质量指标 代码坏味道 代码规范技术债评估 bug和漏洞代码重复度单测与集成 测试用例数量覆盖率…

node报错——解决Error: error:0308010C:digital envelope routines::unsupported——亲测可用

今天在打包vue2项目时&#xff0c;遇到一个报错&#xff1a; 最关键的代码如下&#xff1a; Error: error:0308010C:digital envelope routines::unsupportedat new Hash (node:internal/crypto/hash:80:19)百度后发现是node版本的问题。 在昨天我确实操作了一下node&…

Ansible——Playbook剧本

目录 一、Playbook概述 1.Playbook定义 2.Playbook组成 3.Playbook配置文件详解 4.运行Playbook 4.1Ansible-Playbook相关命令 4.2运行Playbook启动httpd服务 4.3变量的定义和引用 4.4指定远程主机sudo切换用户 4.5When——条件判断 4.6迭代 4.6.1创建文件夹 4.6.2…

[Linux][网络][TCP][四][流量控制][拥塞控制]详细讲解

目录 1.流量控制2.拥塞控制0.为什么要有拥塞控制&#xff0c;不是有流量控制么&#xff1f;1.什么是拥塞窗口&#xff1f;和发送窗口有什么关系呢&#xff1f;2.怎么知道当前网络是否出现了拥塞呢&#xff1f;3.拥塞控制有哪些算法&#xff1f;4.慢启动5.拥塞避免6.拥塞发生7.快…

劝退计算机?CS再过几年会没落!?

事实上&#xff0c;未来计算机不仅不会没落&#xff0c;国家还会大力发展 只不过大家认为的计算机就是什么Java web&#xff0c;真正的计算机行业是老美那样的&#xff0c;涉及到方方面面&#xff0c;比如&#xff1a; web&#xff0c;图形学&#xff0c;Linux系统开发&#…

2024DCIC海上风电出力预测Top方案 + 光伏发电出力高分方案学习记录

海上风电出力预测 赛题数据 海上风电出力预测的用电数据分为训练组和测试组两大类&#xff0c;主要包括风电场基本信息、气象变量数据和实际功率数据三个部分。风电场基本信息主要是各风电场的装机容量等信息&#xff1b;气象变量数据是从2022年1月到2024年1月份&#xff0c;…

Skywalking数据持久化与自定义链路追踪

学习本篇文章之前首先要了解一下Sky walking的基础知识 分布式链路追踪工具Skywalking详解 一&#xff0c;Sky walking数据持久化 Sky walking提供了es&#xff0c;MySQL等数据持久化方案&#xff0c;默认使用h2基于内存的数据库&#xff0c;重启之后数据即会丢失。 在实际工…

【Git】Git学习-16:git merge,且解决合并冲突

学习视频链接&#xff1a; 【GeekHour】一小时Git教程_哔哩哔哩_bilibili​编辑https://www.bilibili.com/video/BV1HM411377j/?vd_source95dda35ac10d1ae6785cc7006f365780 1 创建分支dev&#xff0c;并用merge合并master分支&#xff0c;使dev分支合并上master分支中内容为…

【学习笔记】HarmonyOS 4.0 鸿蒙Next 应用开发--安装开发环境

开发前的准备 首先先到官网去下载Devco Studio 这个开发工具&#xff0c;https://developer.harmonyos.com/cn/develop/deveco-studio/#download 提供了WIndows和Mac的开发环境&#xff0c;我自己是Windows的开发环境。 所以下载之后直接点击exe进行安装即可。 如果之前安装过…

Eplan带你做项目——如何实现项目的交付

前言 Eplan作为一款专业的电气工程设计软件&#xff0c;不仅在设计阶段为电气工程师提供了强大的绘图、计算、仿真等功能&#xff0c;还具备丰富的数据管理与交换能力&#xff0c;能够便捷、准确地导出软件设计、生产制造所需的数据&#xff0c;实现电气设计与软件设计、生产制…

反汇编一个ARM64的机器码

文章目录 使用objdump直接阅读ARM64手册使用反汇编网站 有下面一个机器码&#xff1a;0x929ffee9&#xff0c;如何翻译成汇编呢&#xff1f; 下面介绍几种做法&#xff1a; 使用objdump 将这个机器码写到文件中&#xff0c;然后使用objdump去反汇编 创建一个二进制文件 dd…

Golang | Leetcode Golang题解之第67题二进制求和

题目&#xff1a; 题解&#xff1a; func addBinary(a string, b string) string {ans : ""carry : 0lenA, lenB : len(a), len(b)n : max(lenA, lenB)for i : 0; i < n; i {if i < lenA {carry int(a[lenA-i-1] - 0)}if i < lenB {carry int(b[lenB-i-1…

燃料电池发电系统详解

目录 前言 组成结构 系统参数 常见问题 参考资料 前言 见《氢燃料电池技术综述》 见《燃料电池工作原理详解》 组成结构 燃料电池发电系统&#xff0c;由多个子系统和子模块组成&#xff0c;示例如下&#xff1a; 燃料处理系统&#xff08;fuel processing system&#xf…

IOS离线打包uniapp的信息时报错如下的解决方法

IOS离线打包uniapp的信息时报错如下的解决方法 问题描述&#xff1a; Extract app intents metadata 0.1 seconds XExtractAppIntentsMetadata(in target HBuilder from project HBuilder-Hello)cd /Users/whb/space/vpt/vptios/HBuilder-Hello/Applications/Xcode.app/Conte…

什么是电脑监控软件?哪些监控软件好用?

电脑监控软件是一种用于监控和管理计算机系统和数据的工具。它可以对计算机的使用情况进行实时监控&#xff0c;记录用户的操作行为&#xff0c;并及时发出警报&#xff0c;以防止数据泄露、违规操作和其他安全问题的发生。在当今信息时代&#xff0c;保护企业和个人信息安全变…