Queue-链式存储实现
结构思想
1、定义结点-由数据域和指针域组成
2、定义队头和队尾指针。
typedef struct QNode{
int data; //数据域
struct QNode *next; //指针域 ,尾指针域为空,
}QNode,*QueuePtr;
typedef struct{//相当于定义了两个结点类型的变量
QNode *front;//等价于QueuePtr front; 队头指针
QNode *rear;//等价于QueuePtr rear; 队尾指针
int length;//队列长度
}linkQueue;
代码实现:
#include#include //链队列结构 //结点的结构 typedef struct QNode{ int data; //数据域 struct QNode *next; //指针域 ,尾指针域为空, }QNode,*QueuePtr; typedef struct{//相当于定义了两个结点类型的变量 QNode *front;//等价于QueuePtr front; 队头指针 QNode *rear;//等价于QueuePtr rear; 队尾指针 int length;//队列长度 }linkQueue; //初始化空链队列- linkQueue InitLQueue(); //创建队列-加入元素值0-i的值 void CreateLQueue(linkQueue &Q,int i); //入队 void EnQueue(linkQueue &Q,int e); //出队 void DeQueue(linkQueue &Q,int &e); //返回队头元素 int GetHead(linkQueue Q); //判断队列空 bool QueueisEmpty(linkQueue Q); //遍历队列- void QueueTraverse(linkQueue Q); //主函数 int main(){ //初始化空链队列- linkQueue Q = InitLQueue();//创建空队列Q printf("创建队列成功!"); printf("n");printf("n");printf("n"); //创建队列-加入元素值0-i的值 printf("---进行赋值操作---n"); int m,i; printf("输入m:"); scanf("%d",&m); printf("0-m将被依次输入到队列中!n"); CreateLQueue(Q,m); printf("赋值成功!!!n"); printf("当前队列元素,从头到尾:"); QueueTraverse(Q); printf("n");printf("n");printf("n"); //入队 printf("---进行入队操作---n"); int e; printf("输入入队的元素值e:"); scanf("%d",&e); EnQueue(Q,e); printf("入队成功!!!n"); printf("当前队列元素,从头到尾:"); QueueTraverse(Q); printf("n");printf("n");printf("n"); //出队 printf("---进行出队操作---n"); if(Q.front == Q.rear){ printf("队列为空!!n"); } else{ int a; DeQueue(Q,a); printf("出队成功!!!n"); printf("出队的元素值为:%dn",a); } printf("当前队列元素,从头到尾:"); QueueTraverse(Q); printf("n");printf("n");printf("n"); //返回队头元素 printf("---进行查找队头操作---n"); int QueueHead = GetHead(Q); if(QueueHead!=-1){ printf("队列的头为:%dn",QueueHead); } printf("n");printf("n");printf("n"); //判断队列空 printf("---进行判空操作---n"); if(QueueisEmpty(Q)){ printf("队列为空!!n"); } else{ printf("队列不为空!!n"); } printf("n");printf("n");printf("n"); //遍历队列- printf("---进行遍历操作---n"); printf("当前队列元素,从头到尾:"); QueueTraverse(Q); printf("遍历对列成功!!"); printf("n");printf("n");printf("n"); return 0; } //初始化-带头结点 linkQueue InitLQueue(){ linkQueue Q; Q.front = Q.rear = (QNode *) malloc (sizeof(QNode)); if(!Q.front){ printf("内存分配失败!!"); exit(0); } Q.length = 0; Q.front->next = NULL; return Q; } //创建 void CreateLQueue(linkQueue &Q,int e){ for(int i=0;i<=e;i++){ QueuePtr p; p=(QueuePtr)malloc(sizeof(QNode));//为新结点申请空间 if(!p){ exit(0); } p->data=i;//将元素e存到新空间中 p->next=NULL; // 将新结点插到队尾 Q.rear->next=p; Q.rear=p; Q.length++; } } //入队 void EnQueue(linkQueue &Q,int e){ QueuePtr p = (QueuePtr) malloc (sizeof(QNode));//只需要创建一个结点即可; if(!p){ printf("内存分配失败!!");exit(0); } p->data = e; p->next = NULL; Q.rear->next = p; Q.rear = p; Q.length ++; } //出队 void DeQueue(linkQueue &Q,int &e){ QueuePtr p = Q.front->next; e = p->data; Q.front->next = p->next; Q.length--; if(Q.rear == p){ Q.rear = Q.front; } } //取队头 int GetHead(linkQueue Q){ if(Q.front != Q.rear){ return Q.front->next->data; } else { printf("队列为空!!"); return -1; } } //判空 bool QueueisEmpty(linkQueue Q){ if(Q.front == Q.rear){ return true; } else { return false; } } //遍历整个队列 void QueueTraverse(linkQueue Q){ while(Q.front!=Q.rear){ printf("%d ",Q.front->next->data); Q.front = Q.front->next; } }
实现案例:



