再帮我看看吧,总是在链式队列或者堆栈中出现这样的问题。
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
//定义抽象数据
typedef int DataType;
typedef struct queue{
DataType data;
struct queue *next;
}Queue;
//定义链式队列的头尾指针
typedef struct{
Queue *front;
Queue *rear;
}ListQueue;
//链式队列初始化
void ListQueueInit(ListQueue *myQ)
{
myQ->front = NULL;
myQ->rear = NULL;
}
//链式队列判断是否为空
int ListQueueNoEmpty(ListQueue myQ)
{
if (myQ.front==NULL)
{
return 1;
}
else
{
return 0;
}
}
//链式队列的入队操作
int ListQueuePush(ListQueue *myQ, DataType x)
{
Queue *pTemp;
if ((pTemp=(Queue*)malloc(sizeof(Queue)))==NULL)
{
return 0;
}
pTemp->data = x;
if (myQ->rear!=NULL) //第一次入队的时候rear为null所以不执行。
{
myQ->rear->next = pTemp;
}
myQ->rear = pTemp; //将队尾指针指向第一个入队的元素。
if (myQ->front==NULL)
{
myQ->front = pTemp;//将队头指针指向第一个入队的元素,然后不再移动。
}
return 1;
}
//链式队列的出队操作
int ListQueuePop(ListQueue *myQ, DataType *x)
{
ListQueue *del;
if ((del = (ListQueue*)malloc(sizeof(ListQueue))) == NULL)
{
return 0;
}
if (myQ->front==NULL&&myQ->rear==NULL)
{
return 0;
}
*x = myQ->front->data;
del->front = myQ->front;
myQ->front = myQ->front->next;
if (myQ->front==NULL)//如果只有一个节点
{
myQ->rear = NULL;
}
free(del);
return 1;
}
//链式队列取队头
int ListQueueTop(ListQueue *myQ,DataType *num)
{
if (myQ->front==NULL)
{
return 0;
}
*num = myQ->front->data;
return 1;
}
//销毁队列内存
void ListQueueDes(ListQueue **myQ)
{
ListQueue *temp,*pre;
if ((temp = (ListQueue*)malloc(sizeof(ListQueue))) == NULL)
{
exit(1);
}
pre = *myQ;
while (pre!=NULL)
{
temp = pre->front;
pre->front = pre->front->next;
free(temp);
temp = NULL;
}
(*myQ)->front = NULL;
(*myQ)->rear = NULL;
}
//主函数
int main()
{
ListQueue *Q;
int i,m;
DataType x;
ListQueueInit(&Q);
for ( i = 0; i < 10; i++)
{
if ((ListQueuePush(&Q, i + 1)) == 0)
{
printf("1error");
getchar();
return;
}
}
if ((ListQueueTop(&Q,&m))==0)
{
printf("2error");
getchar();
return;
}
else
{
printf("队头:%d\n", m);
}
/*while ((ListQueueNoEmpty(Q)) != 1)*/
i = 10;
while (i--)
{
if ((ListQueuePop(&Q,&x))==0)
{
printf("3error");
getchar();
return;
}
else
{
printf("%d ", x);
}
}
ListQueueDes(&Q);
getchar();
return 0;
}