鱼C论坛

 找回密码
 立即注册
查看: 5675|回复: 5

[已解决]关于循环队列销毁问题~

[复制链接]
发表于 2018-3-29 16:30:06 | 显示全部楼层 |阅读模式

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

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

x
此时我队列已经被我销毁了 base也被释放了,为什么还可以再进行创建(creatQ)

# define MAXSIZEQ 100
typedef struct{
        int *base;
        int front;
        int rear;
}SQueue;

void initQ(SQueue *Q)   //初始化队元素。
{
        Q->base=(int*)malloc(MAXSIZEQ*sizeof(int));
        if(!Q->base)
        {
                printf("空间无法正常分配,对不起哦~\n");
        }
        Q->front=Q->rear=0;
}

void creatQ(SQueue *Q)   //创建队元素
{
        int n,i;
        printf("请输入您要创建的元素个数:");
        scanf("%d",&n);
        if((Q->rear+1)%MAXSIZEQ==Q->front)
        {
                printf("该队已满了哦,你不可以插入了哦~\n");
        }
        for(i=0;i<n;i++)
        {
                printf("请输入第%d个元素:",i+1);
                scanf("%d",&Q->base[Q->rear]);
                Q->rear=(Q->rear+1)%MAXSIZEQ;
        }
}

void showQ(SQueue *Q)   //显示队元素
{
        int i;
        if(Q->front==Q->rear)
        {
                printf("不可以出队了哦 此时队空~\n");
        }
        for(i=0;i<Q->rear;i++)
        {
                printf("%d ",Q->base[Q->front]);
                Q->front=(Q->front+1)%MAXSIZEQ;
        }
        printf("\n");
}

int lengthQ(SQueue *Q) //打印队长
{
        int n;
        n=(Q->rear-Q->front+MAXSIZEQ)%MAXSIZEQ;
        printf("您的队长为:%d\n",n);
        return 0;
}

void isempty(SQueue *Q) //判断是否是空队列
{
        if(Q->rear==Q->front)
                printf("此时队列是空的哦~\n");
        else
                printf("此时队列不为空哦~\n");
}

void destroyQ(SQueue *Q)  //销毁该队列
{
        free(Q->base);
        Q->front=Q->rear=0;
        printf("此时队列已经被销毁了哦~\n");
}



int main()
{
        SQueue Q;
        initQ(&Q);
        creatQ(&Q);
        lengthQ(&Q);
        //isempty(&Q);
        destroyQ(&Q);
        creatQ(&Q);
        printf("您队中的元素为:");
        showQ(&Q);
        lengthQ(&Q);
        //isempty(&Q);
        return 0;
}
最佳答案
2018-3-29 18:46:48
代码严谨点,该判断的地方要判断
#include <stdio.h>
#include <stdlib.h>

# define MAXSIZEQ 5
typedef struct{
        int *base;
        int front;
        int rear;
}SQueue;

void initQ(SQueue *Q)   //初始化队元素。
{
        Q->base=(int *)malloc(MAXSIZEQ*sizeof(int));
        if(!Q->base)
        {
                printf("空间无法正常分配,对不起哦~\n");
        }
        Q->front=Q->rear=0;
}

void creatQ(SQueue *Q)   //创建队元素
{
        int n,i;
        printf("请输入您要创建的元素个数:");
        scanf("%d",&n);

                if(Q->base) // 内存没有被销毁
                {

                        for(i=0;i<n;i++)
                        {
                                        printf("请输入第%d个元素:",i+1);
                                        scanf("%d",&Q->base[Q->rear]);
                                        Q->rear=(Q->rear+1)%MAXSIZEQ;

                                        if((Q->rear+1)%MAXSIZEQ==Q->front)
                                        {
                                                printf("该队已满了哦,你不可以插入了哦~\n");
                                                break;
                                        }

                
                                
                        }
                }
                else
                {
                        printf("队列已被销毁!\n");
                }


}

void showQ(SQueue *Q)   //显示队元素
{
        int i;
        if(Q->front==Q->rear)
        {
                printf("不可以出队了哦 此时队空~\n");
        }
        for(i=0;i<Q->rear;i++)
        {
                printf("%d ",Q->base[Q->front]);
                Q->front=(Q->front+1)%MAXSIZEQ;
        }
        printf("\n");
}

int lengthQ(SQueue *Q) //打印队长
{
        int n;
        n=(Q->rear-Q->front+MAXSIZEQ)%MAXSIZEQ;
        printf("您的队长为:%d\n",n);
        return 0;
}

void isempty(SQueue *Q) //判断是否是空队列
{
        if(Q->rear==Q->front)
                printf("此时队列是空的哦~\n");
        else
                printf("此时队列不为空哦~\n");
}

void destroyQ(SQueue *Q)  //销毁该队列
{
        free(Q->base);
                Q->base = NULL;
        Q->front=Q->rear=0;                
        printf("此时队列已经被销毁了哦~\n");
}



int main()
{
        SQueue Q;

        initQ(&Q);
        creatQ(&Q);

        lengthQ(&Q);
        //isempty(&Q);
        destroyQ(&Q);
        creatQ(&Q);
        printf("您队中的元素为:");
        showQ(&Q);
        lengthQ(&Q);
        //isempty(&Q);
        return 0;
}
QQ图片20180329162934.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-3-29 17:01:44 | 显示全部楼层
我复制过去调试了一下
应该是堆空间没了,但是那个指针还能操作
Q->base = NULL;就行了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-3-29 17:11:00 | 显示全部楼层
高价回收穷鬼盾 发表于 2018-3-29 17:01
我复制过去调试了一下
应该是堆空间没了,但是那个指针还能操作
Q->base = NULL;就行了

可是这样会出现错误
--------------------Configuration: 队列 - Win32 Debug--------------------
Compiling...
队列.c
C:\Windows\System32\队列.c(10) : warning C4013: 'malloc' undefined; assuming extern returning int
C:\Windows\System32\队列.c(13) : warning C4013: 'printf' undefined; assuming extern returning int
C:\Windows\System32\队列.c(22) : warning C4013: 'scanf' undefined; assuming extern returning int
C:\Windows\System32\队列.c(68) : error C2065: 'NULL' : undeclared identifier
C:\Windows\System32\队列.c(68) : warning C4047: '=' : 'int *' differs in levels of indirection from 'int '
执行 cl.exe 时出错.

队列.exe - 1 error(s), 0 warning(s)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-29 18:35:35 | 显示全部楼层
愿你 发表于 2018-3-29 17:11
可是这样会出现错误
--------------------Configuration: 队列 - Win32 Debug--------------------
Com ...

肯定是这样的啊,释放完指针没NULL本来是个悬空指针这不是给他指向NULL了吗。
要想再用还得再申请堆空间吧initQ(&Q);
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-29 18:46:48 | 显示全部楼层    本楼为最佳答案   
代码严谨点,该判断的地方要判断
#include <stdio.h>
#include <stdlib.h>

# define MAXSIZEQ 5
typedef struct{
        int *base;
        int front;
        int rear;
}SQueue;

void initQ(SQueue *Q)   //初始化队元素。
{
        Q->base=(int *)malloc(MAXSIZEQ*sizeof(int));
        if(!Q->base)
        {
                printf("空间无法正常分配,对不起哦~\n");
        }
        Q->front=Q->rear=0;
}

void creatQ(SQueue *Q)   //创建队元素
{
        int n,i;
        printf("请输入您要创建的元素个数:");
        scanf("%d",&n);

                if(Q->base) // 内存没有被销毁
                {

                        for(i=0;i<n;i++)
                        {
                                        printf("请输入第%d个元素:",i+1);
                                        scanf("%d",&Q->base[Q->rear]);
                                        Q->rear=(Q->rear+1)%MAXSIZEQ;

                                        if((Q->rear+1)%MAXSIZEQ==Q->front)
                                        {
                                                printf("该队已满了哦,你不可以插入了哦~\n");
                                                break;
                                        }

                
                                
                        }
                }
                else
                {
                        printf("队列已被销毁!\n");
                }


}

void showQ(SQueue *Q)   //显示队元素
{
        int i;
        if(Q->front==Q->rear)
        {
                printf("不可以出队了哦 此时队空~\n");
        }
        for(i=0;i<Q->rear;i++)
        {
                printf("%d ",Q->base[Q->front]);
                Q->front=(Q->front+1)%MAXSIZEQ;
        }
        printf("\n");
}

int lengthQ(SQueue *Q) //打印队长
{
        int n;
        n=(Q->rear-Q->front+MAXSIZEQ)%MAXSIZEQ;
        printf("您的队长为:%d\n",n);
        return 0;
}

void isempty(SQueue *Q) //判断是否是空队列
{
        if(Q->rear==Q->front)
                printf("此时队列是空的哦~\n");
        else
                printf("此时队列不为空哦~\n");
}

void destroyQ(SQueue *Q)  //销毁该队列
{
        free(Q->base);
                Q->base = NULL;
        Q->front=Q->rear=0;                
        printf("此时队列已经被销毁了哦~\n");
}



int main()
{
        SQueue Q;

        initQ(&Q);
        creatQ(&Q);

        lengthQ(&Q);
        //isempty(&Q);
        destroyQ(&Q);
        creatQ(&Q);
        printf("您队中的元素为:");
        showQ(&Q);
        lengthQ(&Q);
        //isempty(&Q);
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-3-29 21:32:31 | 显示全部楼层
高价回收穷鬼盾 发表于 2018-3-29 18:35
肯定是这样的啊,释放完指针没NULL本来是个悬空指针这不是给他指向NULL了吗。
要想再用还得再申请堆空间 ...

那像这个函数之所以出现停止运行的框是不是因为我此时的链表已经被销毁了??
void destroyQ(LinkQueue *Q)  //销毁链队列,此时虽能够实现销毁链队列,但会出现程序停止运行的框。
{
        while(Q->front)
        {
                Q->rear=Q->front->next;
                free(Q->front);
                Q->front=Q->rear;
        }
        Q->front=Q->rear=NULL;
        printf("您的队列已经被销毁了哦!\n");
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-23 22:16

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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