将一个数字字符串按位存入链表中,并实现加法
注意:这里的加法如果长度不一致,会改变原来链表的数值
代码
#include<stdio.h>
#include<stdlib.h>
typedef struct node{
int data;
node *next;
}Node;
void Creat(Node *L) //问题一:利用链表输出一个数字字符串
{
int n,i;
printf("请输入字符长度");
scanf("%d", &n);
fflush(stdin); //清空缓存区,否则否面不能正常输入
char a[n];
printf("请输入字符");
gets(a);
Node *s,*tc=L;
for(i=0;i<n;i++){
s=(Node*)malloc(sizeof(Node));
s->data = (int)a[i]-48; //1的ASCII码为49,2到9依次递增,故减48
tc->next =s;
tc=s;
}
tc->next =NULL;
}
void CreatList(Node *L) //创建单链表(头插)因为后面的运算需要
{
int n,i;
printf("请输入字符长度");
scanf("%d", &n);
fflush(stdin); //清空缓存区,否则否面不能正常输入
char a[n];
printf("请输入字符");
gets(a);
Node *s;
L->next =NULL;
for(i=0;i<n;i++){
s=(Node*)malloc(sizeof(Node));
s->data = (int)a[i]-48; //1的ASCII码为49,2到9依次递增,故减48
s->next=L->next;
L->next =s;
}
}
Node *Add(Node *L,Node *L1)
{
int flag=0; //设置一个进位符
Node *L2=(Node*)malloc(sizeof(Node));
Node *p=L->next,*s;
Node *p1=L1->next ;
L2->next =NULL; //防止输出时无限输出
while(p != NULL && p1 != NULL) { //当在该位都有数值时
s=(Node*)malloc(sizeof(Node));
if(flag == 1){
flag=0; //flag置零
s->data++;
}
if(p->data+p1->data >= 9){ //考虑上面进位的1,这里包含了9
if(p->data+p1->data >= 10) //如果两位大于等于10,flag置1
flag=1;
if(s->data == 1){ //在两位之和为9,且有进位的情况下
s->data--; //防止取余错误,这里先减去
s->data=(p->data+p1->data+1)%10; //再加在右侧
s->next=L2->next; //头插法
L2->next =s;
p=p->next ;
p1=p1->next ;
continue;
}else
s->data=(p->data+p1->data)%10; //取余
s->next=L2->next;
L2->next =s;
p=p->next ;
p1=p1->next ;
continue;
}else
s->data=(p->data+p1->data)%10; //取余
s->next=L2->next;
L2->next =s;
p=p->next ;
p1=p1->next ;
}
while(p != NULL && p1 == NULL){ //当L加完了,而L1没加完时
s=(Node*)malloc(sizeof(Node));
if(flag == 1){
s->data=p->data+1; //只有一位了,最大为9,所以直接将进位加在上面
flag=0;
}
if(p->data>=10){
flag=1;
}
s->data=p->data%10; //取余
s->next=L2->next; //头插
L2->next =s;
p=p->next ;
}
while(p1 != NULL && p == NULL){ //当L加完了,而L1没加完时
s=(Node*)malloc(sizeof(Node));
if(flag == 1){
p1->data++; //只有一位了,最大为9,所以直接将进位加在上面
flag=0;
}
if(p1->data>=10){
flag=1;
}
s->data=p1->data%10; //取余
s->next=L2->next; //头插
L2->next =s;
p1=p1->next ;
}
return L2;
}
int DisList(Node *L) //打印
{
if(L->next == NULL) return 0; //如果头结点下一个无元素,返回0
node *p=L->next ;
while(p != NULL){ //打印输出
printf("%d ", p->data );
p=p->next ;
}
printf("\n");
return 1;
}
int main()
{
Node *L=(Node*)malloc(sizeof(Node));
CreatList(L);
Node *L1=(Node*)malloc(sizeof(Node));
CreatList(L1);
Node *L2=(Node*)malloc(sizeof(Node));
L2=Add(L,L1);
DisList(L2);
return 0;
}