您的位置:首页 > 编程语言 > C语言/C++

利用双向循环链表实现任意长的整数进行加法运算

2017-10-02 23:40 2446 查看
【问题描述】 设计一个实现任意长的整数进行加法运算的演示程序 。

【基本要求】 利用双向循环链表实现长整数的存储,每个结点含一个整形变量。输入和输出形式:按中国对于长整数的表示习惯,每四位一组,组间用逗号隔开。

【测试数据】

(1)0;0;应输出“0”。

(2)-2345,6789;-7654,3211;应输出“-1,0000,0000”。

(3)-9999,9999;1,0000,0000,0000;应输出“9999,0000,0001”。

(4)1,0001,0001;-1,0001,0001;应输出“0”。

(5)1,0001,0001;-1,0001,0000;应输出“1”。

(6)-9999,9999,9999;-9999,9999,9999;应输出“-1,9999,9999,9998”。

(7)1,0000,9999,9999;1;应输出“1,0001,0000,0000”。

加法运算分为同号和异号两部分,具体实现代码如下:

#include "stdio.h"
#include "stdlib.h"
#include "conio.h"
#include "ctype.h"

typedef struct DualNode
{
int data;
struct DualNode *prior, *next;
}DualNode, *DualList;

DualList InitList(int sign)
{
//头结点存放符号位,1为正,-1为负
DualList L;
L = (DualList)malloc(sizeof(DualNode));
L->next = L->prior = L;
L->data = sign;
return L;
}

void InsertNodeAtTail(DualList L, int data)
{
//尾插,用于存储数据的输入
DualNode *s;
s = (DualList)malloc(sizeof(DualNode));
s->data = data;
s->next = L;
s->prior = L->prior;
L->prior->next = s;
L->prior = s;
}

void InsertNodeAtHead(DualList L, int data)
{
// 即插在头结点之后,用于计算结果的存储
DualNode *s;
s = (DualList)malloc(sizeof(DualNode));
s->data = data;
s->next = L->next;
s->prior = L;
L->next->prior = s;
L->next = s;
}

void PrintList(DualList L)
{
//打印结果
int FirstTime = 1;
DualNode *p = L;
if (p->data == -1) printf("-");
p = p->next;
while(p != L)
{
if (FirstTime)
{
FirstTim
d561
e = 0;
printf("%d", p->data);
}
else
{
printf(",%4d", p->data);
}
p = p->next;
}
printf("\n");
}

DualList InputData()
{
int FirstNum = 1, data;
char c;
DualList L;
L = (DualList)malloc(sizeof(DualNode));
L->next = L->prior = L;
printf("Please Input as Format: -1234,1234,1234\n");
if ((c = getchar()) == '-')
L = InitList(-1);
else
L = InitList(1);
if (isdigit(c))
// 退格处理
ungetc(c, stdin);
do{
scanf("%d", &data);
InsertNodeAtTail(L, data);
}while((c = getchar()) != '\n');
printf("Your Input is:\n");
PrintList(L);
return L;
}

void DelNode(DualList L, DualNode *p)
{
p->prior->next = p->next;
p->next->prior = p->prior;
free(p);
}

void Add(DualList a, DualList b, DualList c)
{
DualList pa, pb;
int carry = 0, tmp;
pa = a->prior;
pb = b->prior;
while((pa != a) && (pb != b))
{
tmp = pa->data + pb->data + carry;
if (tmp >= 10000)
{
carry = 1;
tmp -= 10000;
}else
carry = 0;
InsertNodeAtHead(c, tmp);
pa = pa->prior;
pb = pb->prior;
}
while(pa != a)
{
// pb = b
tmp = pa->data + carry;
if (tmp >= 1000)
{
carry = 1;
tmp -= 10000;
}
else
carry = 0;
InsertNodeAtHead(c, tmp);
pa = pa->prior;
}
while(pb != b)
{
// pa = a
tmp = pb->data + carry;
if (tmp >= 1000)
{
carry = 1;
tmp -= 10000;
}
else
carry = 0;
InsertNodeAtHead(c, tmp);
pb = pb->prior;
}
if (carry != 0)
InsertNodeAtHead(c, 1);
}

void Sub(DualList a, DualList b, DualList c)
{
DualList pa, pb, pc;
int borrow = 0,tmp;
pa = a->prior;
pb = b->prior;
while((pa != a) && (pb != b))
{
if (pa->data >= pb->data + borrow)
{
tmp = pa->data - pb->data - borrow;
borrow = 0;;
}
else
{
tmp = 10000 + pa->data - pb->data - borrow;
borrow = 1;
}
InsertNodeAtHead(c, tmp);
pa = pa->prior;
pb = pb->prior;
}
if (pa != a || (pa == a && pb == b && borrow == 0))
{
// a >= b
c->data = a->data;
}
if (c->data != a->data)
{
// a < b
pc = c->prior;
while(pc != c)
{
// 结果转换
if (pc == c->prior)
pc->data = 10000 - pc->data;
else
pc->data = 9999 - pc->data;
pc = pc->prior;
}
// 因为符号判断错误,所以borrow要取反
borrow = borrow?0:1;
while(pb != b)
{
if (pb->data >= borrow)
{
tmp = pb->data - borrow;
borrow = 0;
}
// 继续借位
else
{
tmp = 10000 + pb->data + borrow;
borrow = 1;
}
InsertNodeAtHead(c, tmp);
pb = pb -> prior;
}
}
else{
// a>b
while(pa != a)
{
if (pa->data >= borrow)
{
tmp = pa->data - borrow;
borrow = 0;
}
else
{
tmp = 10000 - pa->data - borrow;
borrow = 1;
}
InsertNodeAtHead(c, tmp);
pa = pa->prior;
}
}
pc = c->next;
while(pc->next !=c && pc->data == 0)
{
pc = pc->next;
DelNode(c, pc->prior);
}
}

DualList AddList(DualList a, DualList b)
{
DualList c;
if (a->data * b->data > 0)
{
c = InitList(a->data);
Add(a, b, c);
}else
{
c=InitList(b->data);
Sub(a, b, c);
}
return c;
}

int main(int argc, char const *argv[])
{
while(1)
{
//便于测试
DualList a, b, c;
a = InputData();
b = InputData();
c = AddList(a, b);
printf("The result is:");
PrintList(c);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息