求帮助 关于长整数的加法问题 编译通过 运行终止 应该是内存或数据溢出问题 但不知道哪里出错

C语言 码拜 9年前 (2016-04-05) 943次浏览
#include<stdio.h>
#include<string.h>
#include<malloc.h>
#include<stdlib.h>
#define TRUE 1
#define FALSE 0
#define Stack_Size 250
typedef struct{
int elem[Stack_Size];
int top;
}SeqStack; //建栈
typedef struct Node{
int data;
struct Node *next;
}Node,*BigInteger; //链表
void InitList(BigInteger L)
{
L=(BigInteger)malloc(sizeof(Node));
L->next=NULL;
}//初始化链表
void InitStack(SeqStack *S)
{
S->top=-1;
}    //栈初始化
int IsEmpty(SeqStack *S)
{
return(S->top==-1? TRUE:FALSE);
} //判栈空
int IsFull(SeqStack *S)
{
return(S->top == Stack_Size-1? TRUE:FALSE);
}   //判栈满
int Push(SeqStack *S,int x)
{
if(S->top == Stack_Size-1)return(FALSE);//栈已满
S->top++;
S->elem[S->top]=x;
return(TRUE);
} //入栈
int Pop(SeqStack *S,int *x)
{
if(S->top==-1)
return(FALSE);
else
{
*x=S->elem[S->top];
S->top–;
return(TRUE);
}
} //出栈
BigInteger CreateBigInteger(char *str)
{/*函数功能:把由数字组成的字符串str转化为单链表,从字符串右边开始每4位,创建一个结点,直到字符串的最左边。*/
BigInteger L,p,q;
int n,i,x,a,b;
n=strlen(str);//统计字符串str的长度n;
InitList(L);
L->data=0;
i=n-1;
while(i>=0)
{
for(x=0,a=4,b=1;a&&(i>=0);i–,a–,b*=10)   x=b*(str[i]-“0”)+x;
p=(Node*)malloc(sizeof(Node));
q=(Node*)malloc(sizeof(Node));
p->data=x;
q->data = x;
q->next = p;
q = p;
q->next = NULL;
}
L->next = q;
return L ;
}
BigInteger AddBigIntege (BigInteger L1,BigInteger L2)
{/*创建一个单链表用于存放L1+L2,并将该单链表作为函数值返回*/
Node *L,*p,*q1,*q2;
InitList(L);
InitList(p);
InitList(q1);
InitList(q2);
int x,carry;/*carry为进位*/
L->next=NULL;L->data=0;
q1=L1->next;
q2=L2->next;
carry=0;
while(q1&&q2){ /*两者均未到尾部*/
x=q1->data+q2->data+carry;
if(x>10000)
{carry=1;p->data=x-10000;}
else
{carry=0;p->data=x;}
L->next=p;
p=p->next;
q1=q1->next;
q2=q2->next;
}
while(q1)
{
x=q1->data+carry;
if(x>10000)
{carry=1;p->data=x-10000;}
else
{carry=0;p->data=x;}
L->next=p;
p=p->next;
q1=q1->next;
}
while(q2)
{
x=q2->data+carry;
if(x>10000)
{carry=1;p->data=x-10000;}
else
{carry=0;p->data=x;}
L->next=p;
p=p->next;
q2=q2->next;
}
if (carry){
p->data=carry;
L->next=p;
p=p->next;
}
return L;
}
int PrintBigInteger (BigInteger L)
{
int x;
SeqStack *S;
InitStack(S);
while(L)
{
L=L->next;
Push(S,L->data);
}
while(S)
{
Pop(S,&x);
if(x<1000)
printf(“0d%,”,x);
else if(x==0)
printf(“0000,”,x);
else if(x>1000)
printf(“d%,”,x);
}
}
int main()
{
BigInteger L1,L2;
InitList(L1);
InitList(L2);
char ch[250],cj[250];
scanf(“%s”,&ch);
scanf(“%s”,&cj);
L1=CreateBigInteger(ch);
L2=CreateBigInteger(cj);
PrintBigInteger(AddBigIntege(L1,L2));
return 0;
}
解决方案

160

你这个初始化函数InitList就不对,直接传一级指针是没法改变main函数里的L1的指向(换句话说就是:你根本没有给L1,L2初始化,)
必须传二级指针或一级指针的引用才行。
下面这样才行

void InitList(BigInteger *L)
{
	*L = (BigInteger)malloc(sizeof(Node));
	(*L)->next = NULL;
}
......
int main()
{
	BigInteger L1, L2;
	InitList(&L1);
	InitList(&L2);
......
}

40

代码功能归根结底不是别人帮本人看或讲解或注释出来的;而是被本人静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。
提醒:再牛×的老师也无法代替学生本人领悟和上厕所!
单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。
VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或在某行按F9设了断点后按F5执行停在该断点处的时候。

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明求帮助 关于长整数的加法问题 编译通过 运行终止 应该是内存或数据溢出问题 但不知道哪里出错
喜欢 (0)
[1034331897@qq.com]
分享 (0)