关于数据结构中free()函数使用的问题

只爱艾薇儿 2012-04-08 01:58:25
如题 在写链式表,链栈,链队列时,总会遇到要删除一个节点或是一个队列的操作,是用free()的,可是小弟也不知道怎么一用就错,不用的话就对
下面以链式栈为例:

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

#define Error 1
#define Ok 0

typedef int Status;
typedef int QElemType;

typedef struct QNode {
QElemType data;
struct QNode *next;
}QNode,*QueuePtr;
typedef struct{
QueuePtr front;
QueuePtr rear;
}LinkQueue;

Status Ini_Queue(LinkQueue &Q)
{
Q.rear=(QNode*)malloc(sizeof(QueuePtr));
if(!Q.rear)
{printf("输错了啊"); return Error;}
Q.front=Q.rear;
Q.rear->next=NULL;
return Ok;
}
/*Status DestoryQueue(LinkQueue &Q)
{
while(Q.front)
{
Q.rear
}
}*/

Status InQueue(LinkQueue &Q,QElemType e){
QueuePtr p;
p=(QueuePtr)malloc(sizeof(QueuePtr));
if(!p)
{printf("出错了啊"); return Error;}
p->data=e;
p->next=NULL;
Q.rear->next=p;
Q.rear=p;
return Ok;
}
Status Delete_Queue(LinkQueue &Q,QElemType &e )
{
QNode *p;
if(Q.front==Q.rear) return Error;
printf("您删除的元素为:");
p=Q.front->next;
e=p->data;
Q.front->next=p->next;
if(p==Q.rear) Q.rear=Q.front;
/*p->next=NULL;
free(p); */ // ??????????????????????????????
return Ok;
}
void print(LinkQueue Q)
{
LinkQueue p;
p=Q;
printf("您输入的队列为");
while(p.front!=p.rear)
{
printf("%d",p.front->next->data);
p.front=p.front->next;
}
printf("\n");
}
void main()
{
LinkQueue Q; int e,i;
Ini_Queue(Q);
printf("请输入队列的值");
scanf("%d",&e);
while(e!=0)
{
InQueue(Q,e);
scanf("%d",&e);
}
print(Q);
printf("您是否要删除元素(1或0)");
scanf("%d",&i);
if(i==1)
{
Delete_Queue(Q,e);
printf("%d",e);
}
else
printf("按任意键退出");
getchar();
getchar();

我注释问号的地方就是问题所在。。。
我真心不知道到底是什么错误。。。
求各位指导下哈
...全文
324 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
tiany524 2012-04-08
  • 打赏
  • 举报
回复
分配的内存有问题吧
Status InQueue(LinkQueue &Q,QElemType e){
中的
Q.rear=(QNode*)malloc(sizeof(QueuePtr)); ??

Status InQueue(LinkQueue &Q,QElemType e){
中的
p=(QueuePtr)malloc(sizeof(QueuePtr)); ??

你分配的都是指针 而不是这个结构体的大小
sizeof(QueuePtr) = 4
sizeof(QNode) = 8
只爱艾薇儿 2012-04-08
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

C/C++ code

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

#define Error 1
#define Ok 0

typedef int Status;
typedef int QElemType;

typedef struct QNode {
QElemType data;
struct QNode *next;
……
[/Quote]
输出函数里面的QNode* p;
p=Q.front->next;
这句话 不就是防止修改指针吗
W170532934 2012-04-08
  • 打赏
  • 举报
回复

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

#define Error 1
#define Ok 0

typedef int Status;
typedef int QElemType;

typedef struct QNode {
QElemType data;
struct QNode *next;
}QNode,*QueuePtr;

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

Status Ini_Queue(LinkQueue &Q)
{
Q.rear=(QNode*)malloc(sizeof(QNode));
if(!Q.rear)
{
printf("输错了啊");
return Error;
}
Q.front=Q.rear;
Q.rear->next=NULL;
return Ok;
}


Status InQueue(LinkQueue &Q,QElemType e){
QueuePtr p;
p=(QueuePtr)malloc(sizeof(QNode));
if(!p)
{
printf("出错了啊");
return Error;
}
p->data=e;
p->next=NULL;
Q.rear->next=p;
Q.rear=p;
return Ok;
}

Status Delete_Queue(LinkQueue &Q,QElemType &e )
{
QNode *p;
if(Q.front==Q.rear) return Error;
printf("您删除的元素为:");
p=Q.front->next;
e=p->data;
Q.front->next=p->next;
if(p==Q.rear) Q.rear=Q.front;
p->next=NULL;
free(p); // ??????????????????????????????
return Ok;
}

void print(LinkQueue Q)
{
QNode* p;
p=Q.front->next;
printf("您输入的队列为");
while(p)
{
printf("%d",p->data);
p=p->next;
}
printf("\n");
}

void main()
{
LinkQueue Q; int e,i;
Ini_Queue(Q);
printf("请输入队列的值");
scanf("%d",&e);
while(e!=0)
{
InQueue(Q,e);
scanf("%d",&e);
}
print(Q);
printf("您是否要删除元素(1或0)");
scanf("%d",&i);
if(i==1)
{
Delete_Queue(Q,e);
printf("%d",e);
}
else
printf("按任意键退出");
getchar();
getchar();
}

你原来的代码,输出函数修改了链表的指针。

69,364

社区成员

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

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