添加或遍历链接列表时出现问题

时间:2010-06-30 19:31:50

标签: c++ linked-list

我在添加或遍历链表时遇到问题。主项目类由另一个类使用,但我可以添加正确数量的这些,但看起来当我向列表添加更多数据时,应用程序不再有效。

我不确定错误的确切位置。我知道当我尝试遍历列表时,应用程序崩溃了。任何想法或任何改进将不胜感激。

我可以通过将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文件     #包括     使用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;
}

但我仍在崩溃。我正在尝试调试但不确定要寻找什么。

2 个答案:

答案 0 :(得分:0)

很难说出你的代码试图做什么。不幸的是,事实是,它离“工作”还很远。

以下是一些提示:

  • 重新考虑你的课程。什么是ItemItemOccurrence?链表是一个列表。它有物品。您应该将其命名为ListItem。如果需要,可以在代表Item的单个班级中执行此操作(List只是前端Item的特殊情况)。
  • 每个Item需要string(节点数据)和next(指向下一个节点的指针)。
  • 如果您使用List,则需要指向head(第一个Item)。
  • 需要存储placeInLine。只有在搜索插入新placeInLine
  • 的地方时才应使用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;
  • 是常见的

答案 1 :(得分:0)

代码有几个问题,但最值得注意的是,addOccurrence方法在创建myHead后没有为myHead设置myLink指针。我认为这是你在它上面的循环中尝试做的,但实际上代码似乎只是循环遍历现有列表并将其打印出来。您可能打算遍历该placeInLine次,然后在该级别更新myLink指针。目前还不清楚item和placeInLine之间的区别是什么,或者为什么你需要两者。你绝对不希望使用类名(如Item)作为整数变量。这增加了混乱。