c语言链表中指针与赋值符号,C-链表元素透过指针循环赋值 出现segment fault

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都弄的不可用了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值