数据结构-队列,Segmentation fault

BHduke 2010-11-16 09:20:54
#include<stdio.h>
#include<stdlib.h>
#define SIZE 13
typedef struct{
int *base;
int front;
int rear;
}SqQueue;
int InitQueue(SqQueue Q){
Q.base=(int *)malloc(sizeof(int)*SIZE);
if(!Q.base)exit(0);
Q.front=Q.rear=0;
return 1;
}
int QueueLength(SqQueue Q){
if(Q.rear=Q.front)exit(0);
printf("The Length of Queue is %d\n",(Q.rear-Q.front+SIZE)%SIZE);
}
void EnQueue(SqQueue Q,int e){
if(((Q.rear+1)%SIZE)==Q.front){
printf("full\n");
exit(0);
}
Q.base[Q.rear]=e;
Q.rear=(Q.rear+1)%SIZE;
}
void DeQueue(SqQueue Q,int e){
if(Q.rear=Q.front){
printf("empty\n");
}
e=Q.base[Q.front];
Q.front++;
}
void Show(SqQueue Q,int i){
printf("Num.%d is %d\n",i,Q.base[i]);
}
int DestoryQueue(SqQueue Q){
free(Q.base);
Q.front=Q.rear=0;
return 1;
}
main()
{
int i,e;
SqQueue Q;
InitQueue(Q);
for(i=0;i<SIZE;i++){
EnQueue(Q,i);
}
QueueLength(Q);
Show(Q,3);
for(i=0;i<SIZE;i++){
Show(Q,i);
}
DeQueue(Q,e);
printf("%d Deleted\n",e);
for(i=0;i<SIZE;i++){
Show(Q,i);
}
DestoryQueue(Q);
}


GDB结果:
Program received signal SIGSEGV, Segmentation fault.
0x080485af in EnQueue (Q=..., e=0) at p.c:24
24 Q.base[Q.rear]=e;
(gdb) bt
#0 0x080485af in EnQueue (Q=..., e=0) at p.c:24
#1 0x080486bd in main () at p.c:48

内存问题?不知如何解决,刚学数据结构-队列,请指教
如有需改善的地方,也请不吝赐教~Thanks~!
...全文
141 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
liahr 2010-11-18
  • 打赏
  • 举报
回复
段错误,看是不是什么地方内存访问非法了。
BHduke 2010-11-18
  • 打赏
  • 举报
回复
感谢各位的帮助 对函数的参数有了更深刻的了解
logiciel 2010-11-17
  • 打赏
  • 举报
回复
看来LZ是要写C程序,那么就用指针:

#include<stdio.h>
#include<stdlib.h>
#define SIZE 13
typedef struct{
int *base;
int front;
int rear;
}SqQueue;
int InitQueue(SqQueue *Q){
Q->base=(int *)malloc(sizeof(int)*SIZE);
if(!Q->base)exit(0);
Q->front=0;
Q->rear=-1;
return 1;
}
int QueueLength(SqQueue *Q){
//错if(Q->rear=Q->front)exit(0);
int l = Q->rear > Q->front ? Q->rear + 1 - Q->front : Q->rear + 1 - Q->front +SIZE;
printf("The Length of Queue is %d\n", l);
return l;
}
void EnQueue(SqQueue *Q,int e){
if(Q->rear!=-1 &&((Q->rear+1)%SIZE)==Q->front){//if(((Q->rear+1)%SIZE)==Q->front){
printf("full\n");
exit(0);
}
Q->rear=(Q->rear+1)%SIZE;
Q->base[Q->rear]=e;
}
void DeQueue(SqQueue *Q,int *e){
if(Q->rear==Q->front){ //错if(Q->rear=Q->front){
printf("empty\n");
}
*e=Q->base[Q->front];
Q->front++;
}
void Show(SqQueue Q,int i){
printf("Num.%d is %d\n",i,Q.base[i]);
}
int DestoryQueue(SqQueue Q){
free(Q.base);
Q.front=Q.rear=0;
return 1;
}
main()
{
int i,e,l;
SqQueue Q;
InitQueue(&Q); //InitQueue(Q);
for(i=0;i<SIZE;i++){
EnQueue(&Q,i); //EnQueue(Q,i);
}
l = QueueLength(&Q); //QueueLength(Q);
Show(Q,3);
for(i=0;i<SIZE;i++){
Show(Q,i);
}
DeQueue(&Q, &e); //DeQueue(Q, e);
printf("%d Deleted\n",e);
//for(i=0;i<SIZE;i++){
i = Q.front;
Show(Q,i);
do
{
i = (i + 1) % SIZE;
Show(Q,i);
} while (i != Q.rear);
DestoryQueue(Q);
}

BHduke 2010-11-17
  • 打赏
  • 举报
回复
linux下GCC
HonryZZ 2010-11-17
  • 打赏
  • 举报
回复
好像C++ 才支持引用...
是用C++编译器编译的么?
BHduke 2010-11-17
  • 打赏
  • 举报
回复
我直接把函数改成:int InitQueue(SqQueue &Q)
这叫引用吗?
改完后提示error: expected ‘;’, ‘,’ or ‘)’ before ‘&’ token
东大坡居士 2010-11-16
  • 打赏
  • 举报
回复
对头,像int InitQueue(SqQueue Q)这些函数都应该传递地址,要不然改的都是局部变量,
改成InitQueue(SqQueue **Q);
箭于 2010-11-16
  • 打赏
  • 举报
回复
看看······· 学习 学习··
HonryZZ 2010-11-16
  • 打赏
  • 举报
回复
晕了..LZ的函数都应该传地址的,而 不是传值,传值过去只是一个拷贝..得不到任何有效数据的...
HonryZZ 2010-11-16
  • 打赏
  • 举报
回复
InitQueue(...) 需要传地址..

DeQueue(Q,e);
printf("%d Deleted\n",e);
要传地址..才能获取正确的值...
「已注销」 2010-11-16
  • 打赏
  • 举报
回复
好长。。
不过有个地方应该改成:
void EnQueue(SqQueue Q,int e){
if(((Q.rear+1)%SIZE)==Q.front){
printf("full\n");
free(Q.base);//不然就内存泄漏了
exit(0);
}

69,336

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧