鱼C论坛

 找回密码
 立即注册
查看: 1054|回复: 4

[已解决]c/c++语言队列问题(小白求助)

[复制链接]
发表于 2021-1-6 10:17:01 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
请问这个程序为什么有问题呢?
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;
}
最佳答案
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;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-1-6 19:09:02 | 显示全部楼层
有大佬帮帮我吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2021-1-7 11:15:16 | 显示全部楼层

谢谢大佬帮助,还是有一点不太理解,麻烦你再看看
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);
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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);
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-12 07:02

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表