目标:实现大整数的四则运算
目前完成加法部分(后续补充)
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;
}