数据结构考研复习(链式队列)
与循环队列不同,链式队列通常被设计为带头结点的单链表,队首指针指向头结点,队尾指针指向队尾结点。
具体代码如下:
#include<stdio.h> #include<malloc.h> typedef struct LinkNode{ //链式队列结点 int data; struct LinkNode *next; }LinkNode; typedef struct{ //链式队列 LinkNode *front,*rear; }LinkQueue; /* -1- 初始化链式队列*/ void InitQueue(LinkQueue &Q){ Q.front = Q.rear = (LinkNode*)malloc(sizeof(LinkNode)); //建立头结点 Q.front->next = NULL; //初始为空 } /* -2- 判断是否空队列*/ bool IsEmpty(LinkQueue Q){ if(Q.front == Q.rear) { return true; } else { return false; } } /* -3- 入队(插入元素)*/ bool EnQueue(LinkQueue &Q,int e){ LinkNode *temp = (LinkNode*)malloc(sizeof(LinkNode)); temp->data = e; temp->next = NULL; //创建新结点,插入到尾链 Q.rear->next = temp; Q.rear = temp; } /* -4- 出队*/ bool DeQueue(LinkQueue &Q,int &e){ if(IsEmpty(Q)){ printf("空链队!\n"); return false; } LinkNode *temp = Q.front->next; //找到首元节点的位置 e = temp->data; Q.front->next = temp->next; //指针后移 if(Q.rear == temp) { Q.rear = Q.front; //若原队列只有一个结点,删除变空 } free(temp); return true; } int main(){ LinkQueue Q; InitQueue(Q); printf("*请输入队列长度:\n"); int e,length,temp,i=1; scanf("%d",&length); temp = length; printf("\n*请依次输入%d个元素\n\n",length); while(length > 0){ printf("请输入第%d个元素:\n",i); scanf("%d",&e); EnQueue(Q,e); length--; i++; } printf("\n*请进行选择:\n"); printf("==============\n\n"); printf("==1.循环出队\n"); printf("==2.当前队首、队尾元素\n"); int flag; scanf("%d",&flag); switch(flag){ case(1): { printf("\n当前队列为:\n"); while(temp > 0){ int e; if(temp != 1) { printf("%d->",Q.front->next->data); } else { printf("%d",Q.front->next->data); } DeQueue(Q,e); temp--; } break; } case(2): { printf("当前队首元素为:%d\n",Q.front->next->data); printf("当前队尾元素为:%d\n",Q.rear->data); break; } } return 0; }
最终结果: