2012-02-23 43 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