链式队列
warning:
这篇文章距离上次修改已过424天,其中的内容可能已经有所变动。
#include<stdio.h>
#include<stdlib.h>
#define queuesize 128
struct Node{
int data;//数据域
struct Node* next;//队列指针域
};//节点定义
struct Queue{
Node* first;//指向首节点
Node* last;//指向尾节点
int size;
};//队列定义
Node* initnode(int value){
Node* newnode=(Node*)malloc(sizeof(Node));
newnode->data=value;
newnode->next=NULL;
return newnode;
}//初始化节点
Queue* initqueue(){
Queue* Q=(Queue*)malloc(sizeof(Queue));
Q->first=NULL;
Q->last=NULL;
Q->size=0;
return Q;
}//初始化队列
int isfull(Queue* Q){
return (Q->size==queuesize);
}//判断队列是否已满
int isempty(Queue* Q){
return (Q->first==NULL);
}//判断队列是否已空
void printqueue(Queue* Q){
if(isempty(Q)){
printf("当前队列为空\n");
return;
}
else{
Node* qmove=Q->first;//初始化游标为队首
while(qmove!=NULL){
printf("%d ",qmove->data);
qmove=qmove->next;
}
printf("\n");
}
}//正序打印队列
void pushqueue(Queue* Q){
int value;
printf("请输入需入队元素值为:");
scanf("%d",&value);
Node* newnode=initnode(value);//初始化创建节点
if(isfull(Q)){
printf("队列已满,请删除元素\n");
return;
}
else{
if(isempty(Q)){//队列为空
Q->first=newnode;//队首设置为该节点
Q->last=newnode;//队尾设置为该节点
}
else{//尾插法插入节点
Q->last->next=newnode;//原队尾的next指针指向新节点
Q->last=newnode;//队尾设置为新结点
}
Q->size++;
}
}//队列尾插元素
void popqueue(Queue* Q){
if(isempty(Q)){
printf("当前队列为空,无法进行删除\n");
return;
}
else{
Node* oldnode=Q->first;//缓存队首地址
Q->first=Q->first->next;//队首设置为原首节点next指针指向的下一个节点
free(oldnode);//释放原队首
Q->size--;
}
}//队列头删元素
void returnlen(Queue* Q){
printf("当前队列长度为%d\n",Q->size);
}//返回队列长度
void searchqueue(Queue* Q){
if(isempty(Q)){
printf("当前队列为空\n");
return;
}
else{
int value,index=1;
printf("请输入需查询元素值为:");
scanf("%d",&value);
Node* qmove=Q->first;
while(qmove!=NULL){
if(qmove->data==value){
printf("查询成功,位置为%d\n",index);
return;
}
index++;
qmove=qmove->next;
}
}
printf("查询失败,队列中无该元素\n");
}//查询队列中元素
void clearqueue(Queue* Q){
if(isempty(Q))
free(Q);
else{
Node* node=Q->first;//缓存队首地址
Node* qmove=Q->first;
while(qmove!=NULL){
node=qmove;
qmove=qmove->next;
free(node);
}
free(Q);
}
printf("队列已清空销毁,将自动结束程序\n");
exit(0);
}//清空队列
void queuemenu(){
printf("1.正序打印队列\n");
printf("2.元素入队\n");
printf("3.元素出队\n");
printf("4.返回队列长度\n");
printf("5.根据值查询元素位置\n");
printf("6.清空队列\n");
printf("0.退出程序\n");
}//队列功能菜单
void endsystem(Queue* Q){
clearqueue(Q);
exit(0);
}//结束程序
int main(){
Queue* Q=initqueue();//初始化创建栈
int sort,flag=1;
while(flag){
queuemenu();
printf("请输入数字选择功能:");
scanf("%d",&sort);
switch(sort){
case 1:{
printqueue(Q);
break;
}
case 2:{
pushqueue(Q);
break;
}
case 3:{
popqueue(Q);
break;
}
case 4:{
returnlen(Q);
break;
}
case 5:{
searchqueue(Q);
break;
}
case 6:{
clearqueue(Q);
break;
}
case 0:{
endsystem(Q);
break;
}
}
printf("\n");
}
}
评论已关闭