大数据相加_链表解大数据相加减相乘

/*

题意:大数相加减相乘

单链表的运用

*/

#include

#include

#include

char c;

int flag;

typedef struct node

{

char data;

struct node *next;

} Node;

Node *a[10];

Node *create_link()

{

Node *head,*p;

head=p=NULL;

char m;

while(1)

{

scanf("%c",&m);

if(m==‘\n‘||m==‘+‘||m==‘-‘||m==‘*‘)

{

if(m==‘+‘)

c=‘+‘;

else if(m==‘-‘)

c=‘-‘;

else if(m==‘*‘)

c=‘*‘;

break;

}

p=(Node *)malloc(sizeof(Node));

p->data=m;

p->next=NULL;

if(head==NULL)

{

head=p;

}

else

{

p->next=head;

head=p;

}

}

return head;

}

Node *flash_back(Node *link)

{

Node *p=NULL,*head=NULL;

while(link)

{

p=(Node *)malloc(sizeof(Node *));

p->data=link->data;

p->next=NULL;

if(head==NULL)

{

head=p;

}

else

{

p->next=head;

head=p;

}

link=link->next;

}

return head;

}

void comp(Node *p1,Node *p2)

{

while(p1&&p2)

{

if(p1->data>p2->data)

flag=1;

else if(p1->datadata)

flag=0;

p1=p1->next;

p2=p2->next;

}

if(p1)

flag=1;

else if(p2)

flag=0;

}

Node *add(Node *p1,Node *p2)

{

char s;

int k=0;

Node *p,*head;

p=head=NULL;

while(p1&&p2)

{

s=p1->data+p2->data-‘0‘+k;

k=0;

if(s>‘9‘)

{

s=s-10;

k=1;

}

p=(Node *)malloc(sizeof(Node));

p->data=s;

p->next=NULL;

if(head==NULL)

{

head=p;

}

else

{

p->next=head;

head=p;

}

p1=p1->next;

p2=p2->next;

}

while(p1)

{

p=(Node *)malloc(sizeof(Node));

s=k+p1->data;

k=0;

if(s>‘9‘)

{

s=s-10;

k=1;

}

p->data=s;

p->next=head;

head=p;

p1=p1->next;

}

while(p2)

{

p=(Node *)malloc(sizeof(Node));

s=k+p2->data;

k=0;

if(s>‘9‘)

{

s=s-10;

k=1;

}

p->data=s;

p->next=head;

head=p;

p2=p2->next;

}

if(k)

{

p=(Node *)malloc(sizeof(Node));

p->data=k+‘0‘;

p->next=head;

head=p;

}

return head;

}

Node *sub(Node *p1,Node *p2)

{

char s;

int k=0;

Node *p,*head;

p=head=NULL;

while(p1&&p2)

{

if(p1->datadata)

{

s=p1->data+10-p2->data+‘0‘-k;

k=1;

}

else

{

s=p1->data-p2->data+‘0‘-k;

k=0;

}

p=(Node *)malloc(sizeof(Node));

p->data=s;

p->next=NULL;

if(head==NULL)

{

head=p;

}

else

{

p->next=head;

head=p;

}

p1=p1->next;

p2=p2->next;

}

while(p1)

{

p=(Node *)malloc(sizeof(Node));

s=p1->data-k;

k=0;

p->data=s;

p->next=head;

head=p;

p1=p1->next;

}

return head;

}

void print_link(Node *p);

Node *mul(Node *p1,Node *p2)

{

int i=0,j=0;

int s,k;

Node *head,*head1,*head2,*tail,*p;

head1=p1;

while(head1)

{

k=0;

head2=p2;

head=tail=NULL;

while(head2)

{

s=(head2->data-‘0‘)*(head1->data-‘0‘)+k;

k=0;

k=s/10;

s=s%10;

p=(Node *)malloc(sizeof(Node *));

p->data=s+‘0‘;

p->next=NULL;

if(head==NULL)

{

head=p;

tail=p;

}

else

{

tail->next=p;

tail=p;

}

head2=head2->next;

}

if(k)

{

p=(Node *)malloc(sizeof(Node *));

p->data=k+‘0‘;

p->next=NULL;

tail->next=p;

tail=p;

}

int i1=i;

while(i1>0)

{

p=(Node *)malloc(sizeof(Node *));

p->data=‘0‘;

p->next=head;

head=p;

i1--;

}

a[i]=head;

i++;

head1=head1->next;

}

Node *mu=NULL;

if(i==1)

{

Node *mk=(Node *)malloc(sizeof(Node));

mk->data=‘0‘;

mk->next=NULL;

return add(mk,a[0]);

}

else if(i==2)

return add(a[0],a[1]);

else

{

mu=add(a[0],a[1]);

for(j=2;j

{

mu=flash_back(mu);

mu=add(mu,a[j]);

}

return mu;

}

}

void print_link(Node *p)

{

Node *head;

head=p;

while(p)

{

if(head->data==‘0‘&&p->next)

{

head=p->next;

p=p->next;

continue;

}

printf("%c",p->data);

p=p->next;

}

/* while(p)

{

printf("%c",p->data);

p=p->next;

}*/

putchar(‘\n‘);

return ;

}

int main(void)

{

Node *p1,*p2,*p3;

int i;

flag=1;

for(i=0; i<10; i++)

a[i]=NULL;

p1=create_link();

p2=create_link();

if(c==‘+‘)

p3=add(p1,p2);

else if(c==‘-‘)

{

comp(p1,p2);

if(flag)

{

p3=sub(p1,p2);

}

else

{

putchar(‘-‘);

p3=sub(p2,p1);

}

}

else if(c==‘*‘)

{

p3=mul(p1,p2);

}

print_link(p3);

return 0;

}

原文:http://www.cnblogs.com/liudehao/p/5193574.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值