まず、基本的な考え方
1.スタック動作のシーケンスは、要素を削除する場合、最初のノードを削除することを除いて、ほぼ同じです。
最後の時間を完全に解放するために解放することができますので、2トップポインタ挿入を使用してアプリケーションへのベースポインタによるスタック領域のシーケンスが、削除は、ベースには影響しません。
3.異なる順序キュー、フロント及びrear_next(次の位置最後の要素)の確立は、メモリフロントによるアプリケーションは、削除操作の前に変更された場合ならば
点は、メモリリーク最終リリースになります。
4.したがって、追加の専門的なメモリポインタの確立は、発生前を変更し、これが最後のメモリの解放には影響しませんrear_nextします。
次のように第二に、コードがあります
/*
项目名称:顺序队列的建立与基本操作
编译环境:VC++ 2008
作者相关:。。。
最后修改:2019.6.23
学习目标:初始化、销毁、清空、判空、求长、返回队头元素、插入元素、删除元素、输出队列中元素
注意事项:1.测试所有功能是否正常
*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define QUEUE_INIT_SIZE 100
#define QUEUEINCREMENT 10
#define ERROR 0
#define OK 1
typedef int ElemType;
typedef bool Status;
typedef struct{
ElemType *front;//头指针
ElemType *rear_next;//rear指向最后一个元素的下一个位置
ElemType *room;//用于产生动态内存
int queuesize;//队列容量
}SqQueue;
Status InitQueue(SqQueue *s);
Status DestroyQueue(SqQueue *s);
Status ClearQueue(SqQueue *s);
Status QueueEmpty(SqQueue s);
int QueueLength(SqQueue s);
Status GetHead(SqQueue s,ElemType *e);
Status EnQueue(SqQueue *s,ElemType e);
Status DeQueue(SqQueue *s,ElemType *e);
Status QueueTraverse(SqQueue s);
void visit(ElemType c);
int main()
{
SqQueue s;
ElemType e;
InitQueue(&s);
if(QueueEmpty(s))
printf("队列为空!\n\n");
else
printf("队列非空!\n\n");
int k = QueueLength(s);
printf("队列的长度为:%d \n\n",k);
for(int i=1;i<10;i++)
EnQueue(&s,i);
QueueTraverse(s);
GetHead(s,&e);
printf("队首元素为:%d \n\n",e);
DeQueue(&s,&e);
printf("删除的元素为:%d \n\n",e);
ClearQueue(&s);
DestroyQueue(&s);
return 0;
}
Status InitQueue(SqQueue *s)
{
s->room = (ElemType *)malloc(QUEUE_INIT_SIZE*sizeof(ElemType));
if(!s->room)
return ERROR;
s->rear_next = s->front = s->room;
s->queuesize = QUEUE_INIT_SIZE;
return OK;
}
Status DestroyQueue(SqQueue *s)
{
free(s->room);
return OK;
}
Status ClearQueue(SqQueue *s)
{
s->rear_next = s->front = s->room;
return OK;
}
Status QueueEmpty(SqQueue s)
{
if(s.rear_next==s.front)
return true;
else
return false;
}
int QueueLength(SqQueue s)
{
return s.rear_next-s.front;
}
Status GetHead(SqQueue s,ElemType *e)
{
if(!QueueEmpty(s))
*e = *s.front;
return OK;
}
Status EnQueue(SqQueue *s,ElemType e)//操作与栈相同
{
if(s->queuesize<=QueueLength(*s))
{
s->room = (ElemType *)realloc(s->room,
(s->queuesize+QUEUEINCREMENT)*sizeof(ElemType));
if(!s->room)
return ERROR;
s->front = s->room;
s->rear_next=s->room+s->queuesize;
s->queuesize+=QUEUEINCREMENT;
}
*s->rear_next++=e;
return OK;
}
Status DeQueue(SqQueue *s,ElemType *e)
{
if(QueueEmpty(*s))
return ERROR;
else
*e = *s->front++;
return OK;
}
Status QueueTraverse(SqQueue s)
{
printf("队列内容: ");
while(s.front != s.rear_next)
{
visit(*s.front);
++s.front;
}
printf("\n\n");
return OK;
}
void visit(ElemType c)
{
printf("%d ",c);
}
第三に、効果