跟着青岛大学-王卓老师的视频进行到链队列时,运行链队列代码的时候遇到了两个问题:

1.)Program received signal SIGSEGV Segmentation fault

附代码:

 #include<stdio.h>
 #include<stdlib.h>
 typedef char  ElemType;
 typedef struct qnode{
  ElemType data;
  struct qnode *next;
 }DataNode; //数据节点
 typedef struct{
  DataNode *front;
  DataNode *rear;
 }LinkQuNode; //链队节点
 //初始化
 void InitQueue(LinkQuNode *&q){
 ​
  q = (LinkQuNode *)malloc(sizeof(LinkQuNode)); //必加
  q->front = q->rear = (DataNode *)malloc(sizeof(DataNode));
  q->front->next = NULL;
 }
 ​
 //判断是否为空
 bool EmptyQueue(LinkQuNode *q){
  if(q->front->next == NULL) return true;
  return false;
 }
 //入队
 void EnQueue(LinkQuNode *&q,ElemType e){
  DataNode *p;
  p = (DataNode *)malloc(sizeof(DataNode));
  p->data = e;
  p->next = NULL;
  q->rear->next = p;
  q->rear = p;
 }
 //出队
 bool DeQueue(LinkQuNode *&q,ElemType &e){
  if (EmptyQueue(q)) return false;
  DataNode *p;
  p = q->front->next;
  e = p->data;
  q->front->next = p->next;
  free(p);
 // printf("%c\n",e);
  return true;
 }
 int main(){
  LinkQuNode *p;
  ElemType a[]="abcdefg",b[10]="";
  InitQueue(p);
 }

分析及解决:调用InitQueue函数的时候有用到q指针 但是却没有给他赋初始值;加上代码q = (LinkQuNode *)malloc(sizeof(LinkQuNode)); 后问题解决;

2.) 出队一直死循环 运行没有结果;

 //出队
 bool DeQueue(LinkQuNode *&q,ElemType &e){
  if (q->front == q->rear) return false;
  DataNode *p;
  p = q->front->next;
  e = p->data;
  q->front->next = p->next;
  free(p);
 // printf("%c\n",e);
  return true;
 }
 int main(){
  LinkQuNode *p;
  ElemType a[]="abcdefg",b[10]="";
 ​
  InitQueue(p);
 
  for(int i=0;i<=strlen(a);i++) EnQueue(p,a[i]);//入队
  for(int i=0;DeQueue(p,b[i]);i++); //出队
  printf("%s",b);
 }

分析及解决: 想了很久,但是一直没有找出来, 这玩意果然还是得动手用笔画一下,一画思路就清晰了,可以看到在进行出队操作的时候,front其实一直都没有动,所有的操作都是改变front->next的值,如果判断条件为 q->front == q->rear 那么它一直都走不出来

冷静换个思路想 末尾元素是g,而它的next是指向NULL,那么当front走到g元素的位置,用front->next==NULL 就可以确定此时链队列已经没有元素了,将第3行改为if(q->front->next == NULL) return false; 错误解决

这是小弟第一次写博客笔记,上面只是个人的一些理解,有什么不对的地方欢迎大家批评指正,谢谢!

 

《数据结构》王卓老师 p48-p62学习反馈的更多相关文章

  1. 郝斌老师C语言学习笔记(一)

    在给变量分配内存时,很可能这段内存存在以前其他程序使用留下的值.当使用VC编译器,若编译器发现没有给变量赋值而使用,就会返回一个以“85”开头的很大的数字(此时该段内存中为一个垃圾数,为了避免出现较常 ...

  2. 20172328 2018-2019《Java软件结构与数据结构》第六周学习总结

    20172328 2018-2019<Java软件结构与数据结构>第六周学习总结 概述 Generalization 本周学习了第十章:非线性集合与数据结构--树.主要讨论了树的使用和实现 ...

  3. 20172328 2018-2019《Java软件结构与数据结构》第七周学习总结

    20172328 2018-2019<Java软件结构与数据结构>第七周学习总结 概述 Generalization 本周学习了第11章:二叉查找树.在本章中,主要探讨了二叉查找树的概念和 ...

  4. 20172306 2018-2019-2 《Java程序设计与数据结构》第八周学习总结

    20172306 2018-2019-2 <Java程序设计与数据结构>第八周学习总结 教材学习内容总结 堆 堆是具有两个附加属性的一棵二叉树 它是一个完全树 对每一结点,它小于或等于其左 ...

  5. 20172306 2018-2019-2 《Java程序设计与数据结构》第七周学习总结

    20172306 2018-2019-2 <Java程序设计与数据结构>第七周学习总结 教材学习内容总结 概述 二叉查找树是一种含有附加属性的二叉树,即其左孩子小于父结点,而父结点又小于或 ...

  6. 20172306 2018-2019-2 《Java程序设计与数据结构》第六周学习总结

    20172306 2018-2019-2 <Java程序设计与数据结构>第六周学习总结 教材学习内容总结 概述(了解一下树的一些概念) 树是一种非线性结构.树由一个包含结点和边的集构成,其 ...

  7. 2018-2019-20172329 《Java软件结构与数据结构》第五周学习总结

    2018-2019-20172329 <Java软件结构与数据结构>第五周学习总结 教材学习内容总结 <Java软件结构与数据结构>第九章-排序与查找 一.查找 1.查找概念简 ...

  8. 2018-2019-20172329 《Java软件结构与数据结构》第八周学习总结

    2018-2019-20172329 <Java软件结构与数据结构>第八周学习总结 现在对于我而言,最珍贵的是时间,感觉自己在时间飞逝的时候真的挽留不住什么,只能怒发冲冠的让自己疯狂的学习 ...

  9. 2018-2019-20172329 《Java软件结构与数据结构》第六周学习总结

    2018-2019-20172329 <Java软件结构与数据结构>第六周学习总结 学无止境,希望自己可以坚持下去,就算自己有太多的事情也不希望自己落下学习,也希望自己可以活成自己想要的样 ...

  10. 2018-2019-20172321 《Java软件结构与数据结构》第八周学习总结

    2018-2019-20172321 <Java软件结构与数据结构>第八周学习总结 教材学习内容总结 第12章 优先队列与堆 一.概述 堆 堆的前提就是他首先是一个完全二叉树,其次就是满足 ...

随机推荐

  1. ASP.NET MVC4 学习笔记-1

    初学ASP.NET MVC,通过博客来记录自己的学习笔记! 创建一个新的 ASP.NET MVC 项目 在新建项目中选择 ASP.NET MVC4 Web Application,项目类型为空,视图引 ...

  2. 使用react-test-renderer/shallow写测试

    我的项目是采用react + ts来写的,项目中要写单元测试,于是采用了Jest库,  主要用的package有 react-test-renderer react-test-renderer/sha ...

  3. js闭包的一些笔记

    闭包 闭包是一个可以访问外部作用域的内部函数,即使这个外部作用域已经执行结束 作用域 作用域决定这个变量的生命周期及其可见性.当我们创建一个函数,就会生成一个新的作用域. 通过var创建的变量只有函数 ...

  4. K8S | Config应用配置

    绕不开的Config配置: 一.背景 在自动化流程中,对于一个应用来说,从开发阶段的配置管理,到制作容器镜像,再到最后通过K8S集群发布为服务,整个过程涉及到的配置非常多: 应用环境:通常是指代码层面 ...

  5. 您在 /var/spool/mail/root 中有新邮件

    查看邮件 删除邮件 禁止系统启动邮件检查这样就再有邮件提示了 mail cat /dev/null > /var/spool/mail/root echo "unset MAILCHE ...

  6. 《深入理解Java虚拟机》读书笔记:判断对象是否存活

    本节内容的概要如下; 对象已死吗? 一.判断对象是否存活的算法 1.引用计数器算法 给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1:当引用失效时,计数器值就减1:任何时刻计数器为0 ...

  7. 基于consul实现docker跨主机网络通信

    前言 IP: 192.168.0.10 192.168.0.11 系统版本:ubuntu 20.04 consul版本:1.11.1 官网下载地址: https://www.consul.io/dow ...

  8. C#的重载决策

    重载是许多编程语言支持的特性.所谓重载,就是指可以定义多个名称相同但参数(个数.类型和顺序)不同的方法(函数).先来看一个例子: void Main() { char cvalue = 'a'; ma ...

  9. 5、Spring之bean的作用域和生命周期

    5.1.bean的作用域 5.1.1.单例(默认且常用) 5.1.1.1.配置bean 注意:当bean不配置scope属性时,默认是singleton(单例) <?xml version=&q ...

  10. 三维模型OSGB格式轻量化的跨平台兼容性技术分析

    三维模型OSGB格式轻量化的跨平台兼容性技术分析 在三维模型应用中,OSGB格式轻量化处理是一种常见的技术手段,可以通过数据压缩.简化.滤波等操作,降低三维模型数据的存储空间和传输带宽需求,提高应用程 ...