回 帖 发 新 帖 刷新版面

主题:[讨论]关于有链表定义大整数,然后编译大整数的加减乘法3个函数,请教下!

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

typedef struct Cell2 *big_int;
struct Cell2{big_int suiv;[color=0000FF]//指向下一个[/color]
               Elt el;
             big_int pre;[color=0000FF]//指向前一个[/color]
};
[color=0000FF]//定义了个双向链表[/color]


big_int creer(){return NULL;}



int long(big_int L){
   big_int p;
   int i=0;
   p=L;
while(p!=NULL){
     i++;
    p=p->suiv;}
    return i;
}
[color=0000FF]//链表长度[/color]


big_int add(Elt x,int pos, big_int L)
    {big_int p,q,n; int i;
    n=(big_int)malloc(sizeof(struct Cell2));
    n->el=x; p=q=L; i=1;
    while (p!=NULL&&i<pos){q=p; p=p->suiv;}
    if(i==1){n->suiv=L; n->pre=NULL;
               if(L!=NULL)L->pre=n; return n;}
    else if(p!=NULL){n->suiv=p; n->pre=p->pre;
                      q->suiv=n; p-->pre=n; return L;}
       else {n->suiv=NULL; n->pre=q; q->suiv=n;}
  return L;
}
[color=0000FF]//在链表L中第pos位置加个元素x[/color]
[color=FF0000]//加元素这个函数是不是就用在两个要加的链表里呢?
怎样把一串整数依次一个一个输入到链表里?[/color]


big_int addition(big_int L1,big_int L2)
{big_int t,p1,p2,p3,L3;
    if(long(L1)<=long(L2)L3=L2;
        else L3=L1;
    p3=(big_int)malloc(sizeof(struct Cell2));
    t=p3;p3->suiv=L3;
    while(L3!=NULL){p3=L3->suiv;}
[color=FF0000]//(这里没写完)要让链表从最后个位置开始计算加法,需要特地写个(最后元素的函数么),还是可以当不等于null,这样调到最后个元素呢?[/color]
    
    
    while(L1!=NULL){p1=L1->suiv;}
    while(L2!=NULL){p2=L2->suiv;}
    while(p1->pre!=NULL||p2->pre!=NULL)
    {if(((p1->el+p2->el)<=9)&&((p1->suiv->el+p2->suiv->el)<=9))
   p3->el=(p1->el+p2->el);
        else if(((p1->el+p2->el)<=8)&&((p1->suiv->el+p2->suiv->el)>9))p3->el=((p1->el+p2->el)+1);
            else p3->el=((p1->el+p2->el)+1-10);
                return L3->el=p3->el;
        }
    }
[color=FF0000]//关于加法进位上面这个可以表示么?有什么要点没?[/color]

[color=0000FF]//目前只写到这里,写得比较糟糕,大家耐心看看,指导下^^[/color]

回复列表 (共3个回复)

沙发

没人回答么?

ps:这问题用单链表也可以做把?
双方便还是单方便呢?

板凳

big_int add(Elt x,int pos, big_int L)
    {big_int p,q,n; int i;
    n=(big_int)malloc(sizeof(struct Cell2));
    n->el=x; p=q=L; i=1;
    while (p!=NULL&&i<pos){q=p; p=p->suiv;}
    if(i==1){n->suiv=L; n->pre=NULL;
               if(L!=NULL)L->pre=n; return n;}
    else if(p!=NULL){n->suiv=p; n->pre=p->pre;
                      q->suiv=n; p-->pre=n; return L;}
       else {n->suiv=NULL; n->pre=q; q->suiv=n;}
  return L;
}
这一段写的很混乱
Elt是你用的语言特有的数据类别么?我没有见过(汉自己)
不过while循环里既没有对i操作又没有对pos操作,这里肯定有错

    while(L3!=NULL){p3=L3->suiv;}
//(这里没写完)要让链表从最后个位置开始计算加法,需要特地写个(最后元素的函数么),还是可以当不等于null,这样调到最后个元素呢?
这里我的看法是只要滤到L->suiv!=NULL就可以了(你做加法之前怎么也得判断出两个表是否为空)
L3没有必要一开始就传过一个很大的空间。每次运算前面向L3表头+一个空结点进去参与运算就可以了。
你+法运算那里写的很不实惠,实际上每次运算考虑面向两个节点即可。每次运算前向得数表表头插一个新节点(建立新节点应该用函数完成),指针向后移一位。第二个节点累加当前位加法的个位,向第一个节点累加当前位加法的进位即可。全部计算完成后返回前检查当前L3数据区是否为0,是的话释放L3表头

最后对你的程序提出一点批评,你也太偷工减料了吧,没区别节点类型和链表类型。缺很多链表的基本运算。你可以说你程序里很少用到,但是这相当于定义头文件,要养成习惯的

3 楼

如果用单链表也可以
只是要注意存储的时候要把所有的操作数先逆序存放,也就是表头放低位

我来回复

您尚未登录,请登录后再回复。点此登录或注册