愿你 发表于 2018-3-29 16:30:06

关于循环队列销毁问题~

此时我队列已经被我销毁了 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+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+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 17:01:44

我复制过去调试了一下
应该是堆空间没了,但是那个指针还能操作
Q->base = NULL;就行了

愿你 发表于 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)

高价回收穷鬼盾 发表于 2018-3-29 18:35:35

愿你 发表于 2018-3-29 17:11
可是这样会出现错误
--------------------Configuration: 队列 - Win32 Debug--------------------
Com ...

肯定是这样的啊,释放完指针没NULL本来是个悬空指针这不是给他指向NULL了吗。
要想再用还得再申请堆空间吧initQ(&Q);

ba21 发表于 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+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+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;
}

愿你 发表于 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");
}
页: [1]
查看完整版本: 关于循环队列销毁问题~