[C/C++/C语言]设计一种构造能表示最多1000位的大整数(正、负均可),并实现这类数的乘运算

[C/C++/C语言]设计一种结构能表示最多1000位的大整数(正、负均可),并实现这类数的乘运算。
用c做

------解决方案--------------------
C/C++ code
/* 
   最笨的最原始的人类思想法    
   用第二个数的每一个位乘第一个数
   得到的数据屁股不足零然后累加
   下面的数据你想算100万位都可以,只要你的计算机内存够大
   第一个数表示+或-,0表示+,1表示-
*/

#include "stdio.h"
#include "stdlib.h"

typedef struct MYNUMBER
{
    char   value;
    struct MYNUMBER *next;
    struct MYNUMBER *prev;
}*BIGNUMBER;

BIGNUMBER Mul(BIGNUMBER n1,BIGNUMBER n2);               /*两数相乘*/
BIGNUMBER GetVal(char *str);                            /*用字串转换成大数*/
void      DelVal(BIGNUMBER n);                          /*删除大数占用内存*/
void      ShowVal(BIGNUMBER n);                         /*显示大数*/
void      InitVal(BIGNUMBER n);                         /*大数置0*/

void      Mulx(BIGNUMBER r,BIGNUMBER n,char d,int off); /*用大数n乘一个数d,屁股补off个0,结果给大数r*/
void      Addx(BIGNUMBER r,BIGNUMBER n);                /*用大数r加大数n,结果给大数r*/


void main()
{
    BIGNUMBER x1,x2,y;
    x1=GetVal("-939874523423798462436234\0");
    x2=GetVal("9873423624623462345235234\0");
    y=Mul(x1,x2);

    ShowVal(x1);
    ShowVal(x2);
    ShowVal(y);
    
    DelVal(x1);
    DelVal(x2);
    DelVal(y);
}

BIGNUMBER GetVal(char *str)
{
    char *ch;
    BIGNUMBER Head;
    BIGNUMBER Cur;

    Head=(BIGNUMBER)malloc(sizeof(MYNUMBER));
    Head->value=-1;
    Head->next=NULL;
    Head->prev=NULL;
    Cur=Head;

    if(str)
    {
        ch=str;
        if(*ch=='-') 
        {
            Head->value=1;
            ch++;
        }
        else Head->value=0;
        while(*ch)
        {
            BIGNUMBER p=(BIGNUMBER)malloc(sizeof(MYNUMBER));
            p->value=*ch-0x30;
            p->next=NULL;
            Cur->next=p;
            p->prev=Cur;
            Cur=Cur->next;
            ch++;
        }
    }

    return Head;
}
void DelVal(BIGNUMBER n)
{
    BIGNUMBER tmp1,tmp2;
    tmp1=tmp2=n;
    while(tmp2)
    {
        tmp2=tmp2->next;
        free(tmp1);
        tmp1=tmp2;
    }
}

void ShowVal(BIGNUMBER n)
{
    BIGNUMBER tmp=n;
    printf("\n");
    if(tmp->value==-1)
    {
        printf("Error Number\n");
        return;
    }
    if(tmp->value==1) printf("-");
    tmp=tmp->next;

    while(tmp)
    {
        printf("%d",tmp->value);
        tmp=tmp->next;
    }
    printf("\n");
}

void InitVal(BIGNUMBER n)
{
    BIGNUMBER tmp=n->next;
    while(tmp)
    {
        tmp->value=0;
        tmp=tmp->next;
    }
}

void Mulx(BIGNUMBER r,BIGNUMBER n,char d,int off)
{
    BIGNUMBER Tail1,Tail2;
    char kk=0,tmp=0;
    int  i;

    Tail1=r;
    while(Tail1->next)
        Tail1=Tail1->next;
    for(i=0;i<off;i++)
        Tail1=Tail1->prev;
    Tail2=n;
    while(Tail2->next)
        Tail2=Tail2->next;
    while(Tail2!=n)
    {
        tmp=Tail2->value*d+kk;
        Tail1->value=tmp%10;
        kk=tmp/10;
        Tail2=Tail2->prev;
        Tail1=Tail1->prev;
    }
    Tail1->value=kk;
}
void  Addx(BIGNUMBER r,BIGNUMBER n)
{
    BIGNUMBER Tail1,Tail2;
    char kk=0,tmp=0;

    Tail1=r;
    while(Tail1->next)
        Tail1=Tail1->next;
    Tail2=n;
    while(Tail2->next)
        Tail2=Tail2->next;
    while(Tail2!=n)
    {
        tmp=Tail1->value+Tail2->value+kk;
        Tail1->value=tmp%10;
        kk=tmp/10;
        Tail2=Tail2->prev;
        Tail1=Tail1->prev;
    }
    if(Tail1!=r) Tail1->value=kk;
}

BIGNUMBER Mul(BIGNUMBER n1,BIGNUMBER n2)
{
    BIGNUMBER Head1,Head2;
    BIGNUMBER Tail,Cur,tmp;

    int len1=0,len2=0,len3=0;
    int i;
    int kk=0,off=0;

    Head1=(BIGNUMBER)malloc(sizeof(MYNUMBER));
    Head1->next=NULL;
    Head1->prev=NULL;

    if((n1->value==-1)||(n2->value==-1)) 
        Head1->value=-1;
    else 
    {
        Head1->value=n1->value^n2->value;
        printf("\nAAAAA: %d",Head1->value);
        Tail=n1;
        while(Tail->next)
        {
            len1++;
            Tail=Tail->next;
        }
        Tail=n2;
        while(Tail->next)
        {
            len2++;
            Tail=Tail->next;
        }
        len3=len1+len2+2;
        
        Head2=(BIGNUMBER)malloc(sizeof(MYNUMBER));
        Head2->value=0;
        Head2->prev=NULL;
        Head2->next=NULL;

        Cur=Head1;
        for(i=0;i<len3;i++)
        {
            BIGNUMBER p=(BIGNUMBER)malloc(sizeof(MYNUMBER));
            p->value=0;
            p->next=NULL;
            Cur->next=p;
            p->prev=Cur;
            Cur=Cur->next;
        }
        Cur=Head2;
        for(i=0;i<len3;i++)
        {
            BIGNUMBER q=(BIGNUMBER)malloc(sizeof(MYNUMBER));
            q->value=0;
            q->next=NULL;
            Cur->next=q;
            q->prev=Cur;
            Cur=Cur->next;
        }
   
        Cur=Tail;
        off=0;
        while(Cur!=n2)
        {
            InitVal(Head2);
            Mulx(Head2,n1,Cur->value,off);
            Addx(Head1,Head2);
            Cur=Cur->prev;
            off++;
        }
        
        Cur=Head1->next;
        while(Cur->value==0)
        {
            tmp=Cur;
            Cur=Cur->next;
            tmp->next->prev=tmp->prev;
            tmp->prev->next=tmp->next;
            free(tmp);
        }

        Cur=Head2;
        while(Cur)
        {
            Cur=Cur->next;
            free(Head2);
            Head2=Cur;
        }
    }
    return Head1;
}