2015-10-19 40 views
-1

我是創建鏈表,現在我有問題,當我想在我的列表中找到特定數據:例如我插入我的列表200 000字符串,當我打電話list-> at 1)(1個id的列表最後一個字符串)我得到段錯誤,如果我叫列表 - >在(100 000)它的工作完美 我的代碼是:C++鏈表大電話號碼分段錯誤

stringList.h:

#ifndef STRINGLIST_H 
#define STRINGLIST_H 
#include <iostream> 
#include <string> 
using namespace std; 

class stringList 
{ 
    public: 
     stringList(); 
     virtual ~stringList(); 
     void insert(string *newString); 
     void insert(string newString); 
     int size(); 
     string at(int poz); 
     void display(); 
     void clear();  
    protected: 
    private: 
     string* atP(int *poz); 
     stringList *itsList; 
     string *itsString; 
     int *sizeString; 
     string *buff; 
     //staticint *sizeString; 
     int *itsPoz; 
}; 

#endif // STRINGLIST_H 

stringList.cpp:

#include "stringList.h"  
stringList::stringList() 
{ 
    itsList=0; 
    itsString=0; 
    sizeString=0;  
    itsPoz=new int(0); 
    buff=new string; 
}  
stringList::~stringList() 
{ 
    delete sizeString; 
    sizeString=0; 
    delete itsPoz; 
    itsPoz=0; 
    delete buff; 
    buff=0; 
    delete itsString; 
    itsString=0; 
} 
void stringList::insert(string *newString){ 
    if(!sizeString){  
     sizeString=new int(0); 
    }  
    if(!sizeString){ 
     sizeString=new int(0); 
    }  
    stringList *newList=new stringList; 
    stringList *tmp=new stringList; 
    if(itsList){ 
     *sizeString=*itsList->itsPoz+1;  
     tmp=this->itsList; 
     this->itsList=newList; 
     this->itsList->itsString=newString; 
     *this->itsList->itsPoz=*sizeString; 
     this->itsList->itsList=tmp;  
    }else{ 
     this->itsList=newList; 
     this->itsList->itsString=newString; 
     *this->itsList->itsPoz=0;  
    }  
} 
void stringList::insert(string newString){  
    string *p_string=new string; 
    if(!sizeString){ 
     sizeString=new int(0); 
    }  
    *p_string=newString; 
    stringList *newList=new stringList; 
    stringList *tmp=new stringList; 
    if(itsList){ 
     *sizeString=*itsList->itsPoz+1;  
     tmp=this->itsList; 
     this->itsList=newList; 
     this->itsList->itsString=p_string; 
     *this->itsList->itsPoz=*sizeString; 
     this->itsList->itsList=tmp;  
    }else{ 
     this->itsList=newList; 
     this->itsList->itsString=p_string; 
     *this->itsList->itsPoz=0; 
    }  
}  
int stringList::size(){ 
    if(sizeString) 
    return *sizeString+1; 
    else 
     return 0; 
} 
string stringList::at(int poz){  
    if(!sizeString){ 
      return "NEMA LISTE";  
    } 
    if(poz>*sizeString){ 
     return ""; 
    }  
    buff=this->atP(&poz); 
    return *buff;  
} 
string* stringList::atP(int *poz){  
    if(*this->itsList->itsPoz==*poz){  
      return this->itsList->itsString;  
    } 
    else{  
     return this->itsList->atP(poz);  
    }  
} 
void stringList::display(){  
    if(this->itsList){ 
     this->itsList->display(); 
    } 
    if(itsString){ 
     cout<<*itsString<<" , "<<*itsPoz<<endl;  
    }  
} 
void stringList::clear(){  
     if(this->itsList->itsList){ 
      this->itsList->clear(); 
     } 
     delete itsList; 
     delete sizeString; 
     sizeString=0; 
     itsList=0; 
} 
+0

我建議您在這裏發佈代碼時,刪除多個連續的空白行。我讓更多的滾動查看整個代碼。 – crashmstr

+0

當你有段錯誤時,應該生成一個核心文件。你可以看看這個核心文件(在linux上,它是用gdb完成的),看看它在哪裏做核心。 – SergeyA

+0

有沒有一個很好的理由,不要使用std :: list,並重新發明輪子,但這次是方形的嗎? – cdonat

回答

0

我會添加靜態成員:指向第一個和最後一個元素的指針。他們對許多事情都是有用的

什麼樣的呃segmetation故障呢?執行保護模式會在線程嘗試訪問尚未獲得明確權限的內存時產生?

如果nr 2,那麼代碼中存在一個錯誤。檢查範圍和類似的東西。

你想看到一個簡單的鏈表,我會寫在FL上工作好嗎?

+0

爲什麼地球上這些是靜態的?這將阻礙使用多個列表。 – crashmstr

+0

是的,你說得對。使它們不是靜態的,並確保它們只在合適時才設置,例如,如果listen是tom和m_pRoot = NULL。 –

+0

當我調用stringList.at(大於174600的數字)時,我得到了分段錯誤,當數字越小,這個工作就越完美,但是如果比較大,那麼我會得到分段錯誤。 –

0

stringList::at你打電話給stringList::atP它叫stringList::at。這會導致遞歸,並且很可能是堆棧溢出,然後使用段錯誤終止程序。你可能會沿着

list = this; 
do { 
    if (itsPoz==poz) { /* found */ } 
} while (list = this->itsList); 

線更改爲迭代的方式,東西,但是代碼有很多其他問題(永遠不會做using namespace std;在全球範圍內的頭,你顯然是不存儲指針的所有權保證(即唱歌智能指針)等)

+0

我的函數在調用atp和atp是遞歸調用它自己。我使用該函數傳遞指針而不是值。 謝謝 –

+0

是的,你遞歸併超過了堆棧,所以在某些時候超過了堆棧,不能進一步遞歸。所以要麼限制列表的長度,要麼不使用遞歸。 – johannes