2012-02-23 52 views
1

不久:我有两个代表多项式的线性链接列表。我必须乘以它们。我在这里写下了一切。唯一的问题是我在一条线上出现了分段错误(if(n.grad<r->a.grad) - 也在下面的代码中标出)。该程序中的分段错误

我试过这个程序在Borland和它的工作原理

在CodeBlocks或MinGW中,它只是崩溃。

#include <iostream> 

using namespace std; 

struct poli 
{ 
    int grad; 
    float coe; 
}; 
struct Nod 
{ 
    poli a; 
    Nod *adr; 
}; 
Nod *v,*sf,*v1,*vs,*vp; 
void add_first(Nod *&v, poli n) 
{ 
    if(v) 
    { 
     Nod *p; 
     p=new Nod; 
     p->a=n; 
     p->adr=v; 
     v=p; 
    } 
    else 
    { 
     v=new Nod; 
     sf=v; 
     v->a=n; 
     v->adr=0; 
    } 
} 
void add_last(Nod *&v, poli n) 
{ 
    if(!v) 
    { 
     v=new Nod; 
     v->a=n; 
     v->adr=0; 
    } 
    else 
    { 
     Nod *p,*sf; 
     sf=v; 
     while(sf->adr) 
      sf=sf->adr; 
     p=new Nod; 
     p->a=n; 
     p->adr=0; 
     sf->adr=p; 
     sf=p; 
    } 
} 
void add_before(Nod *v, int val, poli val_add) 
{ 
    Nod *p, *q; 
    if(v->a.grad==val) 
    { 
     p=new Nod; 
     p->a=val_add; 
     p->adr=v; 
     v=p; 
    } 
    else 
    { 
     p=v; 
     while(p->adr->a.grad!=val&&p->adr->adr) 
      p=p->adr; 
     if(p->adr->a.grad==val) 
     { 
      q=new Nod; 
      q->a=val_add; 
      q->adr=p->adr; 
      p->adr=q; 
     } 
    } 
} 
void produs(Nod *v, Nod *v1, Nod *&vp) 
{ 
    Nod *p,*q,*r; 
    int gasit; 
    poli n; 
    p=v; 
    while(p) 
    { 
     q=v1; 
     while(q) 
     { 
      n.grad=p->a.grad+q->a.grad; 
      n.coe=p->a.coe*q->a.coe; 
      r=vp; 
      gasit=0; 
      while(r) 
      { 
       if(n.grad==r->a.grad) 
       { 
        r->a.coe+=n.coe; 
        gasit=1; 
       } 
       r=r->adr; 
      } 
      if(!gasit) 
      { 
       r=vp; 
       if(n.grad<r->a.grad) /////////////// HERE I get the call stack 
        add_first(vp,n); 
       else 
       { 
        while(r->adr&&n.grad>r->adr->a.grad) 
         r=r->adr; 
        if(r->adr&&n.grad<r->adr->a.grad) 
         add_before(vp,r->adr->a.grad,n); 
        else 
         add_last(vp,n); 
       } 
      } 
      q=q->adr; 
     } 
     p=p->adr; 
    } 
} 
void tipar(Nod *v) 
{ 
    Nod *p; 
    p=v; 
    while(p) 
    { 
     cout<<"+"<<p->a.coe<<"x^"<<p->a.grad; 
     p=p->adr; 
    } 
} 
int main() 
{ 
    int n,m,i; 
    poli a; 
    cout<<"Cate elemente are polinomu' 1?"; 
    cin>>n; 
    for(i=0;i<n;i++) 
    { 
     cout<<"Baga gradu'"; 
     cin>>a.grad; 
     cout<<"Introdu-mi coe"; 
     cin>>a.coe; 
     add_last(v,a); 
     add_last(vs,a); 
    } 
    cout<<"Cate elemente are polinomu' 2?"; 
    cin>>m; 
    for(i=0;i<m;i++) 
    { 
     cout<<"Baga gradu'"; 
     cin>>a.grad; 
     cout<<"Introdu-mi coe"; 
     cin>>a.coe; 
     add_last(v1,a); 
    } 
    produs(v,v1,vp); 
    tipar(vp); 
    return 0; 
} 

这里是调用堆栈窗口内容:

#0 004016C4 produs (v=0x4d25a0, v1=0x4d26b8, [email protected]) at F:\Programe\ma ballz(23.02) (F:\Programe\suma polinom\main.cpp:142) 
#1 004019F2 main() at F:\Programe\ma ballz(23.02) (F:\Programe\suma polinom\main.cpp:195) 
+0

我不知道你是什么意思'获取调用堆栈'。你的意思是你得到了分段错误吗? – 2012-02-23 21:07:37

+0

是的。分段故障。 – 2012-02-23 21:08:33

+0

学习如何在代码块上进行调试,其漂亮http://wiki.codeblocks.org/index.php?title=Debugging_with_Code:Blocks – pyCthon 2012-02-23 21:10:10

回答

3

貌似vpNULL,或者垃圾,然后你做r = vp ...
大概是NULL,因为它没有陷入循环。 它有一个垃圾值,因为你永远不会用一个值初始化它。你只是在开始时声明它。

无论如何,你应该学会给你的变量赋予有意义的名字,这样它会更易读,因此可以维护。

+0

NULL或nullptr?还是0x0? :)或所有上述? :)) – 2012-02-23 21:15:49

+0

你还没有初始化它。因此,如果你在Debug中运行,那么编译器可能会用0填充它......在释放模式下,你会得到一个垃圾值(指针在内存中占用的一些随机值) – 2012-02-23 21:18:11

+0

通过定义'Nod * vp'指针得到值'0',所以没有垃圾。 – 2012-02-23 21:18:23