目标:实现大整数的四则运算

目前完成加法部分(后续补充)

 

cal.cpp

#include "cstdio"
#include "cstdlib"
#include "cstring"

#define MAX_FIGURES 1024

typedef struct Node{
	int value;//节点值
	Node *next;//next节点指针
}Node;

//遍历整个链表
void travel(Node *head)
{
	Node *p = head -> next;
	while(p->next){
		printf("%d ",p -> value);
		p = p -> next;
	}
	printf("\n");
}

//销毁整个链表
void destroy(Node *head)
{
	Node *p = head;
	Node *q;
	while(p -> next)
	{
		q = p -> next;
		delete p;
		p = q;
	}
	delete p;
}

//链表1 和 链表2 按位相加 结果按位放在 链表3 中
void bigAdd(Node *head1, Node *head2, Node *head3)
{
	int carry = 0;//进位
	Node *p = head1 -> next;
	Node *q = head2 -> next;
	Node *node = new Node;
	head3 -> next = node;
	Node *r;
	while(p->next && q->next)//处理等长部分
	{
		r = node;
		r -> value = p -> value + q -> value + carry;
		carry = r -> value / 10;
		r -> value %= 10;
		node = new Node;
		r -> next = node;
		p = p -> next;
		q = q -> next;
	}
	
	Node *s = p->next ? p : q; //处理不等长情况
	while(s->next)
	{
		r = node;
		r -> value = s -> value + carry;
		carry = r -> value / 10;
		r -> value %= 10;
		node = new Node;
		r -> next = node;
		s = s -> next;
	}
	if(carry)
	{
		r = node;
		r -> value = 1;
		node = new Node;
		r -> next = node;
	}
	node -> next = NULL;
	
}

//随机创建长度为 L 的链表
Node *createList(Node *head, const char *op)
{
	int op_len = strlen(op);
	Node *node = new Node;//节点指针
	Node *p;
	head -> next = node;
	for(int i = op_len; i > 0; i--)
	{
		p = node;
		node -> value = op[i-1] - 48;
		node = new Node;
		p -> next = node;
	}
	node -> next = NULL;//尾节点 next 域赋值 NULL 表示结束
	return head;
}

//加法函数
char *add(const char *a, const char *b)
{
	char *result = new char[MAX_FIGURES+1];
	Node *head1 = new Node;//头结点(不存值) 
	Node *head2 = new Node;//头结点(不存值)
	Node *head3 = new Node;//头结点(不存值)
	Node *p = head3;
	int result_len = 0;
	createList(head1, a);
	createList(head2, b);
	bigAdd(head1, head2, head3);
	while( p -> next )//求出结果链表长度
	{
		result_len ++;
		p = p -> next;
	}
	result_len --;
	result[result_len--] = '\0';
	p = head3 ->next;
	while( p -> next )//讲结果链表中的结果存至result[]中
	{
		result[result_len--] = p -> value + 48;
		p = p -> next;
	}
	destroy(head1);//摧毁 三个链表
	destroy(head2);
	destroy(head3);
	return result;
}
int main()
{
	const char *a = "123456789";
	const char *b = "987654321";
	char *re;
	re = add(a, b);
	printf("%16s\n+%15s\n----------------\n%16s", a, b, re);
	return 0;
}