2010-06-30 77 views
1

我遇到了添加或遍歷鏈接列表的問題。主項目類被另一個類使用,但我可以添加正確的這些類,但是看起來像我向列表添加更多數據時,應用程序不再有效。添加或遍歷鏈接列表的問題

我不確定錯誤的確切位置。我知道當我嘗試遍歷列表時,應用程序崩潰。任何想法或任何改進將不勝感激。

我可以通過將AddOccurence方法更改爲不執行while循環來使崩潰不發生。

做的

void Item::AddOccurence(int Item,int placeInLine){ 
    ItemOccurence* ocr=myHead; 
    if(ocr) 
    { 

    } 

代替

void Item::AddOccurence(int Item,int placeInLine){ 
    ItemOccurence* ocr=myHead; 
    while(ocr) 
    { 

    } 

基本上打的第一個節點,但沒有更多。

我有一個包含列表的對象。 這裏是.h文件 #include using namespace std;

class ItemOccurence{ 
public: 
    ItemOccurence(int line,int placeInLine,ItemOccurence* link=NULL) :myLine(line),myPlaceInLine(placeInLine),myLink(link){} 

    int myLine; 
    int myPlaceInLine; 
    ItemOccurence* myLink; 
}; 

class Item { 
public: 
    Item(); 
    Item(string Item,int line,int placeInLine); 
    virtual ~Item(); 
    void deallocate(ItemOccurence* p); 
    void AddOccurence(int Item,int placeInLine); 
    string myItem; 
    ItemOccurence* myHead; 
private: 
    bool isEmpty(); 
}; 

和.cpp文件

#include "Item.h" 
#include <string> 
#include<iostream> 
using namespace std; 
Item::Item(string Item,int line,int placeInLine):myHead(NULL){ 
    myItem=Item; 

    myHead= new ItemOccurence(line,placeInLine,NULL); 
} 

Item::Item():myHead(NULL){ 
myHead=0; 
} 

Item::~Item() { 
    deallocate(myHead); 
    myHead=0; 
} 

void Item::deallocate(ItemOccurence* p){ 
    ItemOccurence* tmp; 
    while(p){ 
     tmp=p; 
     p=p->myLink; 
     delete tmp; 
    } 
} 

void Item::AddOccurence(int Item,int placeInLine){ 
    ItemOccurence* ocr=myHead; 
    while(ocr) 
    { 
      cout<<"orrucence head while adding " << myHead->myLine << " " << myHead->myPlaceInLine <<"\n"; 
     ocr=ocr->myLink; 
    } 

    myHead = new ItemOccurence(Item,placeInLine,myHead); 

    return; 
} 

bool Item::isEmpty(){ 
    if(myHead) 
     return false; 
    else 
     return true; 
} 

編輯: 我更新AddOccurence是。

void Item::AddOccurence(int line,int placeInLine){ 
    ItemOccurence* prev = myHead; 
    ItemOccurence* curr = myHead->myLink; 

    while(curr){ 
     prev=curr; 
     curr=curr->myLink; 
     } 

    // insert new ItemOccurence 
    cout<<"adding " <<line<< " and " << placeInLine <<"\n"; 
    prev->myLink = new ItemOccurence(line,placeInLine); 

    return; 
} 

但我仍然崩潰。我試圖調試但不知道要尋找什麼。

+0

有沒有不使用'std :: list'或'boost :: intrusive'的原因? – pmr 2010-06-30 19:35:09

+2

@pmr只有一個原因:教育。 – Andrey 2010-06-30 19:39:04

+0

你是否意識到你在每個構造函數中初始化myHead兩次?這並不重要,但是你將它設置爲NULL或0也不一致。兩種方式都有爭論,但你至少應該保持一致。 – RickNotFred 2010-06-30 20:00:05

回答

0

很難說出你的代碼試圖做什麼。不幸的是,實際情況是,這與「工作」相去甚遠。

下面是一些提示:

  • 重新考慮你的類。什麼是ItemItemOccurrence?鏈表是一個列表。它有物品。您應該將其命名爲ListItem。如果你願意,你可以在代表ItemList只是Item前面的一個特例)的單個班級中做到這一點。
  • 每個Item需要一個string(節點數據)和一個next(指向下一個節點的指針)。
  • 如果使用List,它需要指向head(第一個Item)。
  • 不需要需要存儲placeInLineplaceInLine只能在搜索插入新的Item時使用。
  • 目前還不清楚ItemOccurrence::myLine應該代表什麼。
  • 初始化myHead(NULL)時,不需要將其設置爲0
  • isEmpty()通常不是private方法。
  • 添加節點的算法是:
    • 循環直到找到需要插入的位置。
      • 它看起來像你需要檢查兩件事情:「列表結束」和「placeInLine」
    • new_node->next = current->next->next節點。
    • 設置current->next = new_node節點。
    • 請注意current->nextNULL的特殊情況。
  • 相反的if (x) return true; else return false;,這是常見的return x;
0

沒有與代碼中的幾個問題,但最值得注意的是它創建後,您addOccurrence方法不設置myLink的指針myHead。我認爲這就是你在上面的循環中要做的事情,但實際上,代碼似乎只是遍歷現有的列表並打印出來。您可能打算循環遍歷該位置,然後在該級別更新myLink指針。目前還不清楚item和placeInLine之間有什麼不同,或者你爲什麼需要這兩者。你絕對不想使用類名(如Item)作爲整數變量。這增加了混亂。