lingwu 发表于 2021-1-6 10:17:01

c/c++语言队列问题(小白求助)

请问这个程序为什么有问题呢?
Q.rear和Q.front开始都指向同一个地方,为什么好像值并不相同?
//第30集课后练习:功能:用户输入什么,就打印出什么!
//注意区别队列与线性表的区别,此处应该使用队列进行操作
//对头front出队,队尾rear出队
#include<stdio.h>
#include<stdlib.h>

typedef struct Qnode
{
        char data;
        struct Qnode *next;
}Qnode, *Qnodep;

typedef struct
{
        Qnodep front;
        Qnodep rear;
}LinkQueue;

LinkQueue Q;

void InitQueue(LinkQueue &Q)//创建一个空队列!
{
        Q.front = Q.rear = (Qnodep)malloc(sizeof(Qnode));
        if(!Q.front) exit(-1);//注意程序的严谨性!
        Q.front->next = Q.rear->next = NULL;
}

void GetHead(LinkQueue Q, char &ch)//返回队头元素(不为空时)
{
        if(Q.front == Q.rear)
        {
                printf("队列为空!");
                exit(-1);
        }
        else
        {
                ch = Q.front->data;
        }
}

void EnQueue(LinkQueue &Q, char ch)//插入元素,生成新的队尾
{
        Q.rear->next = (Qnodep)malloc(sizeof(Qnode));
        if(!Q.rear->next) exit(-1);//分配空间记得检查!
        Q.rear = Q.rear->next;
        Q.rear->data = ch;
        Q.rear->next = NULL;
}

void DeQueue(LinkQueue &Q, char &ch)//删除一个对头的元素,生成新的对头
{
        if(Q.front == Q.rear)
        {
                printf("队列为空!");
                exit(-1);
        }
        //注意队列的头指针是空的
        ch = Q.front->next->data;
        if(Q.front->next == Q.rear)
        {
                Q.rear = NULL;//队列为空!
        }
        Q.front = Q.front->next = NULL;
}

int isempty(LinkQueue Q)
{
        if(Q.front == Q.rear) return 1;
        else return 0;
}

int main()
{
        InitQueue(Q);
        char ch;
        printf("请输入一串字符,以#结尾\n");
        scanf("%c", &ch);
        while(ch != '#')
        {
                EnQueue(Q, ch);
                scanf("%c", &ch);
        }
        while(!isempty(Q))
        {
                DeQueue(Q, ch);
                printf("%c", ch);
        }
        return 0;
}

lingwu 发表于 2021-1-6 19:09:02

有大佬帮帮我吗?{:10_305:}

xieglt 发表于 2021-1-6 20:41:41

本帖最后由 xieglt 于 2021-1-6 20:43 编辑

lingwu 发表于 2021-1-6 19:09
有大佬帮帮我吗?

#include<stdio.h>
#include<stdlib.h>

typedef struct Qnode
{
        char data;
        struct Qnode *next;
}Qnode, *Qnodep;

typedef struct
{
        Qnodep front;
        Qnodep rear;
}LinkQueue;

LinkQueue Q;

void InitQueue(LinkQueue &Q)//创建一个空队列!
{
        Q.front = Q.rear = (Qnodep)malloc(sizeof(Qnode));
        if(!Q.front) exit(-1);//注意程序的严谨性!
        //data 没有初始化
        Q.front->data = 0;
        Q.front->next = NULL;
}

void GetHead(LinkQueue Q, char &ch)//返回队头元素(不为空时)
{
        if(Q.front == Q.rear)
        {
                printf("队列为空!");
                return;
        }
        else
        {
                ch = Q.front->data;
        }
}

void EnQueue(LinkQueue &Q, char ch)//插入元素,生成新的队尾
{
        Qnodep node = (Qnodep)malloc(sizeof(Qnode));
        //Q.rear->next = (Qnodep)malloc(sizeof(Qnode));
        if(!node) exit(-1);//分配空间记得检查!

        node->data = ch;
        node->next = NULL;
       
        Q.rear->next = node;
        Q.rear = node;
}

void DeQueue(LinkQueue &Q, char &ch)//删除一个对头的元素,生成新的对头
{
        if(Q.front == Q.rear)
        {
                printf("队列为空!");
                return;
        }

        //注意队列的头指针是空的
        //取第一个元素
        Qnodep node = Q.front->next;
        ch = node->data;
        //断开第一个元素的节点
        Q.front->next = node->next;
        //只有一个元素了,将对头赋给队尾
        if(node == Q.rear)
        {
                Q.rear = Q.front;
        }
       
        //释放内存
        free(node);
}

int isempty(LinkQueue Q)
{
        if(Q.front == Q.rear)
                return 1;
        else
                return 0;
}

int main()
{
        InitQueue(Q);
        char ch;
        printf("请输入一串字符,以#结尾\n");
        scanf("%c", &ch);
        while(ch != '#')
        {
                EnQueue(Q, ch);
                scanf("%c", &ch);
        }

        while(!isempty(Q))
        {
                DeQueue(Q, ch);
                printf("%c", ch);
        }
       
        free(Q.front);
        return 0;
}

lingwu 发表于 2021-1-7 11:15:16

xieglt 发表于 2021-1-6 20:41


谢谢大佬帮助,还是有一点不太理解,麻烦你再看看{:10_303:}
void DeQueue(LinkQueue &Q, char &ch)//删除一个对头的元素,生成新的对头
{
      if(Q.front == Q.rear)
      {
                printf("队列为空!");
                return;
      }

      //注意队列的头指针是空的
      //取第一个元素
      
      //请问,下面一段代码,我不使用node,
                //明明意思一样,为什么就不对呢?
               
      /*Qnodep node = Q.front->next;
      ch = node->data;
      //断开第一个元素的节点
      Q.front->next = node->next;
      //只有一个元素了,将对头赋给队尾
      if(node == Q.rear)
      {
                Q.rear = Q.front;
      }*/
      
      //我修改后的代码
                //Qnodep node = Q.front->next;
      ch = Q.front->next->data;
      //断开第一个元素的节点
      Q.front->next = Q.front->next->next;
      //只有一个元素了,将对头赋给队尾
      if(Q.front->next == Q.rear)
      {
                Q.rear = Q.front;
      }
      //释放内存
      free(Q.front->next);
}

xieglt 发表于 2021-1-7 11:35:05

lingwu 发表于 2021-1-7 11:15
谢谢大佬帮助,还是有一点不太理解,麻烦你再看看

Q.front->next节点在之前已经被你断掉了,现在
Q.front->next 已经被赋值为 Q.front->next->next,
你再执行free,释放错了节点啊。
free(Q.front->next);
页: [1]
查看完整版本: c/c++语言队列问题(小白求助)