面试题之陈利人 单链表和之恋

本文介绍了一种基于单链表的数据结构实现两个数相加的方法,并提供了完整的C++代码示例。通过创建节点类、定义节点结构及实现加法运算,展示了如何处理链表中的进位问题并反转结果链表。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

单链表和之恋

  • 真言

年轻人多听听音乐---周杰伦。给大家推荐一首歌 《单身礼物》,歌手赵凯。

  • 引言

题目已经过去很久,但是我不能放过自己,必须补上。我把自己的电脑屏幕调成黑白的啦,博客也只能看成黑白的啦。建议大家也调成黑白的,保护眼睛。

  • 题目

  • 思路

举个例子说吧,不知你们喜不喜欢图,我很喜欢,形象生动。。。。

  • 实验

  • 代码

test.cpp

#include<iostream>
using namespace std;

// declare size for list
int const size = 30;

// define class for list
class node
{
public:
	int d;
	node * next;
	node()
	{
		d = 0 ;
		next = NULL ;
	}
};

// function declare for add list
node * Add(node * La,node* Lb);

int main()
{
	// list for a and b without head node
	node *L_a = NULL ,*pa;
	node *L_b = NULL ,*pb;
	node * R = NULL ,*pr;
	for(int i= 0;i<size;i++ )
	{
		pa = new node;
		pb = new node;

		pa->d = rand() % 10;
		pb->d = rand() % 10;

		pa->next = L_a;
		L_a  = pa;

		pb->next = L_b;
		L_b = pb ;
	}


	cout<<"La="<<endl;
	pa = L_a;
	while (pa)
	{
		cout<<pa->d<<" "; 
		pa = pa->next ;
	}
	cout<<endl;

	cout<<"Lb="<<endl;
	pb = L_b;
	while(pb)
	{
		cout<<pb->d<<" "; 
		pb = pb->next;
	}
	cout<<endl;

	R = Add(L_a,L_b);

	cout<<"result="<<endl;
	pr = R;
	while(pr)
	{
		cout<<pr->d<<" ";
		pr =pr->next;
	}
	cout<<endl;


	system("pause");
	return 0;
}


// function define for add list
node * Add(node * La,node* Lb)
{
	if(La == NULL)
		return Lb;
	else if(Lb == NULL)
		return NULL;
	node * result = NULL;
	node *pa = La,*pb = Lb,*pr;

	while(pa && pb)
	{
		if((pa->d)<0 || (pa->d)>9 || (pb->d)<0 || (pb->d)>9)
		{
			cout<<"exception of input add for list elem"<<endl;
			return NULL;
		}
		pr = new node ;
		pr->d = pa->d + pb->d;
		pr->next = result;
		result = pr;
		pa = pa->next;
		pb = pb->next;
	}
	pr = result;
	while(pr && pr->next)
	{
		pr->next->d += (pr->d)/10 ;
		pr->d = (pr->d) %10;
		pr = pr->next;
	}

	// the max bit go forward
	if((pr->d) >= 10)
	{
		node * max = new node;
		max->d  = (pr->d) / 10;
		pr->d = (pr->d) % 10;
		max->next = NULL;
		pr->next = max ;
	}

	// reverse the list result
	pr = result ;
	node * pnext = NULL ;
	while(pr && pr->next)
	{
		pnext = pr->next;
		pr -> next = pr->next->next;
		pnext -> next = result;
		result = pnext;		
	}

	while(result)
	{
		if(result->d == 0)
			result = result->next;
		else break;
	}
	return result;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值