当前位置: 首页 > news >正文

线性表的应用

  1. 链式有序表的合并
  2. 旋转链表
  3. 分隔链表
  4. 翻转链表

#include<iostream>

#include<cstdlib>

using namespace std;

typedef int ElemType;

typedef int Status;

typedef struct LNode{

ElemType data;

struct LNode *next;

int val;

}LNode,*LinkList;

//创建链表

void CreateList_H(LinkList &L,int n){

L=new LNode;

L->next=NULL;

cout<<"请输入"<<n<<endl;

for(int i=0;i<n;++i){

LNode*p =new LNode;

cin>>p->data;

p->next=L->next;

L->next=p;

}

}

//输出链表

void PrintList (LinkList L) {

LNode *p;

p=L->next;

while(p!=NULL) {

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

p=p->next;

}

cout<<endl;

}

//链式有序表的合并

void MergeList_L(LinkList &La,LinkList &Lb,LinkList &Lc)

{

LNode *pa=La->next;

LNode *pb=Lb->next;

Lc=La;

LNode *pc=Lc;

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;

}

//旋转链表

struct LNode* rotateRight(struct LNode* head,int k)

{

if(k==0||head==NULL||head->next==NULL)

return head;

int n=1;

struct LNode* tail=head;

while(tail->next !=NULL)

{

tail=tail->next;

n++;

}

int movenum=k%n;

if(movenum==0)

return head;

tail->next=head;

int addnum=n-movenum;

while(addnum--)

tail=tail->next;

struct LNode* newhead=tail->next;

tail->next=NULL;

return newhead;

}

//分隔链表

struct LNode*partition(struct LNode*head,int x)

{

struct LNode*small=(struct LNode*)malloc(sizeof(struct LNode ));

struct LNode*large=(struct LNode*)malloc(sizeof(struct LNode ));

struct LNode*pa=head;

struct LNode*pb=small;

struct LNode*pc=large;

while(pa!=NULL)

{

if(pa->val < x)

{

pb->next=pa;

pb=pb->next;

}

else{

pc->next=pa;

pc=pc->next;

}

pa=pa->next;

}

pc->next=NULL;

pb->next=large->next;

struct LNode* newhead = small->next;

return newhead;

}

//翻转链表

struct LNode* reverseKGroup(struct LNode* head,int k)

{

int x=k;

int n=0;

struct LNode* s =(struct LNode*)malloc(sizeof(struct LNode));

struct LNode* cur=s;

struct LNode* slow=head;

struct LNode* fast=NULL;

struct LNode* prev=NULL;

while(slow)

{

n++;

slow=slow->next;

}

slow=head;

n/=k;

for(int i=0;i<n;i++)

{

while(x)

{

fast=slow->next;

slow->next=prev;

prev=slow;

slow=fast;

x--;

}

cur->next=prev;

while(cur->next)

cur=cur->next;

prev=NULL;

x=k;

}

cur->next=slow;

struct LNode* newhead=s->next;

return newhead;

}

int main()

{

cout << "--- 测试 1: 合并有序链表 ---" << endl;

LinkList La, Lb, Lc;

cout << "创建链表 A (需有序): ";

CreateList_H(La, 3);

cout << "创建链表 B (需有序): ";

CreateList_H(Lb, 3);

MergeList_L(La, Lb, Lc);

cout << "合并结果: ";

PrintList(Lc);

cout << endl;// --- 测试 2: 旋转链表 ---

cout << "--- 测试 2: 旋转链表 ---" << endl;

LinkList L_rotate;

cout << "创建用于旋转的链表: ";

CreateList_H(L_rotate, 5);

int k_rot = 2;

cout << "向右旋转 " << k_rot << " 位后的结果: ";

LNode* res_rot = rotateRight(L_rotate->next, k_rot);

// 临时打印

LNode* temp = res_rot;

while(temp) { cout << temp->data << " "; temp = temp->next; }

cout << endl;

cout << endl;

// --- 测试 3: 分隔链表 ---

cout << "--- 测试 3: 分隔链表 (以 3 为界) ---" << endl;

LinkList L_part;

cout << "创建用于分隔的链表: ";

CreateList_H(L_part, 5); // 例如输入 3 1 4 1 5

LNode* res_part = partition(L_part->next, 3);

temp = res_part;

while(temp) { cout << temp->data << " "; temp = temp->next; }

cout << endl;

cout << endl;

// --- 测试 4: K 个一组翻转 ---

cout << "--- 测试 4: K 个一组翻转 (k=2) ---" << endl;

LinkList L_rev;

cout << "创建用于翻转的链表: ";

CreateList_H(L_rev, 5); // 例如输入 1 2 3 4 5

LNode* res_rev = reverseKGroup(L_rev->next, 2);

temp = res_rev;

while(temp) { cout << temp->data << " "; temp = temp->next; }

cout << endl;

return 0;

}

http://www.jsqmd.com/news/1113322/

相关文章:

  • 销售预测实战:用时间序列分解与SARIMAX提升准确率
  • AsrTools:零门槛语音转文字,让音频处理变得如此简单
  • 比较好的铁道电源品牌
  • 拒绝 RPC 与 JSON!我用 CSnakes 实现了 C# 与 Python 的零拷贝 AI 推理交互
  • 多端同步· 万人群组· 独立部署,就选海王IM*
  • 习惯用 Markdown 写东西,但对方只收 Word,怎么办?
  • 动物森友会存档编辑神器:NHSE一站式岛屿改造终极指南
  • 微信API实战:微信标签管理与用户分类开发
  • 心脏瓣膜病手术费用与医保报销解析——开胸 vs TAVR的经济学考量
  • 实用工具推荐:2026年素质培训小程序制作软件有哪些?
  • 本地开发环境 Neo4j 部署全套方案(Windows/macOS)
  • 【计算机Java毕业设计案例】基于 SpringBoot 的社区共享图书馆运维管理系统的设计与实现 基于 SpringBoot 的 “图书森林” 图书捐赠与共享管理系统(程序+文档+讲解+定制)
  • PostgreSQL FATAL: password authentication failed for user “postgres“ 解决方案
  • Java毕业设计-基于 SpringBoot 的智能水务应急调度与决策系统的设计与实现 基于 SpringBoot 的城市水务智能应急调度管理系(源码+LW+部署文档+全bao+远程调试+代码讲解等)
  • 2026金九银十|Java八股文面试题总结(附答案)
  • windows安装docker
  • 科研信息流操作系统:机器学习论文阅读的结构化工作流
  • M1 Mac安装TensorFlow完整指南:arm64 Python+Metal加速实操
  • ETL 中多源数据库元数据同步的方案设计
  • Python 高并发抢票技术拆解:异步请求、Cookie 持久化实战
  • 口碑出众的精准尺寸烤盘定制厂家
  • JMeter高并发测试实战:从原理到性能瓶颈定位
  • [SmoothWave节点]原理解析与实际应用
  • Python异步编程实战:构建高并发AI API调用管线
  • 智速优座项目总结
  • Typeless / Wispr Flow / Typeoff:为什么语音输入法正在变成新的输入层?
  • 【Java毕业设计】基于 SpringBoot 的校园闲置图书共享互换管理系统的设计与实现 基于 SpringBoot 的 “图书森林” 公益图书借阅服务系统(源码+文档+远程调试,全bao定制等)
  • 放下固化评判标准,接纳孩童身上与众不同的思维方式
  • 基于YOLOv8的摩托车头盔佩戴检测系统实现:从模型训练到GUI部署全流程解析
  • 微服务基础骨架搭建-02