C-链表元素通过指针循环赋值 出现segment fault
#include
#include
#include
#include
int tema[100];
int block=1;
int sign=0;
int longcount[3];
int lc=0;
int lca=0;
typedef struct DuLNode
{
int data;
struct DuLNode *prev,*next;
}DuLNode,*DuLinkList;
/*int InitDuLink(&DuLinkList L)
{
DuLNode *p,*q;
*q=L;
int i=1;
char c;
L.data=0;
printf("please input numbers(end of #)");
while(c=putchar()=='#')
{
if(c'9')printf("input error!please input again");continue;
a[i]=c-'0';
++i;++block;
(*q).data=10*(*q).data+a[i];
if(block==4)
{
p=(*q).next;
q=p;
block=1;
}
(*q).next=L.prev;
free *p,*q,i,c;
}if(L.prev<1000)??
return 1;
}*/
int InitDuLink(DuLNode L)
{
DuLNode *p,*q;
//DuLinkList p,q;
int i,m=0;
char str1[101];
q=&L;
//q=(DuLinkList)malloc(sizeof(DuLNode));
L.data=0;
//gets(str1);
//char str1[101];
scanf("%s",&str1);
printf("test_1\n");
m=strlen(str1);
for(i=0;i
{
printf("test_2\n");
if(str1[0]=='-'){sign=sign+1;continue;}
if(str1[i]'9'){printf("input error!");break;}
tema[i]=str1[i]-'0';
printf("test_3\n");
//tema[i]=atoi(str1[i]);
}
printf("test_4\n");
//longcount[lc]=i;
for(;i>0;i=i-1) //问题可能在这。
{
printf("1");
(*q).data=10*(*q).data+tema[i];
//printf("test-5");
block=block+1;
if(block==4)
{
q=(DuLinkList)malloc(sizeof(DuLNode));
p=(*q).prev;
q=p;
block=1;
}
}
L.next=(*q).prev;
printf("test_5\n");
//free (*q);
}
void fuc_print(DuLNode a)/*this fucation only can print sum numbers,it can't print the input numbers*/
{
DuLNode temp,*q,*p;
a.next=&temp;
q=&temp;
while(temp.prev==(*q).next)
{
printf("%d",(*q).data);
//q=(DuLinkList)malloc(sizeof(DuLNode));
p=(*q).next;
q=p;
}
/*free *q,*p;*/
}
void fuc_plus(DuLNode a,DuLNode b)/*a+b* and tianjia'-'ji -(a+b)*/
{
int x,carry=0;
DuLNode SUM,*sum_tem1,*sum_tem2,*p,*q,*te1,*te2;
SUM.data=0;
sum_tem1=&SUM;
p=a.prev;q=b.prev;
while((*p).prev==a.next||(*q).prev==b.next)
{
x=(*p).data+(*q).data+carry;
te1=(*p).prev;te2=(*q).prev;
p=te1;q=te2;
if(x>9999)
{
(*sum_tem1).data=x-10000;
carry=1;
}else {(*sum_tem1).data=x;carry=0;}
sum_tem2=(*sum_tem1).prev;sum_tem1=sum_tem1;
}
fuc_print(SUM);
/*free x,carry,*p,*q,*te1,te2,SUM;*/
}
void fuc_sub(DuLNode a,DuLNode b)/*a-b or -(a-b)*/
{
int x,carry=0;
DuLNode SUM,*p,*q,*te1,*te2,*sum_tem1,*sum_tem2;
SUM.data=0;
sum_tem1=&SUM;
p=a.prev;q=b.prev;
while((*p).prev==a.next||(*q).prev==b.next)
{
x=(*p).data-(*q).data-carry;
te1=(*p).prev;te2=(*q).prev;
p=te1;q=te2;
if(x<0)
{
(*sum_tem1).data=x+10000;
carry=1;
}else {(*sum_tem1).data=x;carry=0;}
sum_tem2=(*sum_tem1).prev;sum_tem1=sum_tem2;
}
fuc_print(SUM);
/*free x,carry,*p,*q,*te1,*te2,SUM;*/
}
int compare(DuLNode a,DuLNode b)
{
DuLNode *p,*q,*m,*n;
m=&a;n=&b;
if(longcount[1]>longcount[2])return lca=1;
if(longcount[1]
if(longcount[1]==longcount[2])
while(longcount[1]==0)
{
p=(*m).next;q=(*n).next;
m=p;n=q;
if((*m).data>(*n).data){return lca=1;break;}
longcount[1]--;
}
if(longcount[1]==0)return lca=3;
}
int main()
{
//int InitDuLink(DuLNode L);
printf("not support decimals,multiplication;only can be used to test.\n");
DuLNode NUM1,NUM2;
int sign1=0,sign2=1,sign3;
sign=0;
++lc;
printf("please input the first numbers:");
InitDuLink(NUM1);
printf("test_6\n");
fuc_print(NUM1);
if(sign==0)sign1=0;
if(sign==1){sign1=2;longcount[1]=longcount[1]-1;}
++lc;
printf("\nplease input the second numbers:");
InitDuLink(NUM2);
fuc_print(NUM2);
lc=0;
if(sign1==2&&sign==1)sign2=1;
if(sign==2){sign2=4;longcount[2]=longcount[2]-1;}
sign3=sign2+sign1;
if(sign3==3||sign3==4)/* a+b==1, -a+b(a>b==3 // ab==4 // a
{
compare(NUM1,NUM2);
if(sign3==3&&lca==1)sign3=3;
if(sign3==3&&lca==2)sign3=13;
if(sign3==4&&lca==1)sign3=4;
if(sign3==4&&lca==2)sign3=14;
}
switch(sign3)
{
case 1:fuc_plus(NUM1,NUM2);break;
case 3:printf("-");fuc_sub(NUM1,NUM2);break;
case 4:fuc_sub(NUM1,NUM2);break;
case 6:printf("-");fuc_plus(NUM1,NUM2);break;
case 13:fuc_plus(NUM2,NUM1);break;
case 14:printf("-");fuc_sub(NUM2,NUM1);break;
}
}
1:指针以及malloc方面了解的不够详细,问题应该是出现在这里
2:test_4之前的应该没问题(在Init函数里面),在该函数第二个for循环就开始出现错误
我感觉问题应该出在66~83行...解决了这个后面的我可思考思考
------解决思路----------------------
错误太多.写完一个函数, 用printf测试好了再写下一个.
q=(DuLinkList)malloc(sizeof(DuLNode));//这里q指向了新分配的地址, 新的!所以q的data,pre,next都没赋值
p=(*q).prev;//q的prev是未知地址, 这句后p就是未知地址
q=p;//这句之后, q和p一样, 指向了未知地址
//终于成功的把p和q都弄的不可用了