链表发生读取访问权限冲突

ramshadom 2016-05-16 05:49:51
刚开始学链表,写了一个非递减单链表。但是出错了,po个出错图吧


我觉得好像是头结点的问题,下面po我写的程序吧
#include<iostream>
using namespace std;
struct List
//构建构建新节点的结构体
//非递减顺序排列
{
int data;
List * next;
};

void insert(List * & headnode, int num)
{
List *s, *p = headnode, *q; //*s用于建立新节点 *p用于跟踪最新结点
//以下三行为构建新结点
s = new List;
s->data = num;
s->next = NULL;

//以下if语句用于插入第一个结点
if (p->next == NULL)
{
headnode->next = s;
p = s;
return;
}

//新节点数据最小时的操作
if (headnode->next->data > s->data)
{
s->next = headnode->next;
headnode->next = s;
return;
}

//常规对比插入排序
for (q = headnode->next, p = headnode->next->next; p; q = p, p = p->next)
{
if (p->data >= s->data)
{
s->next = p;
q->next = s;
return;
}
}
q->next = s;
return;
}

void ShowList(const List * headnode)
{
cout << "您所输入的数为:";
while (headnode)
{
cout << headnode->data << '\t';
headnode = headnode->next;
}
cout << endl;
}
int main()
{
int k = 0, m = 0; //k用于输入新数据 m用于计算节点数
List * headnode = NULL;
cout << "请输入除零以外的任何数" << endl;
cin >> k;
while (k != 0)
{
insert(headnode, k);
cin >> k;
m++;
headnode->data = m;
}
ShowList(headnode); //输出链表
}


在下先向大神谢过,请赐教
...全文
767 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
sty_app 2016-05-16
  • 打赏
  • 举报
回复
引用 7 楼 ramshadom 的回复:
[quote=引用 6 楼 sty_app 的回复:] [quote=引用 5 楼 ramshadom 的回复:] [quote=引用 4 楼 qq423399099 的回复:] 这个是带头结点的……
谢谢,编译成功了,问题就是出在没有用“new”来动态分配内存上面,那么我还想请教一下为什么不建立头节点的时候不用动态分配内存没问题,建立了头结点就需要动态分配内存呢?[/quote] 头结点不分配内存,你从哪里开始找链表呢?[/quote] 好有道理……囧…… 谢谢啦!也十分感谢您所说的:“代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。” 我会加油&少问些自己能够调试解决的问题的![/quote] 有问题产生是好事,凡事犯过一次错就尽量学习,下次不再犯,这样才是提高
ramshadom 2016-05-16
  • 打赏
  • 举报
回复
引用 6 楼 sty_app 的回复:
[quote=引用 5 楼 ramshadom 的回复:] [quote=引用 4 楼 qq423399099 的回复:] 这个是带头结点的……
谢谢,编译成功了,问题就是出在没有用“new”来动态分配内存上面,那么我还想请教一下为什么不建立头节点的时候不用动态分配内存没问题,建立了头结点就需要动态分配内存呢?[/quote] 头结点不分配内存,你从哪里开始找链表呢?[/quote] 好有道理……囧…… 谢谢啦!也十分感谢您所说的:“代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。” 我会加油&少问些自己能够调试解决的问题的!
sty_app 2016-05-16
  • 打赏
  • 举报
回复
引用 5 楼 ramshadom 的回复:
[quote=引用 4 楼 qq423399099 的回复:] 这个是带头结点的……
谢谢,编译成功了,问题就是出在没有用“new”来动态分配内存上面,那么我还想请教一下为什么不建立头节点的时候不用动态分配内存没问题,建立了头结点就需要动态分配内存呢?[/quote] 头结点不分配内存,你从哪里开始找链表呢?
ramshadom 2016-05-16
  • 打赏
  • 举报
回复
引用 4 楼 qq423399099 的回复:
这个是带头结点的……
谢谢,编译成功了,问题就是出在没有用“new”来动态分配内存上面,那么我还想请教一下为什么不建立头节点的时候不用动态分配内存没问题,建立了头结点就需要动态分配内存呢?
小灸舞 2016-05-16
  • 打赏
  • 举报
回复
这个是带头结点的

#include<iostream>
using namespace std;
struct List
    //构建构建新节点的结构体
    //非递减顺序排列
{
    int data;
    List * next;
};
  
void insert(List * & headnode, int num)
{
    List *s, *p = headnode, *q;   //*s用于建立新节点 *p用于跟踪最新结点
                                  //以下三行为构建新结点
    s = new List;
    s->data = num;
    s->next = NULL;
  
    //以下if语句用于插入第一个结点
	if (p->next == NULL)
    {
		headnode->next = s;
        //p = s;
        return;
    }
  
    //新节点数据最小时的操作
    if (headnode->next->data > s->data)
    {
        s->next = headnode->next;
        headnode->next = s;
        return;
    }
  
    //常规对比插入排序
    for (q = headnode->next, p = headnode->next->next; p; q = p, p = p->next)
    {
        if (p->data >= s->data)
        {
            s->next = p;
            q->next = s;
            return;
        }
    }
    q->next = s;
    return;
}
  
void ShowList(const List * headnode)
{
    cout << "您所输入的数为:";
	headnode = headnode->next;
    while (headnode)
    {
		
        cout << headnode->data << '\t';
        headnode = headnode->next;
    }
    cout << endl;
}
int main()
{
    int k = 0, m = 0;  //k用于输入新数据 m用于计算节点数
    List * headnode = new List;
	headnode->next = NULL;
    cout << "请输入除零以外的任何数" << endl;
    cin >> k;
    while (k != 0)
    {
        insert(headnode, k);
        cin >> k;
        //m++;
        //headnode->data = m;
    }
    ShowList(headnode);  //输出链表
}
ramshadom 2016-05-16
  • 打赏
  • 举报
回复
引用 2 楼 qq423399099 的回复:
insert函数里有点问题,帮楼主改掉了,现在应该没错了,链表既然是没有头结点的,就没有必要从->next开始 …… 崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止。 代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒:再牛×的老师也无法代替学生自己领悟和上厕所! 单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。
十分感谢最后的您给的“程序员必备技能”。关于代码部分呢,其实我是想设立头结点的……不设立头结点的单链表早已经实现了。所以,可以再帮忙看一下吗?这段代码自己已经想了一个星期了。
小灸舞 2016-05-16
  • 打赏
  • 举报
回复
insert函数里有点问题,帮楼主改掉了,现在应该没错了,链表既然是没有头结点的,就没有必要从->next开始

#include<iostream>
using namespace std;
struct List
    //构建构建新节点的结构体
    //非递减顺序排列
{
    int data;
    List * next;
};
 
void insert(List * & headnode, int num)
{
    List *s, *p = headnode, *q;   //*s用于建立新节点 *p用于跟踪最新结点
                                  //以下三行为构建新结点
    s = new List;
    s->data = num;
    s->next = NULL;
 
    //以下if语句用于插入第一个结点
    if (p == NULL)
    {
        headnode = s;
        //p = s;
        return;
    }
 
    //新节点数据最小时的操作
    if (headnode->data > s->data)
    {
        s->next = headnode;
        headnode = s;
        return;
    }
 
    //常规对比插入排序
    for (q = headnode, p = headnode->next; p; q = p, p = p->next)
    {
        if (p->data >= s->data)
        {
            s->next = p;
            q->next = s;
            return;
        }
    }
    q->next = s;
    return;
}
 
void ShowList(const List * headnode)
{
    cout << "您所输入的数为:";
    while (headnode)
    {
        cout << headnode->data << '\t';
        headnode = headnode->next;
    }
    cout << endl;
}
int main()
{
    int k = 0, m = 0;  //k用于输入新数据 m用于计算节点数
    List * headnode = NULL;
    cout << "请输入除零以外的任何数" << endl;
    cin >> k;
    while (k != 0)
    {
        insert(headnode, k);
        cin >> k;
        //m++;
        //headnode->data = m;
    }
    ShowList(headnode);  //输出链表
}
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止。 代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒:再牛×的老师也无法代替学生自己领悟和上厕所! 单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。
paschen 2016-05-16
  • 打赏
  • 举报
回复
点中断,然后通过调用堆栈、变量窗口等观察分析原因

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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