数据结构:用链表实现大数运算(高精度)

采用链表实现大数运算

C++分为头文件程序和主体cpp函数

头文件函数如下:

#include<iostream>
using	namespace	std;
template<class	T>
struct	Node
{
	T	data;
	struct	Node<T>*prior;
	struct	Node<T>*next;
};

template<class	T>
class	Linklist
{
public:
	Linklist() { front = new	Node<T>; front = NULL; end = NULL; };
	Linklist(T	a[], int	n);//构造函数 
	void	Printlist();//打印函数
	void	Printshow();
	~Linklist();
	Node<T>*front;
	Node<T>*end;
};

template<class	T>
Linklist<T>::Linklist(T	a[], int	n)
{
	front = new Node<T>;
	end = new	Node<T>;
	Node<T>*r, *s;
	r = front;
	for (int i = 0; i < n; ++i)
	{
		s = new Node<T>;
		s->data = a[i];
		r->next = s;
		s->prior = r;
		r = s;
		end = r;
	}
	r->next = NULL;
}

template<class	T>
void	Linklist<T>::Printlist()
{
	Node<T>*s = front->next;
	while (s)
	{
		cout << s->data << " ";
		s = s->next;
	}
	cout << endl;
}

template<class	T>
void	Linklist<T>::Printshow()
{
	Node<T>*s = end;
	int	con=0;//控制负数前的0 
	while (s->prior != front)
	{
		if(s->data!=0||con) 
		{
			cout<<s->data;
			con=1;
		}
		s = s->prior;
	}
	cout << endl;
}

template<class	T>
Linklist<T>::~Linklist()
{
	Node<T>*p=front;
	while (p)
	{
		Node<T>* q = p;
		p = p->next;
		delete q;
		q = NULL;
	}

}


主函数:

#include<bits/stdc++.h>
#include"Linklist.h"
using	namespace	std;
int	NOTI=0;
struct HugeInt {
	int len;
	int num[100001];
};

HugeInt a, b, w;        //w为结果 
char c[100001], d[100001];//存储两个大整数 
bool negative;//存储正负号 

void Scan_HugeInt()
{   //读入两个大整数
	cout << "请输入第一个大数:" << endl;
	cin >> c;
	cout << "请输入第二个大数:" << endl;
	cin >> d;
	if((strlen(c) < strlen(d)) || (strlen(c) == strlen(d) && strcmp(c, d) < 0)) 
	{ //若被减数小 交换 记为负数 
		negative = true;
		swap(c, d);
	}
	a.len = strlen(c); //strlen求串长 
	b.len = strlen(d);
	for (int i = 0; i < a.len; i++) a.num[a.len - i] = c[i] - '0'; //逆序存储 
	for (int i = 0; i < b.len; i++) b.num[b.len - i] = d[i] - '0';
}

template<class	T>//加法运算 
void	Plus(Linklist<T>&link1, Linklist<T>&link2, Linklist<T>&link3)
{
	Node<T>*p = link1.front->next;
	Node<T>*q = link2.front->next;
	Node<T>*r = link3.front->next;
	while (r->next)
	{
		r->data += (p->data + q->data);
		r->next->data = r->data / 10;
		r->data%=10;
		
		r = r->next;
		p = p->next;
		q = q->next;
	}
	if(r->data!=0)
		NOTI=1;
}


template<class	T>//减法运算 
void	Minus(Linklist<T>&link1, Linklist<T>&link2, Linklist<T>&link3)
{
	Node<T>*p = link1.front->next;
	Node<T>*q = link2.front->next;
	Node<T>*r = link3.front->next;
	while(r->next)
	{
		if(p->data<q->data)
		{
			p->next->data--;
			p->data+=10;
		}
		r->data+=p->data-q->data;
		r = r->next;
		p = p->next;
		q = q->next;
	}
}



int	main()
{ 
	Scan_HugeInt();
	w.len = max(a.len, b.len);
	int	Res[20000];
	memset(Res, 0, sizeof(Res));
	Linklist<int>link1(a.num, w.len + 2);
	Linklist<int>link2(b.num, w.len + 2);
	//进行加法运算 
	Linklist<int>link3(Res, w.len + 2);//加法结果链表
	Plus(link1, link2, link3);
	cout<<"两数相加结果为:";
	/*if(NOTI)
		cout<<"1";*/
	link3.Printshow();
	//进行减法运算 
	Linklist<int>link4(Res, w.len + 2);//减法结果链表 
	Minus(link1, link2, link4);
	cout<<"两数相减结果为:";
	if(negative)
		cout<<"-";
	link4.Printshow();
	
	/*link1.Printlist();
	link2.Printlist();
	link3.Printlist();
	link4.Printlist();*/
}

总结:还是一个比较呆板的先存数组,再用数组初始化链表的过程,考虑进位退位判断负数等小细节即可

  • 0
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Pintos是一个操作系统的教学项目,它里面有许多基础的数据结构。其中之一就是通用链表(generic list)。 链表是一个常见的数据结构,用于存储一系列的元素。在Pintos中,通用链表是一种灵活且可扩展的数据结构,可以存储任意类型的元素。 Pintos中的通用链表由两个主要的结构组成:链表节点和链表本身。每个链表节点包含了一个指向前一个节点的指针和一个指向后一个节点的指针,以及一个用于存储元素的指针。链表本身则包含了一个指向头节点和尾节点的指针,以及用于记录链表长度的变量。 通过使用这些结构,Pintos的通用链表提供了一系列的操作来管理链表中的元素。比如,它可以实现链表头部和尾部插入元素、删除元素以及在指定位置插入或删除元素等功能。此外,通过遍历链表,我们可以对链表中的每个元素进行操作,比如查找、更新和打印。 Pintos的通用链表使用简单而高效的方法来处理链表操作。通过使用指针连接节点,我们可以轻松地插入和删除元素,并且时间复杂度为O(1)。而遍历链表的操作也只需要O(n)的时间复杂度,其中n是链表的长度。 总之,Pintos的通用链表为操作系统的开发提供了一个方便和高效的数据结构。它可以存储任意类型的元素,并提供了丰富的操作来管理和操作这些元素。无论是在Pintos项目中还是在实际操作系统的开发中,通用链表都是一个非常有用的工具。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值