一个C语言程序,编译、链接都没问题,但一运行就出错,高手知道下~~

程序里包括了输入(build)、排序(list_duoxs)、输出(show)、以及求和(add)函数,我编译没问题,但一运行就提示程序运行关闭。请大家知道下#inclu... 程序里包括了输入(build)、排序(list_duoxs)、输出(show)、以及求和(add)函数,我编译没问题,但一运行就提示程序运行关闭。请大家知道下
#include <stdio.h>
#include <stdlib.h>
typedef struct dxs
{
int exp,coef;
struct dxs *next;
}duoxs,*duo_xs;
/*****输入函数*****/
void build(int i,duo_xs &pa)
{
int j,sum_duoxs,exps=0,coefs=0;
duoxs *p;
pa->coef=coefs;
pa->exp=exps;
pa->next=NULL;
p=pa;
printf("输入第%d个多项式的个数\n",i);
scanf("%d",&sum_duoxs);
for(j=sum_duoxs;j>0;j--)
{
printf("输入系数和指数");
scanf("%d%d",&coefs,&exps);
p->coef=coefs;
p->exp=exps;
p->next=pa;
pa=p;
p=(duoxs*)malloc(sizeof(duoxs));
}
free(p);
}
/*****输出函数*****/
void show(duo_xs &pa)
{
while(pa!=NULL)
{
printf("%d\t%d\t",pa->coef,pa->exp);
pa=pa->next;
}
printf("\n");
}
/*****排序函数(升序)*****/
void list_duoxs(duo_xs &pa)
{
duoxs tt,tt0;
duoxs *p=pa,*q=pa;
tt.coef=p->coef;
tt.exp=p->exp;
while(p!=NULL)
{
while(q!=NULL)
{
if(q->exp<tt.exp)
{
tt0.exp=tt.exp;tt0.coef=tt.coef;
tt.exp=q->exp;tt.coef=q->coef;
q->exp=tt0.exp;q->coef=tt0.coef;
}
q=q->next;
}
tt0.exp=tt.exp;tt0.coef=tt.coef;
tt.exp=p->exp;tt.coef=p->coef;
p->exp=tt0.exp;p->coef=tt0.coef;
p=p->next;
q=p;
}
}
/*****多项式相加函数*****/
void add(duo_xs &pa,duo_xs &pb)
{
int sum_coef;
duoxs *p,*q,*u,*pre;
pre=pa;
u=pb;
p=pa->next;
q=pb->next;
while((p!=NULL)&&(q!=NULL))
{
duoxs *p,*q,*u,*pre;
if(p->exp>q->exp)
{
u=q;
pre->next=u;
u->next=p;
pre=u;
q=q->next;
}
else if(p->exp<q->exp)
{
pre=p;
p=p->next;
}
else
{
sum_coef=p->coef+q->coef;
if(sum_coef==0)
{
u=p;
p=p->next;
free(u);
u=q;
q=q->next;
free(u);
}
else
{
p->coef=sum_coef;
pre=p;
p=p->next;
u=q;
q=q->next;
free(u);
}
}
if(q!=NULL)
{
pre->next=q;
}
}
}
/*****main函数*****/
void main()
{
duoxs *a,*b;
build(1,a);
list_duoxs(a);
show(a);
build(2,b);
list_duoxs(b);
show(a);
add(a,b);
show(a);
}
展开
 我来答
緗虞帱
2011-10-19 · TA获得超过578个赞
知道小有建树答主
回答量:298
采纳率:0%
帮助的人:343万
展开全部
改好了:
#include <stdio.h>
#include <stdlib.h>
typedef struct dxs
{
int exp,coef;
struct dxs *next;
}duoxs,*duo_xs;
/*****输入函数*****/
void build(int i,duo_xs pa)
{
int j,sum_duoxs,exps=0,coefs=0;
duoxs *p;
pa->coef=coefs;
pa->exp=exps;
pa->next=NULL;
p=pa;
printf("输入第%d个多项式的个数\n",i);
scanf("%d",&sum_duoxs);
for(j=sum_duoxs;j>0;j--)
{
printf("输入系数和指数");
scanf("%d%d",&coefs,&exps);
p->coef=coefs;
p->exp=exps;
p->next=pa;
pa=p;
p=(duoxs*)malloc(sizeof(duoxs));
}
free(p);
}
/*****输出函数*****/
void show(duo_xs pa)
{
while(pa!=NULL)
{
printf("%d\t%d\t",pa->coef,pa->exp);
pa=pa->next;
}
printf("\n");
}
/*****排序函数(升序)*****/
void list_duoxs(duo_xs pa)
{
duoxs tt,tt0;
duoxs *p=pa,*q=pa;
tt.coef=p->coef;
tt.exp=p->exp;
while(p!=NULL)
{
while(q!=NULL)
{
if(q->exp<tt.exp)
{
tt0.exp=tt.exp;tt0.coef=tt.coef;
tt.exp=q->exp;tt.coef=q->coef;
q->exp=tt0.exp;q->coef=tt0.coef;
}
q=q->next;
}
tt0.exp=tt.exp;tt0.coef=tt.coef;
tt.exp=p->exp;tt.coef=p->coef;
p->exp=tt0.exp;p->coef=tt0.coef;
p=p->next;
q=p;
}
}
/*****多项式相加函数*****/
void add(duo_xs pa,duo_xs pb)
{
int sum_coef;
duoxs *p,*q,*u,*pre;
pre=pa;
u=pb;
p=pa->next;
q=pb->next;
while((p!=NULL)&&(q!=NULL))
{
duoxs *p,*q,*u,*pre;
if(p->exp>q->exp)
{
u=q;
pre->next=u;
u->next=p;
pre=u;
q=q->next;
}
else if(p->exp<q->exp)
{
pre=p;
p=p->next;
}
else
{
sum_coef=p->coef+q->coef;
if(sum_coef==0)
{
u=p;
p=p->next;
free(u);
u=q;
q=q->next;
free(u);
}
else
{
p->coef=sum_coef;
pre=p;
p=p->next;
u=q;
q=q->next;
free(u);
}
}
if(q!=NULL)
{
pre->next=q;
}
}
}
/*****main函数*****/
void main()
{
duoxs a,b;
build(1,&a);
list_duoxs(&a);
show(&a);
build(2,&b);
list_duoxs(&b);
show(&a);
add(&a,&b);
show(&a);
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
zero_fn
2011-10-19 · TA获得超过2258个赞
知道小有建树答主
回答量:1173
采纳率:80%
帮助的人:456万
展开全部
void build(int i,duo_xs &pa) //这样的声明是C++的吧,
C语言应该是void build(int i,duo_xs *pa)

还有main的调用build(1,a);前只声明了指针a,没有申请实际存储空间,在build里就直接通过指针访问存储,肯定段访问异常。典型的野指针操作
追问
void build(int i,duo_xs &pa) 这个我是想用引用的。如果想调用build函数,而且需要这个函数获得的链表在后面各个函数都能用,应该怎么做呢?
追答
void build(int i,duo_xs *pa)        //c语言里没有引用,可以通过2级指针来直接修改一级指针。
{
if(NULL == (*pa = (dou_xs)molloc(sizeof(douxs)))) return;
...
(*pa)->coef=coefs;
(*pa)->exp=exps;
(*pa)->next=NULL;
....
}
调用时:
main()

dou_xs a; //douxs *a;
build(1,&a);
......

或者定义:
dou_xs build(int i)
{
dou_xs a;
a = molloc.......
......
return a ;
}
主函数
main()

dou_xs a;
a = build(1);
show(a);
...
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
shine1991
科技发烧友

2011-10-19 · 智能家居/数码/手机/智能家电产品都懂点
知道顶级答主
回答量:4.7万
采纳率:82%
帮助的人:2.3亿
展开全部
同学,你main里的指针duoxs *a,*b 那是野指针啊,怎么能够对野指针的指向赋值
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友c91e39c
2011-10-19 · 超过21用户采纳过TA的回答
知道答主
回答量:82
采纳率:0%
帮助的人:57.9万
展开全部
单步调试吧
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
liushengqia
2011-10-19
知道答主
回答量:47
采纳率:0%
帮助的人:14.3万
展开全部
软件会提醒你错误在第几行
追问
但关键是我的编译、链接都没显示问题,就是不能运行,不知道是哪有问题
追答
我也不太清楚。c语言学了都两年了,快忘完了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式