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

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. Task Execution and Scheduling In SpringBoot

    开天辟地 Task Execution and Scheduling In the absence of an Executor bean in the context, Spring Boot au ...

  2. K8S | 容器和Pod组件

    对比软件安装和运行: 一.场景 作为研发人员,通常自己电脑的系统环境都是非常复杂,在个人的习惯上,是按照下图的模块管理电脑的系统环境: 对于「基础设施」.「主机操作系统」.「系统软件」来说,通常只做配 ...

  3. asp.net core如何获取客户端IP地址

    客户端直接访问服务器 直接通过HttpContext.Connection.RemoteIpAddress获取客户端Ip [HttpGet] [Route("GetClientIP" ...

  4. java根据配置文件读取值

    <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 --> <dependency> ...

  5. Struts2 小知识点

    配置struts.xml文件,选择开发模式 在实际应用开发或者是产品部署的时候,对应着两种模式: 开发模式(devMode):此时 DevMode=ture: 产品模式(proMode):此时 Dev ...

  6. jdbc-plus是一款基于JdbcTemplate增强工具包,基于JdbcTemplate已实现分页、多租户、动态表名等插件,可与mybatis、mybatis-plus等混合使用

    jdbc-plus简介 jdbc-plus是一款基于JdbcTemplate增强工具包,基于JdbcTemplate已实现分页.多租户.动态表名等插件,可与mybatis.mybatis-plus等混 ...

  7. Robot Framework 自动化测试部署常见问题及处理方法(一)

    1.在Python>>Scripts中运行python ride.py时报错 现象: 1 Traceback (most recent call last): 2 File "E ...

  8. 若依前后端分离版:增加新的登录接口和新的用户表,用于小程序或者APP获取token,并使用若依的验证方法

    相关原创链接直接放这: 基于若依框架springsecurity添加多种用户登录解决方案(springsecurity多用户登录:前端用户.后端用户)_若依多用户表登录_云优的博客-CSDN博客 若依 ...

  9. 利用pytorch自定义CNN网络(二):数据集的准备

    本文是利用pytorch自定义CNN网络系列的第二篇,主要介绍构建网络前数据集的准备,关于本系列的全文见这里. 笔者的运行设备与软件:CPU (AMD Ryzen 5 4600U) + pytorch ...

  10. 【opencv】传统图像识别:hog+svm实现图像识别详解

    图像识别技术是信息时代的一门重要的技术,其产生目的是为了让计算机代替人类去处理大量的物理信息.传统图像识别技术的过程分为信息的获取.预处理.特征抽取和选择.分类器设计和分类决策.本文也是从这四点出发进 ...