注意:一定要搞清什么时候需要释放内存,什么时候不用。。
/**
* name:队列
* time:15/8/16 16:26
*/
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
//宏定义
#define NO 0
#define YES 1
#define OK 2
#define ERROR 3
#define INFEASIBLE -1
#define OVERFLOW -2
#define EMPTY -3
typedef int Status;
typedef int ElemType;
typedef struct LNode
{
ElemType data;
struct LNode* next;
}LNode,*LinkList;
typedef struct Queue
{
LinkList front;
LinkList rear;
}Queue;
Status initQueue(Queue &queue)
{
queue.front = (LinkList)malloc(sizeof(LNode)); //这是在堆中分配地址,后面需要释放
if(queue.front == NULL)
{
exit(ERROR);
}
queue.rear = queue.front; //单独写这一行也可以
//是在静态区分配内存的,所以不需要手动释放。
return OK;
}
Status isEmpty(Queue queue)
{
if(queue.front->next == NULL)
{
return YES;
}else{
return NO;
}
}
Status enQueue(Queue &queue,ElemType ele)
{
LinkList list;
list = (LinkList)malloc(sizeof(LinkList));
if(!list)
{
exit(ERROR);
}
list->data = ele;
list->next = NULL;
queue.rear->next = list;
queue.rear = queue.rear->next;
}
Status deQueue(Queue &queue,ElemType &ele)
{
LinkList list;
if(isEmpty(queue) == YES)
{
cout << "队列为空" << endl;
exit(ERROR);
}
ele = queue.front->next->data;
list = queue.front->next;
queue.front->next = list->next;
free(list); //这个地方要注意:一定要释放内存free,它释放的不是list本身的空间,而是list所指向的这片内存区域。
//list本身是局部变量,局部变量存放在栈区,
// list指针指的区域是queue.front->next指向的区域,在入栈的时候用malloc分配的内存,是动态数据,存放在堆区,
//所以必须要释放,不然会造成内存泄露。
return OK;
}
int main(int argc, char const *argv[])
{
Queue queue; //这个地方不是全局变量,是局部变量,它的有效范围是main里面
initQueue(queue);
enQueue(queue,2);
enQueue(queue,3);
enQueue(queue,4);
ElemType aa;
deQueue(queue,aa);
cout << aa << endl;
ElemType bb;
deQueue(queue,bb);
cout << bb << endl;
deQueue(queue,bb);
cout << bb << endl;
deQueue(queue,bb);
cout << bb << endl;
deQueue(queue,bb);
cout << bb << endl;
free(queue.front); //释放队头内存,根据初始化的情况而定。
return 0;
}
//结果:
//2
//3
//4
//队列为空