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

来源:互联网 发布:淘宝图片上传后变小 编辑:程序博客网 时间:2024/05/04 10:34

【问题描述】 设计一个实现任意长的整数进行加法运算的演示程序 。
【基本要求】 利用双向循环链表实现长整数的存储,每个结点含一个整形变量。输入和输出形式:按中国对于长整数的表示习惯,每四位一组,组间用逗号隔开。
【测试数据】
(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)        {            FirstTime = 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;}
原创粉丝点击