《数据结构》王卓老师 p48-p62学习反馈

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

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; 错误解决

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