《数据结构》将一个带头结点的单链表分解成两个单链表

2024-02-16 10:58

本文主要是介绍《数据结构》将一个带头结点的单链表分解成两个单链表,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

将一个带头结点的单链表分解成两个单链表

题目描述:

/*
设计一个算法,将一个带头结点的单链表分解成两个具有相同结构的
链表B和C,其中B白哦的结点为A中小于0的结点,C表的结点为A中大于0 的结点,
要求B和C 仍利用A表的结点。 (A表的元素都是非0元素)
*/

 

算法思想:‘

假设原来的链表是LA,将LA,分解成LB和LC,首先需要生成两个头结点,LB和LC;设置三个指针*pa,*pb,*pc,初始时,pa指向LA的第一个结点,pb指向LB的头结点,pc指向LC的头结点;然后遍历LA,当pa->data>0时,就将pa指向的结点插入到LB的后面,即pb->next=pa,然后让pb指向该结点,即pb=pb->next,指针pa后移pa=pa->next,表LB最后一个结点的指针域置空。当pa->data<0时,就将pa指向的结点插入到LC的后面,即pc->next=pa,然后让pc指向该结点,即pc=pc->next,指针pa后移pa=pa->next,表LC最后一个结点的指针域置空。

描述如下:

 

void Resolve(LinkList &LA,LinkList &LB,LinkList &LC){struct LNode *pa,*pb,*pc;pa=LA->next;LB=new LNode;LC=new LNode;//要生成两个新的头结点!!! //LB=LC=LA;//不能这样写,这样写最后输出的LB和LChi一样的表,居然会一样??为什么?? pb=LB;pc=LC;struct LNode *p;p=pa;while(pa){if(pa->data>0){pb->next=pa;pa=pa->next;pb=pb->next;pb->next=NULL;}else if(pa->data<0){pc->next=pa;pa=pa->next;pc=pc->next;pc->next=NULL;}}
}

 

 

 

实现:

 

/*
设计一个算法,将一个带头结点的单链表分解成两个具有相同结构的
链表B和C,其中B白哦的结点为A中小于0的结点,C表的结点为A中大于0 的结点,
要求B和C 仍利用A表的结点。 (A表的元素都是非0元素)
*/
#include<stdio.h>
#define MAX 100typedef struct LNode{int data;struct LNode *next;
}LNode,*LinkList;int InitList(LinkList &L){L=new LNode;L->next=NULL;return 1;
} int ListLength(LinkList L){int length=0;struct LNode *p;p=L->next;while(p){++length;p=p->next;}return length;
}void TraveList(LinkList L){struct LNode *p;p=L->next;while(p){printf("%d ",p->data);p=p->next;}printf("\n");
}void CreateList(LinkList &L,int n){L=new LNode;L->next=NULL;struct LNode *p;p=L;for(int i=0;i<n;i++){struct LNode *s;s=new LNode;printf("请输入%d个结点的值:",i+1);scanf("%d",&s->data);s->next=NULL;p->next=s;p=s;}
}void Resolve(LinkList &LA,LinkList &LB,LinkList &LC){struct LNode *pa,*pb,*pc;pa=LA->next;LB=new LNode;LC=new LNode;//要生成两个新的头结点!!! //LB=LC=LA;//不能这样写,这样写最后输出的LB和LChi一样的表,居然会一样??为什么?? pb=LB;pc=LC;struct LNode *p;p=pa;while(pa){if(pa->data>0){pb->next=pa;pa=pa->next;pb=pb->next;pb->next=NULL;}else if(pa->data<0){pc->next=pa;pa=pa->next;pc=pc->next;pc->next=NULL;}}
}int main(){LinkList LA,LB,LC;if(LinkList(LA)){printf("LA初始化成功!\n");}else{printf("LA初始化失败!\n");}if(LinkList(LB)){printf("LB初始化成功!\n");}else{printf("LB初始化失败!\n");}if(LinkList(LC)){printf("LC初始化成功!\n");}else{printf("LC初始化失败!\n");}printf("请输入LA的长度:");int n1;scanf("%d",&n1);CreateList(LA,n1);TraveList(LA);Resolve(LA,LB,LC);TraveList(LB);TraveList(LC);return 0;
}


 

 

//修改一下,上面那个main方法里写的有问题,我们这里把初始化的InitList()方法用上,将新的链表LB和LC的初始化工作使用InitList()里进行:


 

#include<stdio.h>
#define MAX 100typedef struct LNode{int data;struct LNode *next;
}LNode,*LinkList;int InitList(LinkList &L){L=new LNode;L->next=NULL;return 1;
} int ListLength(LinkList L){int length=0;struct LNode *p;p=L->next;while(p){++length;p=p->next;}return length;
}void TraveList(LinkList L){struct LNode *p;p=L->next;while(p){printf("%d ",p->data);p=p->next;}printf("\n");
}void CreateList(LinkList &L,int n){L=new LNode;L->next=NULL;struct LNode *p;p=L;for(int i=0;i<n;i++){struct LNode *s;s=new LNode;printf("请输入%d个结点的值:",i+1);scanf("%d",&s->data);s->next=NULL;p->next=s;p=s;}
}void Resolve(LinkList &LA,LinkList &LB,LinkList &LC){struct LNode *pa,*pb,*pc;pa=LA->next;//LB=new LNode;//LC=new LNode;//要生成两个新的头结点!!! //LB=LC=LA;//不能这样写,这样写最后输出的LB和LChi一样的表,居然会一样??为什么?? pb=LB;pc=LC;while(pa){if(pa->data>0){pb->next=pa;pa=pa->next;pb=pb->next;pb->next=NULL;}else if(pa->data<0){pc->next=pa;pa=pa->next;pc=pc->next;pc->next=NULL;}}
}int main(){LinkList LA,LB,LC;if(InitList(LA)){printf("LA初始化成功!\n");}else{printf("LA初始化失败!\n");}if(InitList(LB)){printf("LB初始化成功!\n");}else{printf("LB初始化失败!\n");}if(InitList(LC)){printf("LC初始化成功!\n");}else{printf("LC初始化失败!\n");}printf("请输入LA的长度:");int n1;scanf("%d",&n1);CreateList(LA,n1);if(ListLength(LA)>0){printf("输出链表A:");}TraveList(LA);Resolve(LA,LB,LC);if(ListLength(LB)>0){printf("输出链表B:");} TraveList(LB);if(ListLength(LC)>0){printf("输出链表C:");} TraveList(LC);return 0;
}

 

 

 

这篇关于《数据结构》将一个带头结点的单链表分解成两个单链表的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/714325

相关文章

C#数据结构之字符串(string)详解

《C#数据结构之字符串(string)详解》:本文主要介绍C#数据结构之字符串(string),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录转义字符序列字符串的创建字符串的声明null字符串与空字符串重复单字符字符串的构造字符串的属性和常用方法属性常用方法总结摘

C语言实现两个变量值交换的三种方式

《C语言实现两个变量值交换的三种方式》两个变量值的交换是编程中最常见的问题之一,以下将介绍三种变量的交换方式,其中第一种方式是最常用也是最实用的,后两种方式一般只在特殊限制下使用,需要的朋友可以参考下... 目录1.使用临时变量(推荐)2.相加和相减的方式(值较大时可能丢失数据)3.按位异或运算1.使用临时

java两个List的交集,并集方式

《java两个List的交集,并集方式》文章主要介绍了Java中两个List的交集和并集的处理方法,推荐使用Apache的CollectionUtils工具类,因为它简单且不会改变原有集合,同时,文章... 目录Java两个List的交集,并集方法一方法二方法三总结java两个List的交集,并集方法一

Python如何计算两个不同类型列表的相似度

《Python如何计算两个不同类型列表的相似度》在编程中,经常需要比较两个列表的相似度,尤其是当这两个列表包含不同类型的元素时,下面小编就来讲讲如何使用Python计算两个不同类型列表的相似度吧... 目录摘要引言数字类型相似度欧几里得距离曼哈顿距离字符串类型相似度Levenshtein距离Jaccard相

Go语言中三种容器类型的数据结构详解

《Go语言中三种容器类型的数据结构详解》在Go语言中,有三种主要的容器类型用于存储和操作集合数据:本文主要介绍三者的使用与区别,感兴趣的小伙伴可以跟随小编一起学习一下... 目录基本概念1. 数组(Array)2. 切片(Slice)3. 映射(Map)对比总结注意事项基本概念在 Go 语言中,有三种主要

使用Navicat工具比对两个数据库所有表结构的差异案例详解

《使用Navicat工具比对两个数据库所有表结构的差异案例详解》:本文主要介绍如何使用Navicat工具对比两个数据库test_old和test_new,并生成相应的DDLSQL语句,以便将te... 目录概要案例一、如图两个数据库test_old和test_new进行比较:二、开始比较总结概要公司存在多

使用C++实现单链表的操作与实践

《使用C++实现单链表的操作与实践》在程序设计中,链表是一种常见的数据结构,特别是在动态数据管理、频繁插入和删除元素的场景中,链表相比于数组,具有更高的灵活性和高效性,尤其是在需要频繁修改数据结构的应... 目录一、单链表的基本概念二、单链表类的设计1. 节点的定义2. 链表的类定义三、单链表的操作实现四、

C#比较两个List集合内容是否相同的几种方法

《C#比较两个List集合内容是否相同的几种方法》本文详细介绍了在C#中比较两个List集合内容是否相同的方法,包括非自定义类和自定义类的元素比较,对于非自定义类,可以使用SequenceEqual、... 目录 一、非自定义类的元素比较1. 使用 SequenceEqual 方法(顺序和内容都相等)2.

锐捷和腾达哪个好? 两个品牌路由器对比分析

《锐捷和腾达哪个好?两个品牌路由器对比分析》在选择路由器时,Tenda和锐捷都是备受关注的品牌,各自有独特的产品特点和市场定位,选择哪个品牌的路由器更合适,实际上取决于你的具体需求和使用场景,我们从... 在选购路由器时,锐捷和腾达都是市场上备受关注的品牌,但它们的定位和特点却有所不同。锐捷更偏向企业级和专

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig