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;
}
有大佬帮帮我吗?{:10_305:} 本帖最后由 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;
}
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);
} lingwu 发表于 2021-1-7 11:15
谢谢大佬帮助,还是有一点不太理解,麻烦你再看看
Q.front->next节点在之前已经被你断掉了,现在
Q.front->next 已经被赋值为 Q.front->next->next,
你再执行free,释放错了节点啊。
free(Q.front->next);
页:
[1]