注意点代码
本次实现的是队列的链式存储结构——链式队列。
默认采用头结点
这里唯一的注意点就是在出队时,需要额外判断是否是最后一个元素。如果是最后一个元素,需要把rear指针指向头结点。
代码#includeusing namespace std; // ADT // InitQueue(&Q) //初始化队列 // DestroyQueue(&Q) //销毁队列 // EnQueue(&Q,x) //入队 // DeQueue(&Q,&x) //出队 删除队头元素 // GetHead(Q,&x) //读队头元素 不改变队列 // IsEmpty(Q) //判断队列是否为空 // PrintQueue(Q) //顺序输出队列 typedef struct linkNode{ int data; linkNode* next; }linkNode; typedef struct linkQueue { linkNode* front,*rear; }linkQueue; // Code //初始化队列 带头结点 bool InitQueue(linkQueue &Q){ Q.front=Q.rear=(linkNode*)malloc(sizeof(linkNode));//初始时,队头队尾均指向0 Q.front->next=nullptr; return true; } //销毁队列 bool DestroyQueue(linkQueue &Q){ linkNode* p=Q.front; while (p!=nullptr) { Q.front=Q.front->next; free(p); p=Q.front; } return true; } //入队 bool EnQueue(linkQueue &Q,int x){ linkNode* p=(linkNode*)malloc(sizeof(linkNode)); p->data=x; p->next=nullptr; Q.rear->next=p; Q.rear=p; return true; } //出队 删除队头元素 bool DeQueue(linkQueue &Q,int &x){ if(Q.front==Q.rear)//队列为空 return false; linkNode* p=Q.front->next; x=p->data; Q.front->next=p->next; if(Q.rear=p)//如果p是最后一个元素 Q.rear=Q.front; free(p); return true; } //读队头元素 不改变队列 bool GetHead(linkQueue Q,int &x){ if(Q.front==Q.rear)//队列为空 return false; x=Q.front->next->data; return true; } //判断队列是否为空 bool IsEmpty(linkQueue Q){ if(Q.rear==Q.front) return true; else return false; } //顺序输出队列 void PrintQueue(linkQueue Q){ printf("队列元素为:"); linkNode*p =Q.front->next; while(p!=nullptr){ printf("%2d ",p->data); p=p->next; } printf("n"); } int main(){ linkQueue Q; //创建队列并入队元素 InitQueue(Q); EnQueue(Q,1); EnQueue(Q,2); EnQueue(Q,3); EnQueue(Q,4); EnQueue(Q,5); PrintQueue(Q); //出队一个元素 int x=-1; DeQueue(Q,x); printf("出队队列元素:%dn",x); PrintQueue(Q); //获得栈顶元素 GetHead(Q,x); printf("队列队头元素为:%dn",x); PrintQueue(Q); system("pause"); }
运行结果如图
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)