指针赋不了值,求大神

qq_25681289 2015-11-16 08:05:34
如下,写了模拟链表的函数,若直接写insert(1),程序运行成功,但若int a=0;cin>>a;insert(a)则程序会崩溃,单步调试发现执行到showlist()中绿字处,无法给p赋值。求大神帮助!代码是助教上课当场写的,老师看了没问题,不知道为什么换了cin就会出粗,若直接insert(1)单步调试时指针能赋值。

#include <iostream>
using namespace std;

void showList();

struct Node{
int val;
Node* next;
};

struct Node* head = NULL;

//从小到大排序插入
void insert(int val){
Node* node = new Node;
node->val = val;
node->next= NULL;

if(!head){
head = node;
}else if(head->val > val){
node->next = head;
head = node;
}else{
Node* q = head->next;
while(q->next && q->next->val < val)
q = q->next;

node->next = q->next;
q->next = node;
}

showList();
}

void deleteNode(int val){
Node* p = head;

if(!head){
return;
}else if(head->val == val){
head = head->next;
delete p;
}else{
while(p->next && p->next->val != val)
p = p->next;

if(p->next){
Node* q = p->next;
p->next = p->next->next;
delete q;
}
}

showList();
}

void releaseList(){
while(head){
Node* p = head;
head = head->next;
delete p;
}
}

void showList(){
Node* p = head;
while(p){
cout << p << ", " << p->val << ", " << p->next << endl;
[color=#FFFF00] p = p->next;[/color]

}
cout << endl;
}

int main(){
int a=0;
cin>>a;
insert(a);
insert(3);

//直接下面可行,加入cin出错
/*
insert(4);
insert(3);
insert(6);
insert(5);

deleteNode(3);
deleteNode(5);
deleteNode(6);
deleteNode(7);
deleteNode(4);

releaseList();
*/
return 0;
}
...全文
218 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_30409783 2015-12-06
  • 打赏
  • 举报
回复
楼主不厚道啊。帮你找问题,写代码,一点分都不给。
qq_25681289 2015-11-18
  • 打赏
  • 举报
回复
[quote=引用 7 楼 ID870177103 的回复:] Node* q = head->next; while(q->next && q->next->val < val) q = q->next; head->next==null的情况呢 这种问题用debugger一看就知道了吧,看代码的话的确很难看出问题[/quote 太感人了,就是这个原因呢,之前自己也想过head->next==null的情况,但是因为是助教写的代码就以为肯定正确,只从自己写的main里找原因....以后不管谁写的代码觉得有疑问一定要继续思考呀
赵4老师 2015-11-17
  • 打赏
  • 举报
回复
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止。
paschen 版主 2015-11-17
  • 打赏
  • 举报
回复
我帮你试了下,可以正常运行 你重新建一个工程试一下,如果还不行,贴出错误代码
ID870177103 2015-11-17
  • 打赏
  • 举报
回复
Node* q = head->next; while(q->next && q->next->val < val) q = q->next; head->next==null的情况呢 这种问题用debugger一看就知道了吧,看代码的话的确很难看出问题
qq_20515431 2015-11-17
  • 打赏
  • 举报
回复
输入的A是什么值?
looklzg1108 2015-11-17
  • 打赏
  • 举报
回复
VS2010用楼主一楼的代码运行,正常。
qq_30409783 2015-11-17
  • 打赏
  • 举报
回复
红色字体处的问题,代码如下: #include <iostream> using namespace std; void showList(); struct Node { int val; Node* next; }; struct Node* head = NULL; //从小到大排序插入 void insert(int val) { Node* node = new Node; node->val = val; node->next = NULL; if (!head) { head = node; } else if (head->val > val) { node->next = head; head = node; } else { Node* q = head; while (q->next && q->next->val < val) q = q->next; node->next = q->next; q->next = node; } showList(); } void deleteNode(int val) { Node* p = head; if (!head) { return; } else if (head->val == val) { head = head->next; delete p; } else { while (p->next && p->next->val != val) p = p->next; if (p->next) { Node* q = p->next; p->next = p->next->next; delete q; } } showList(); } void releaseList() { while (head) { Node* p = head; head = head->next; delete p; } } void showList() { Node* p = head; while (p) { cout << p << ", " << p->val << ", " << p->next << endl; p = p->next; } cout << endl; } int main() { int a = 0; cin >> a; insert(a); insert(3); //直接下面可行,加入cin出错 /* insert(4); insert(3); insert(6); insert(5); deleteNode(3); deleteNode(5); deleteNode(6); deleteNode(7); deleteNode(4); releaseList(); */ return 0; }
paschen 版主 2015-11-16
  • 打赏
  • 举报
回复
给个会崩的代码,我帮你看下
qq_25681289 2015-11-16
  • 打赏
  • 举报
回复
引用 1 楼 paschen 的回复:
帮你main中的注释去了后我运行了下,没问题,代码没仔细看
我用vc6 vs2010 和mingw运行都绷了,.exe 中的 0x00ed156c 处有未经处理的异常: 0xC0000005: 读取位置 0x00000004 时发生访问冲突
qq_25681289 2015-11-16
  • 打赏
  • 举报
回复
引用 2 楼 qq_25681289 的回复:
单步调试到 p = p->next 的时候会报这个错
这个时候p的地址是0X8A3098 P->NEXT是0x0,p = p->next 就是赋值不上去,然后报错
qq_25681289 2015-11-16
  • 打赏
  • 举报
回复


单步调试到 p = p->next 的时候会报这个错
paschen 版主 2015-11-16
  • 打赏
  • 举报
回复
帮你main中的注释去了后我运行了下,没问题,代码没仔细看
源码下载地址: https://pan.quark.cn/s/8d2c461c797c JavaWeb程序设计构成了掌握Web交互式应用程序开发的核心领域,对于初学者来说,精通这一技术具有决定性意义。在“JavaWeb程序设计(第三版)作业答案”中,我们可以预期获得针对该教材习题的一系列深入解析,从而协助学习者强化知识体系。 JavaWeb所包含的技术组件涵盖了Servlet、JSP(JavaServer Pages)、JDBC(Java Database Connectivity)以及各类框架如Spring MVC、Struts等。Servlet是Java平台提供的一种扩展服务器功能的接口,能够处理HTTP请并生成相应的反馈。JSP则是一种用于构建动态网页的工具,它支持开发者将HTML代码与Java代码进行整合编写,从而简化了Web应用程序的开发流程。 作业答案通常会涉及以下几个核心内容: 1. **Servlet基础**:可能包含Servlet生命周期、init(), service(), destroy()方法的应用,以及如何在web.xml文件中设定Servlet的映射关系。 2. **JSP基础**:JSP的九大内置对象,如request、response、session、application等的使用,以及EL(Expression Language)和JSTL(JavaServer Pages Standard Tag Library)的实际操作。 3. **HTTP协议理解**:GET和POST请方法的差异,请头与响应头的应用,以及会话管理的概念阐释。 4. **JDBC数据库操作**:与数据库建立连接,执行SQL指令,处理查询结果集,以及...
源码链接: https://pan.quark.cn/s/a4b39357ea24 斐讯K2是一款广受用户青睐的无线路由器,其运行表现稳定且具备较高的可操作性,在DIY爱好者群体中拥有极高的声誉。本资料将系统性地阐述斐讯K2的固件刷机方法及其关联的技术要点。固件升级是路由器爱好者改善设备性能、扩展功能的一种普遍手段,经由替换出厂固件,能够达成更加个性化的网络配置、增强安全防护等目标。斐讯K2固件资源库涵盖了多种知名的非官方固件,诸如Tomato Pheonix 不死鸟、高恪、PandoraBox 潘多拉等,这些固件均具备独特的优势,能够适配不同用户的需。 1. Tomato Pheonix 不死鸟:Tomato是一款立足于Linux的开源固件,以其精巧、高效而备受推崇。不死鸟版本是专门为华硕及斐讯路由器优化的分支,提供了卓越的QoS(服务质量)配置、详尽的图表监控以及便捷的固件升级途径。对于那些需要精准调控带宽和监测网络状态的用户而言,这是一个理想的选项。 2. 高恪:高恪固件是OpenWrt的定制化版本,着重于操作的便捷性和运行的可靠性,特别适合对路由器操作不甚熟悉的用户群体。它提供了一些实用的功能,例如内置的广告屏蔽、快速测速工具等,同时保留了OpenWrt的适应性。 3. PandoraBox 潘多拉:潘多拉盒是另一款基于OpenWrt的固件,它以丰富的插件库和强大的自定义潜力而闻名。用户能够依据个人需安装各类插件,实现更多功能,如远程接入、DDNS(动态域名解析服务)等。 4. 官方固件的纯净版本与定制版本:官方固件通常更侧重于稳定性,纯净版意味着未预置额外的应用或服务,适合注重稳定性的用户。定制版则可能包含了制造商的特色功能或优...

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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