| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 825 人关注过本帖
标题:读取内存的错误
只看楼主 加入收藏
lockhawk
Rank: 1
等 级:新手上路
帖 子:94
专家分:0
注 册:2008-9-17
收藏
 问题点数:0 回复次数:9 
读取内存的错误
在运行程序时出现这样的错误。当时已经输入一个结构。选择输出的时候就出现了这个错误
不明白是什么意思啊?

QQ截图未命名11.jpg (11.79 KB)
图片附件: 游客没有浏览图片的权限,请 登录注册
搜索更多相关主题的帖子: 内存 
2008-10-13 21:53
blueboy82006
Rank: 5Rank: 5
来 自:幻想世界
等 级:贵宾
威 望:16
帖 子:1227
专家分:57
注 册:2007-7-23
收藏
得分:0 
调试看一下呗~

2008-10-13 22:02
lockhawk
Rank: 1
等 级:新手上路
帖 子:94
专家分:0
注 册:2008-9-17
收藏
得分:0 
blueboy来了~~~不明白调式是怎么回事。能具体说一下么?点击取消后进入画面,箭头指向void showlist(node *head)里面的
cout<<pRead->data;这一句。


#include<iostream.h>
struct node
{
    char data;
    node * next;
};
node *great();
node *search(node * head,char keyword);
void Insert(node * &head,char keyword,char newword);
void Delete(node * &head,char keyword);
void showlist(node *head);
void destroy(node *node);
int main()
{
    char a,keyword,newword;
    node *head=NULL;
    int chance;
    do
    {
        cout<<"你要执行的操作:1,创建;2,读取;3,插入;4,删除;5,退出"<<endl;
        cin>>chance;
        switch(chance)
        {
        case 1:{if(head!=NULL) destroy(head);head=great();break;}
        case 2:{showlist(head);break;}
        case 3:{
            cout<<"你要插入的位置:";
            cin>>newword;
            Insert(head,keyword,newword);
            break;
               }
        case 4:{
        cout<<"你要删除的内容:"<<endl;
        cin>>keyword;
        Delete(head,keyword);
        break;
               }
        case 5:{
            destroy(head);
            break;
               }
default:cout<<"没有这个选项"<<endl;
        }
        cout<<"是否要继续?(Y/N)";
        cin>>a;
    }while(a=='Y'||a=='y');
    return 0;
}
node *great()
{
    node *head=NULL;
    head=new node;
  node *pEnd=head;
  node *ps;
  char temp;
  cout<<"请输入数据。以#号结束。"<<endl;
  do
  {
      cin>>temp;
      if(head==NULL)
      {
          head->data=temp;
          head->next=pEnd;
      }
      else
      {
          ps=new node;
          ps->data=temp;
          pEnd->next=ps;
          pEnd=ps;
      }
  }while(temp!='#');
  return head;
}
node *search(node *head,char keyword)
{
    node *pRead=head;
    while(pRead!=NULL)
    {
        if(pRead->data==keyword)
            return pRead;
        pRead=pRead->next;
    }
    return NULL;
}
void showlist(node *head)
{
    node *pRead=head;
    cout<<"连表内的数据是:";
    while(pRead!=NULL)
    {
        cout<<pRead->data;                 //////////////////调式的时候指向这一句
        pRead=pRead->next;
    }
    cout<<endl;
}
void Insert(node * &head,char keyword,char newword)
{
node *newnode=new node;
newnode->data=newword;
node *pGuard=search(head,keyword);
if(head==NULL||pGuard==NULL)
{
    newnode->next=head;
    head=newnode;
    return;
}
newnode->next=pGuard->next;
pGuard->next=newnode;
}
void Delete(node * &head,char keyword)
{
    node *pGuard=head;
    node *p;
    if(head!=NULL)
    {
        if(head->data=keyword)
        {
            p=head;
            head=head->next;
            delete p;
            cout<<"已经删除:"<<keyword<<endl;
            return;
        }
        else
        {
            while(pGuard->next!=NULL)
            {
            if(pGuard->next->data=keyword)
            {
                p=pGuard->next;
                pGuard->next=p->next;
                delete p;
                cout<<"已经删除:"<<keyword<<endl;
                return;
            }
            pGuard=pGuard->next;
            }
        }
        
    }
cout<<"你要删除的数据不存在或者连表是空"<<endl;
}
void destroy(node *head)
{
    node *p;
    while(head!=NULL)
    {
        p=head;
        head=head->next;
        delete p;
    }
    cout<<"连表已删除"<<endl;
}

人生最大痛苦:虽然不明白你们说什么,但还是要听!
2008-10-13 22:18
blueboy82006
Rank: 5Rank: 5
来 自:幻想世界
等 级:贵宾
威 望:16
帖 子:1227
专家分:57
注 册:2007-7-23
收藏
得分:0 
嗯,要断电了,没看全...
就看到你的创建链表函数,
就觉得有问题...
你想一下,你的链表中的NULL在哪?
明天有时间再接着看...
你先自己想下,加断点调试一下吧...

2008-10-13 23:23
blueboy82006
Rank: 5Rank: 5
来 自:幻想世界
等 级:贵宾
威 望:16
帖 子:1227
专家分:57
注 册:2007-7-23
收藏
得分:0 
great是什么?
应该是creat吧...

2008-10-13 23:24
lockhawk
Rank: 1
等 级:新手上路
帖 子:94
专家分:0
注 册:2008-9-17
收藏
得分:0 
回复 5# blueboy82006 的帖子
great应该是creat.英语不太好
我反反复复看过很多遍了。真不明白。我是对着书本写的,不知道哪里出错。
下面这个也是连表的,也是出现类似的错误。关于连表我就没写成功过一个。
#include "iostream.h"
struct node
{
    char data;
    node *next;
};
void add(node * &head,node * &pEnd,char newword);
void repeal(node * &head,node * &pEnd);
void showlist(node *head);
void Destroy(node * &head);
int main()
{
    node *head=NULL;
    node *pEnd=head;
    char a;
    cout<<"请输入指令:"<<endl;
    cin>>a;
    while(a!='#')
    {
        if(a!='$') add(head,pEnd,a);
        if(a=='$') repeal(head,pEnd);
    }
    if(a=='#') showlist(head);
    Destroy(head);
    return 0;
}
void add(node * &head,node * &pEnd,char newword)
{
    if(head==NULL)
    {
        head->data=newword;                        /////////////调试时指向这里
        pEnd=head->next;
    }
    else
    {
        pEnd=pEnd->next;
        pEnd->data=newword;
    }
}
void repeal(node * &head,node * &pEnd)
{
    if(head==NULL) cout<<"Errer"<<endl;
    node * ps=head;
    while(ps->next!=pEnd)
    {
        ps=ps->next;
    }
    node *p=pEnd;
    pEnd=ps;
    pEnd->next=NULL;
    delete p;
}
void showlist(node *head)
{
    cout<<"用户的实际操作是:"<<endl;
    node *p=head;
    while(p!=NULL)
    {
        cout<<head->data;
        p=p->next;
    }
    cout<<endl;
}
void Destroy(node * &head)
{
    node *p=head;
    while(head!=NULL)
    {
        p=head;
        head=head->next;
        delete p;
    }
}

人生最大痛苦:虽然不明白你们说什么,但还是要听!
2008-10-14 00:09
blueboy82006
Rank: 5Rank: 5
来 自:幻想世界
等 级:贵宾
威 望:16
帖 子:1227
专家分:57
注 册:2007-7-23
收藏
得分:0 
回复 6# lockhawk 的帖子
兄弟,你错误犯大的了...
你根本就没有为你的结点分配空间嘛 ...

2008-10-14 12:22
debroa723
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:23
帖 子:862
专家分:1954
注 册:2008-10-12
收藏
得分:0 
while(pRead!=NULL)
    {
        cout<<pRead->data;                 //////////////////调式的时候指向这一句
        pRead=pRead->next;
    }
这里pRead为非法指针,原因是showlist(node *head)传入了一个非法指针. 这个非法指针得来原因是
destroy(node *head)里 delete p;后没有赋NULL,因为传入参数这时被删除了,却不赋NULL,就使用指针变成了非法指针,0xcdcdcdcd.非法指针是会通才(head!=NULL)的判定的.
great函数里的


if(head==NULL)
    {
        head->data=newword;                        /////////////调试时指向这里
        pEnd=head->next;
    }
head都是NULL了,空指针调用->运算符肯定会失败.
2008-10-14 23:07
braveboy2008
Rank: 1
等 级:新手上路
威 望:1
帖 子:21
专家分:0
注 册:2008-10-14
收藏
得分:0 
在创建链表时
if (head == NULL)   //表示链表中没有结点
{
  head = pEnd = new node;       //创建一个新结点头尾指针都指向同一个结点
  head->data = newword;
}
后面的都差不多但在创建完链表后应该使尾指针指向NULL 即:pEnd->next = NULL;
2008-10-14 23:37
冰烨
Rank: 1
来 自:不咔界
等 级:新手上路
威 望:1
帖 子:135
专家分:0
注 册:2007-10-30
收藏
得分:0 
指针指针。。。。

要么死去,要么奋斗!
2008-10-15 09:22
快速回复:读取内存的错误
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.031829 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved