c++链表对应节点相加

2023-11-08

题目:给定两个链表,分别表示两个非负整数。它们的数字逆序存储在链表中,并且每个节点只存储一个数字,计            算两个数的和,并且返回和的链表头指针。

           如: 输入:3->6->9,2->5->7,输出:5->1->7->1

思路:1、逆序相加,相当于从两个链表头指针向后依次相加

            2、注意两个链表长度可能不同

            3、注意可能存在的进位问题
 

/*创建链表,对应节点相加*/
#include <iostream>
#include <string>
#include <stdlib.h>
typedef struct Node
{
	int value;
	Node* ptr;
	Node(int a)
	{
		value = a;
		ptr = NULL;
	}
};

Node* Linkcreate(int* a,int n);
Node* Linkadd(Node* a, Node* b);
void Linkdestory(Node* Linklist);

int main()
{
	int a[] = {3,6,9};
	int b[] = {2,5,7};
	int n1 = sizeof(a) / sizeof(int);
	int n2 = sizeof(b) / sizeof(int);
	//创建链表
	Node* p1=Linkcreate(a,n1);
	Node* p2=Linkcreate(b,n2);
	//节点相加
	Node* p3=Linkadd(p1,p2);
	//如果p3=p3->next,p3无法释放
	Node* pp = p3->ptr;

	if (pp == NULL)
		std::cout << "null!" << std::endl;

	while (pp != NULL)
	{
		printf("%d ",pp->value);
		pp = pp->ptr;
	}
	std::cout << " " << std::endl;

	//删除链表
	//printf("p1\n");
	Linkdestory(p1);
	//printf("p2\n");
	Linkdestory(p2);
	//printf("p3\n");
	Linkdestory(p3);

	system("pause");
	return 0;
}

Node* Linkadd(Node* a, Node* b)
{
	if (a == NULL)
	{
		return b;
	}
	if (b == NULL)
	{
		return a;
	}
	Node* head = new Node(0);
	Node* p = head;
	Node* p1 = a->ptr;
	Node* p2 = b->ptr;

	int hig = 0;
	int tmp;
	//若不定义data,p1或p2为NULL的时候->value将无法取值
	int data1, data2;
	while (p1 != NULL || p2 != NULL||hig!=0)
	{
		if (p1 == NULL)
			data1 = 0;
		else {
			data1 = p1->value;
			p1 = p1->ptr;
		}
		if (p2 == NULL)
			data2 = 0;
		else {
			data2 = p2->value;
			p2 = p2->ptr;
		}
		tmp =(data1 + data2 + hig) % 10;
		p->ptr = new Node(tmp);
		p = p->ptr;
		hig = (data1 + data2 + hig) / 10;
		//std::cout << tmp << std::endl;	
	}
	//p1 = p1->ptr;若放这里,当p1=NULL,p2!=NULL的时候内存泄漏
	if(hig==1)
		p->ptr = new Node(hig);
	return head;
}

void Linkdestory(Node* Linklist)
{
	Node*  p = Linklist;
	Node*  next = p->ptr;
	while (p->ptr != NULL)
	{
		Node*  next = p->ptr;
		std::cout << "ok" << std::endl;
		p->ptr=next->ptr;
		delete(next);
	}
	delete(p->ptr);
	delete(p);
}

Node* Linkcreate(int* a,int n)
{
	if (a==NULL)
	{
		return NULL;
	}
	Node* head = new Node(0);
	Node* p = head;
	for (int i = 0; i < n; i++)
	{

		p->ptr=new Node(a[i]);
		p = p->ptr;
	}
	return head;
}

我的总结:

1、关于生成一个新节点

      一般书上给出的方法都是:Node *s=(struct Node*)malloc(sizeof(struct Node));  s->data = ...; s->next = ...;

  本文采用的方式是在结构体中定义了构造函数 Node(int value):data(value),nextPtr(NULL){}

  与下面这种写法等价

  Node(int value)
  {
    data=value;
    nextPtr=NULL;
  }

  创建新的节点方法为Node* HeadNode = new Node(0); 提供参数0为节点的data值,nextPtr指向MULL。

2、本文涉及到插入节点,参考代码使用的是头插法,我使用的是尾插法。

   可以参照本文学习 http://blog.csdn.net/behanga/article/details/6701495

3、因为我的实现代码中,先接收整形数据,将其生成数组,然后再将其生成链表,涉及到整形数组的传递问题,调试过程中花了一些时间,主要是对指针和数组在C++中作为    参数和返回值还不太熟练。在C++中,数组不是一种类型,因此不能被直接返回,可以返回指向数组的指针。具体参照               http://blog.sina.com.cn/s/blog_6f26189101012111.html问题得到解决。

4、我认为在实现一个功能时,可以先将问题细化成几部分,将要实现的部分先用伪代码按流程列在Main函数中,然后在逐一实现,这样实现起来比较快速,有条理,且易读,暂且不说实现方法的好坏,通过我的主函数,可以一目了然地看出整个功能的实现流程。

     参考答案在主函数中边生成数据边插入链表,而我是先接收所有数据,将它们存储在数组中,后再将数组整体的生成链表。这样将两部分功能分开更清晰,但我也为此付出了消耗内存的代价。两种方法各有利弊,需要权衡。
 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c++链表对应节点相加 的相关文章

  • Linux的10个最危险的命令

    Linux命令行佷有用 很高效 也很有趣 但有时候也很危险 尤其是在你不确定你自己在正在做什么时候 这篇文章将会向你介绍十条命令 但你最好不要尝试着去使用 当然 以下命令通常都是在root权限下才能将愚蠢发挥到无可救药 在普通用户身份下 破
  • Docker关闭容器命令(docker stop)

    关闭容器 一定要是容器的名称 也就是 NAMES 下面的名称 关闭容器 docker stop 容器名称 非root用户 关闭容器 sudo docker stop 容器名称
  • Android Studio在build时一直停在:gradle: download maven-metadata.xml

    AndroidStudio在gradle build时 一直停在 gradle download maven metadata xml 解决 如果使用阿里云maven 看看使用的是不是旧版的maven 如果是 则更新为新版本的仓库地址 新版
  • Ubuntu18.04 安装速腾聚创最新驱动RSLidar_SDK采集XYZIRT格式的激光点云数据 --SLAM不学无术小问题

    Ubuntu18 04 安装速腾聚创最新驱动RSLidar SDK采集XYZIRT格式的激光点云数据 新款驱动支持RS16 RS32 RSBP RS128 RS80 RSM1 B3 RSHELIOS等型号 注意 该教程旨在引导安装 可能现在
  • C#相等性比较

    本文阐述C 中相等性比较 其中主要集中在下面两个方面 和 运算符 什么时候它们可以用于相等性比较 什么时候它们不适用 如果不使用 那么它们的替代方式是什么 什么时候 需要自定一个类型的相等性比较逻辑 在阐述相等性比较 以及如何自定义相等性比
  • npm常用命令

    一 npm更新所有依赖最新版本 安装组件 npm install g npm check updates 查看所有依赖最新版本 ncu 更新所有依赖到最新版本 ncu u 二 查看单个依赖版本 npm info 依赖包名称 version
  • 【ChatGPT本地部署-- ChatGLM】

    这里写自定义目录标题 ChatGPT本地部署 ChatGLM 转载 一 什么是ChatGLM 二 本地部署 三 模型与ChatGPT和GPT4AII 效果对比 ChatGPT本地部署 ChatGLM 转载 目录 一 什么是ChatGLM 二
  • golang cli_Go CLI教程:财富克隆

    golang cli I ve written two CLI app tutorials to build gololcat and gocowsay In both I used fortune as the input generat
  • 解决smplayer中文字幕乱码

    首先 打开选项 gt 首选项 选择字幕选项卡 找到 默认字符编码 选项 在下拉框中选择 简体中文 cp936 再打开 字体和颜色 页卡 上边 选择 系统字体 在下拉选框中选择一种简体中文字体 转载于 https www cnblogs co
  • 追忆我那为之奋斗了5年的地方

    虽然已经下定决心离开 但是当邮件发出那一刻 我的手还是忍不住的发抖 心跳在不停的加速 这毕竟是我工作了5年的地方 这里有我熟悉的面孔 直到过了几分钟 Boss回了个信息 过来下 我才深吸一口气 缓缓的走向他的办公室 追忆 初入职顺利过关斩将

随机推荐

  • Linux 编译安装 openssl库

    Linux 编译安装 openssl库 如果是不需要特定版本的openssl库的安装非常简单 直接sudo apt install opensll即可 而且像Ubuntu这种应该是自带了openssl库的 运行openssl version
  • vmware启动虚拟机黑屏解决办法

    以管理员身份在命令提示符窗口中输入 netsh winsock reset 然后重启计算机即可解决
  • stm32每周学习报告2.0

    STM32 通用定时器简介 STM32 的通用定时器是一个通过可编程预分频器 PSC 驱动的 16 位自动装载计数器 CNT 构成 STM32 的通用定时器可以被用于 测量输入信号的脉冲长度 输入捕获 或者产生输出波 形 输出比较和 PWM
  • SQL之视图、变量、存储过程、函数

    视图 虚拟表 和正常表一样使用 视图的好处 修改视图 方式一 视图不存在就创建 存在就替换 create or replace view name as select 方式二 alter view name as select 删除视图 d
  • 简单运行C程序的步骤和方法

    1 安装C Free程序 如下图可见 2 新建一个源程序 点击左上角 文件 然后选择新建 进行命名 3 开始编译程序 以This is a C program 为例 4 点击编译 并开始运行 如出现错误和警告 系统会给予提醒 改正后就可以运
  • C语言函数大全-- v 开头的函数

    v 开头的函数 1 va start 1 1 函数说明 1 2 演示示例 1 3 运行结果 2 va arg 2 1 函数说明 2 2 演示示例 3 va copy 3 1 函数说明 3 2 演示示例 4 va end 4 1 函数说明 4
  • 【Clion+CubeMX开发STM32】(三)为你的工程创建GIT远程仓库

    目录 下载安装git 链接github远程仓库 上传 下载安装git 网上已经有很多git的安装教程 本文就不再赘述了 推荐一个链接 下载安装Git链接 链接github远程仓库 一 注册你的Git账号并登录 二 创建远程仓库 填写仓库名
  • 小程序云开发多表查询

    原文链接 https juejin im post 5baadb086fb9a05ce2740968 关联表学习 文中代码并不是实际代码 伪代码不可直接运行 功能 用户 喜欢 文章 表 用户表 users id username 唯一标识
  • Java常用配置项和命令行

    JVM配置项说明 1 java虚拟机可配置参数整理 java参数配置参数分成三类 标准参数 开头 如 version 非标准参数 X开头 非稳定参数 XX开头 第一部分 JMM配置参数 Xmn 新生代大小 Xms 初始内存大小 Xmx 堆最
  • 【Gale Shapley 婚姻稳定匹配算法实现】

    原理 所有男性按照好感的高低向对应女性求婚 每个女性在所有的向她发出求婚的男性和其丈夫 如果暂无丈夫则不做比较 选择一个最喜欢的 如果这个最喜欢的是当前的丈夫 则婚姻关系不变 否则与当前丈夫离婚 并与向她发出求婚请求的男性结婚 在每个女性处
  • facebook NLP 自然语言处理框架 Pytext 简介

    自然语言处理 NLP 在现代深度学习生态中越来越常见 从流行的深度学习框架到云端API的支持 例如Google云 Azure AWS或Bluemix NLP是深度学习平台不可或缺的部分 尽管已经取得了令人难以置信的进步 但构建大规模的NLP
  • 开源OLAP引擎测评报告(SparkSql、Presto、Impala、HAWQ、ClickHouse、GreenPlum) ...

    本文为博主公司原创文章 仿冒必究 转载请回复留言 开源OLAP引擎测评报告 SparkSql Presto Impala HAWQ ClickHouse GreenPlum 易观CTO 郭炜 序现在大数据组件非常多 众说不一 在每个企业不同
  • 大语言模型(LLM)及使用方法

    大语言模型 LLM Large Language Model 是一种基于深度学习的自然语言处理技术 它使用深度神经网络来学习自然语言的统计规律 以便能够自动地生成 理解和处理自然语言 LLM通常具有数亿个参数和数十亿个标记 能够处理大规模的
  • spring websocket 利用注解接收和发送消息

    websocket只定义了文字和字节俩种形式的消息格式 没有像http协议那样子有那么丰富的协议规范 我们看看http的协议格式 websocket之所以没有自己定义那么多的协议格式 是希望有框架自己来实现定义这些格式 我们称之为webso
  • RAC+Dataguard环境中JDBC Failover配置

    在rac dataguard的环境中 为了减少应用宕机时间及改动 提高业务的可用性 要求jdbc客户端配置failover 同时为了很好地做应用分割 又不能load balance 即在第一个实例不行时 去偿试第二个实例 两个实例都不行时
  • 安卓调试

    欢迎关注 全栈工程师修炼指南 公众号 点击 下方卡片 即可关注我哟 设为 星标 每天带你 基础入门 到 进阶实践 再到 放弃学习 花开堪折直须折 莫待无花空折枝 作者主页 https www weiyigeek top 博客 https b
  • python中一个函数调用另一个函数中的变量

    我们在一个函数func2 中想使用另一个函数func1 中的变量 通常会使用返回值的方法 但是在调用的时候 也会将func2 整体运行一遍 如果func2 函数体的运行对于func1 取返回值没有影响则完全可以 但是如果func2 函数体的
  • linux操作分析lab3

    内核准备 内核和相关环境 wget https raw github com mengning mykernel master mykernel 2 0 for linux 5 4 34 patch sudo apt install axe
  • 浅谈TCP/IP协议

    一 TCP IP协议 TCP 传输控制协议 IP 因特网互联协议 TCP IP 合称网络通讯协议 是Internet最基本的协议 Internet国际互联网络的基础 由网络层的IP协议和传输层的TCP协议组成 TCP IP 定义了电子设备如
  • c++链表对应节点相加

    题目 给定两个链表 分别表示两个非负整数 它们的数字逆序存储在链表中 并且每个节点只存储一个数字 计 算两个数的和 并且返回和的链表头指针 如 输入 3 gt 6 gt 9 2 gt 5 gt 7 输出 5 gt 1 gt 7 gt 1 思