怎么会出这样的错误?

amator 2003-01-09 01:45:40
近日,编写一个链表的程序,源代码如下:
//item.h
#include <iostream>
using namespace std;
class listitem
{
public:

listitem(int val=0,listitem* ne=0);
int value(){ return _value;}
listitem *next(){return _next;}

private:
int _value;
listitem *_next;
};
listitem::listitem(int val,listitem *ne):_value(val)
{
cout<<_value;
if (!ne)
_next=0;
else {
_next=ne->_next;
ne->_next=this;
}
}
//list.h

#include <iostream>
#include "item.h"

class list
{
public:
list():_front(0),_end(0),_size(0){}
void insert_front(listitem *item);
void display();
private:
listitem *_front;
listitem *_end;
int _size;
};
void list::insert_front(listitem *item)
{
if (!_front){

_front=_end=item;
_size++;
}
else{
item=(*_front).next();
_front=item;
_size++;
}
}
void list::display()
{
listitem *item;
item=_front;
while( item!=_end)
{
cout<<(*item).value()<<endl;
item++;
}
}

//test.cpp

#include <iostream>
#include "list.h"

int main()
{
list mainlist;
int i;
for (i=0;i<20;i++)
mainlist.insert_front(new listitem(i));
mainlist.display();
return 0;
}

在.net环境下编译没有问题,但运行出现:“list.exe 中的 0x004325c6 处最可能的异常:0xC0000005: 读取位置 0x00000000 时发生访问冲突”的提示,不知道为什么?
...全文
16 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
amator 2003-01-09
  • 打赏
  • 举报
回复
谢谢大家的支持,我是刚开始学c++的,所以出现了很多的问题,谢谢大家!!
rushman 2003-01-09
  • 打赏
  • 举报
回复
粗略看了一下,不少问题
void list::insert_front(listitem *item)
{
if (!_front){

_front=_end=item;
_size++;
}
else{
//item=(*_front).next();item只是临时变量
item->next = _front;//而且你没有提供设置节点next的手段
_front=item;
_size++;
}
}
void list::display()
{
//首先链表不能为空
if(_front == 0)
return;
listitem *item;
item=_front;
//while( item!=_end)如果只有一个节点则无法遍历
do
{
cout<<(*item).value()<<endl;
//item++;
item = item->next();
}while(item != _end);
}
holydiablo 2003-01-09
  • 打赏
  • 举报
回复
恩恩
bccleem 2003-01-09
  • 打赏
  • 举报
回复
错误实在不少,尽量改一下,insert_front和display都有问题

#include <iostream>
using namespace std;
class listitem
{
public:
friend class list;
listitem(int val=0,listitem* ne=0);
int value(){ return _value;}
listitem *next(){return _next;}

private:
int _value;
listitem *_next;
};
listitem::listitem(int val,listitem *ne):_value(val)
{
cout<<_value;
if (!ne)
_next=0;
else {
_next=ne->_next;
ne->_next=this;
}
}
//list.h


class list
{
public:
list():_front(0),_end(0),_size(0){}
void insert_front(listitem *item);
void display();
private:
listitem *_front;
listitem *_end;
int _size;
};
void list::insert_front(listitem *item)
{
if (!_front){

// _front=_end=item;
_front = item; //new added
_end = _front->next(); //new added
_size++;
}
else{
// item=(*_front).next();
item->_next = _front; //new added
// _front=item;
_front = item; //new added
_size++;
}
}
void list::display()
{
listitem *item;
item=_front;
while( item!=_end)
{
cout<<(*item).value()<<endl;
// item++;
item = item->next(); //new added
}
}

int main()
{
list mainlist;
int i;
for (i=0;i<20;i++)
mainlist.insert_front(new listitem(i));
mainlist.display();
return 0;
}

我觉得你的逻辑很混乱,前后不一致,例如,永远采用new listitem(i)方式来construct listitem岂不让你定义的listitem的construction变得毫无意义,而且不定义destruction来释放分配的资源是c++的大忌
我试图按照你的逻辑重新写了一遍

#include <iostream>
using namespace std;
class listitem
{
public:
friend class list;
listitem(int val=0,listitem* ne=0);
int value(){ return _value;}
listitem *next(){return _next;}

private:
int _value;
listitem *_next;
};
listitem::listitem(int val,listitem *ne):_value(val)
{
cout<<_value;
if (!ne)
_next=0;
else {
_next = ne;
}
}
//list.h


class list
{
public:
list():_front(0),_end(0),_size(0){}
void insert_front(listitem *item);
void display();
~list()
{
listitem* p1;
listitem* p2;
p1 = _front;
while(p1!=_end) {
p2 = p1->next();
delete p1;
p1 = p2;
}
}

private:
listitem *_front;
listitem *_end;
int _size;
};
void list::insert_front(listitem *item)
{
if (!_front){
_front = item;
_end = _front->next();
_size++;
}
else{
_front = item;
_size++;
}
}
void list::display()
{
listitem *item;
item=_front;
while( item!=_end)
{
cout<<(*item).value()<<endl;
item = item->next();
}
}

int main()
{
list mainlist;
int i;
listitem *previous = 0,*current;
for (i=0;i<20;i++) {
current = new listitem(i,previous);
mainlist.insert_front(current);
previous = current;
}
cout<<"\noutput begin:\n";
mainlist.display();
return 0;
}


ginger 2003-01-09
  • 打赏
  • 举报
回复
gz
blh 2003-01-09
  • 打赏
  • 举报
回复
内存越界,跟一下吧,呵呵
else{
item=(*_front).next();
_front=item; //???? _front is set 0
_size++;
}

69,368

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧