【发布时间】:2013-11-01 21:49:04
【问题描述】:
我正在使用 c++ 来实现单个整数链接列表。我的程序只是要求用户用 5 个整数填充列表,然后程序应该删除任何偶数并在删除后打印列表。
这是我的代码:
#include <iostream>
using namespace std;
class IntSLLNode
{
public:
IntSLLNode() { next = 0; }
IntSLLNode(int i, IntSLLNode *ptr = 0)
{
info = i;
next = ptr;
}
int info;
IntSLLNode *next;
};
class IntSLList
{
public:
IntSLList() {head = tail =0; }
void AddToTail(int);
void DeleteNode(int);
void DisplayList();
void deleteEven();
IntSLLNode * getHead()
{
return head;
}
private:
IntSLLNode *head, *tail;
};
void IntSLList::AddToTail(int el)
{
if (tail != 0) // if list not empty;
{ tail->next = new IntSLLNode(el);
tail = tail->next;
}
else
head = tail = new IntSLLNode(el);
}
void IntSLList::deleteEven()
{
IntSLLNode *current;
current=head;
int num;
while (current!=0)
{
num=current->info;
current=current->next;
if(num%2==0)
{
DeleteNode(num);
}
}
}
void IntSLList::DeleteNode(int el)
{
if(head !=0)
if(head==tail && el==head->info)
{
delete head;
head=tail=0;
}
else if(el==head->info)
{
IntSLLNode *tmp=head;
head=head->next;
delete tmp;
}
else
{
IntSLLNode *pred, *tmp;
for(pred=head, tmp=head->next;
tmp!=0 && !(tmp->info==el);
pred=pred->next, tmp=tmp->next);
if(tmp!=0)
{
pred->next=tmp->next;
if(tmp==tail)
tail=pred;
delete tmp;
}
}
}
void IntSLList::DisplayList()
{
IntSLLNode *current;
current=head;
if(current==0)
cout<<"Empty List!";
while (current!=0)
{
cout<<current->info<<" ";
current=current->next;
}
}
我在 ex4.exe 中的 0x002c1744 处遇到未处理的异常:0xC0000005: 声明 int num=current->info 中的访问冲突读取位置 0xfeeefeee;谁能建议如何解决这个问题?
【问题讨论】:
-
也许您的代码需要正确格式化?
-
将该错误视为一个不那么微妙的提示,即指针
current中保存的地址被取消引用是虚假的。现在在你的代码中向后走,看看你是否能看到它是怎么回事。考虑一下您的DeleteNode函数做了什么,以及它可能对该函数的调用者 意味着什么,在本例中为deleteEven()。当DeleteNode()返回并且您又回到deleteEven()时,您认为current指的是什么? -
num=current->info线路在哪里? -
0xfeeefeee 表示您正在访问已释放的指针:stackoverflow.com/questions/127386/…
-
删除的时候好像没必要再找int了,为什么不直接把指针传给DeleteNode呢?