我在添加或遍历链表时遇到问题。主项目类由另一个类使用,但我可以添加正确数量的这些,但看起来当我向列表添加更多数据时,应用程序不再有效。
我不确定错误的确切位置。我知道当我尝试遍历列表时,应用程序崩溃了。任何想法或任何改进将不胜感激。
我可以通过将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;
}
但我仍在崩溃。我正在尝试调试但不确定要寻找什么。
答案 0 :(得分:0)
很难说出你的代码试图做什么。不幸的是,事实是,它离“工作”还很远。
以下是一些提示:
Item
和ItemOccurrence
?链表是一个列表。它有物品。您应该将其命名为List
和Item
。如果需要,可以在代表Item
的单个班级中执行此操作(List
只是前端Item
的特殊情况)。Item
需要string
(节点数据)和next
(指向下一个节点的指针)。List
,则需要指向head
(第一个Item
)。placeInLine
。只有在搜索插入新placeInLine
。Item
ItemOccurrence::myLine
应该代表什么。myHead(NULL)
时,您无需将其设置为0
。isEmpty()
通常不是private
方法。 new_node->next = current->next->next
节点。current->next = new_node
节点。current->next
为NULL
。if (x) return true; else return false;
,return x;
答案 1 :(得分:0)
代码有几个问题,但最值得注意的是,addOccurrence方法在创建myHead后没有为myHead设置myLink指针。我认为这是你在它上面的循环中尝试做的,但实际上代码似乎只是循环遍历现有列表并将其打印出来。您可能打算遍历该placeInLine次,然后在该级别更新myLink指针。目前还不清楚item和placeInLine之间的区别是什么,或者为什么你需要两者。你绝对不希望使用类名(如Item)作为整数变量。这增加了混乱。