长整数的加法(用双向循环链表实现),C语言
程序如下:为什么输出总是不对?
#include <conio.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define OK 1
#define ERROR 0
#define OVERFLOW -1
typedef int status;
typedef struct DuCirNode{
int data;
struct DuCirNode *prior;
struct DuCirNode *next;
int len;
}DuCirNode, *DulinkList;
status createLink(DulinkList *L)
{
if(!(L=(DulinkList*)malloc(sizeof(DuCirNode)))) return OVERFLOW;
(*L)->next=*L;
(*L)->prior=*L;
(*L)->len=0;
return OK;
}
/*插入结点*/
status insertNode(DulinkList *L , int data)
{
DulinkList p;
if(!(p = (DulinkList)malloc(sizeof(DuCirNode)))) return OVERFLOW; /*生成新结点*/
p->data=data;
p->next=(*L)->next;
(*L)->next->prior=p;
(*L)->next=p;
p->prior=*L;
(*L)->len++;
return OK;
}
status input(DulinkList *L)
{
int i=0,k;
/*int len=0;*/
int j=0,sum=0,c=0;
char *s,x;
s=(char *)malloc(100*sizeof(char *));
s[0]='0';
/*scanf("%c",&x);*/
x=getchar();
while(x!='q')
{
i++;
if(i==1)
{
if(x>='1' && x<='9')
{
(*L)->data=1;s[i]=x;
}
else
if(x=='-')
(*L)->data=-1;
else
{
printf("input invalid!");
return ERROR;
}
}
else{
if(x>='0' && x<='9')
s[i]=x;
else
{
printf("input invalid!");
return ERROR;
}
}
/* scanf("%c",&x);*/
x=getchar();
}
s[++i]='\0';
for(i=strlen(s)-1;i>0;i--)
{
j=j%4;
c=s[i]-'0';
for(k=0;k<j;k++)
c*=10;
sum=sum+c;
if(j==3)
{
insertNode(L,sum);sum=0;
}
j++;
}
if(j<3 && j>0)insertNode(L,sum);
return OK;
}
status add(DulinkList L1, DulinkList L2, DulinkList *result)
{
DulinkList p1,p2;
int resData,*jinwei,*jiewei,i=1;
jinwei=(int *)malloc(100*sizeof(int *));
jiewei=(int *)malloc(100*sizeof(int *));
p1=L1->prior;
p2=L2->prior;
jinwei[0]=0;
jiewei[0]=0;
if(L1->data*L2->data==1)
{
while(p1!=L1 && p2!=L2)
{
jinwei[i]=0;
resData=p1->data + p2->data;
if(resData>=10000)
{
resData-=10000;
jinwei[i]=1;
}
insertNode(result,resData+jinwei[i-1]);
p1=p1->prior;p2=p2->prior;
i++;
}
(*result)->data=L1->data;
}
else
{
jiewei[i]=0;
if(L1->len<L2->len)
{
while(p1!=L1 && p2!=L2)
{
if(p2->data<p1->data)
{
jiewei[i]=1;
resData=p2->data+10000-p1->data;
}
else
{
resData=p2->data-p1->data;
}
insertNode(result,resData);
p1=p1->prior;p2=p2->prior;
i++;
}
(*result)->data=L2->data;
}
else
{
while(p1!=L1 && p2!=L2)
{
if(p1->data<p2->data)
{
jiewei[i]=1;
resData=p1->data+10000-p2->data;
}
else
{
resData=p1->data-p2->data;
}
insertNode(result,resData);
p1=p1->prior;p2=p2->prior;
i++;
}
(*result)->data=L1->data;
}
}
return OK;
}
/*
void print(DulinkList L)
{
DulinkList p=L;
if(L->data==-1)
printf("%c",'-');
p=L->next;
while(p!=L)
{
printf("%d,",p->data);
p=p->next;
}
}
*/
void print(DulinkList L)
{
int i;
DulinkList p=L->next;
for(i=0; i<L->len;i++)
{
if(i==0)
{
if(L->data==-1)
printf("-");
}
else
printf("%d,",p->data);
p=p->next;
}
}
void main()
{
DulinkList L1, L2,result;
int f=0;
clrscr();
createLink(&L1);
createLink(&L2);
createLink(&result);
printf("\nplease input the first jiashu:\n");
f=input(&L1);
while(f==0)
{
printf("\nplease input the first jiashu again:\n");
f=input(&L1);
}
printf("\nplease input the second jiashu:\n");
f=input(&L2);
while(f==0)
{
printf("\nplease input the second jiashu again:\n");
f=input(&L2);
}
printf("\nThe first jiashu you inputed is: ");
print(L1);
printf("\nThe second jiashu you inputed is: ");
print(L2);
printf("\n Result is:");
print(result);
getch();
}