队列的链式表示和实现

来源:互联网 发布:tracert 路由节点优化 编辑:程序博客网 时间:2024/05/02 02:57
/*队列的链式表示和实现 (带头结点的链式队列)*/#include<stdio.h>//定义 typedef struct QNode{int data;struct QNode *next;}QNode,*QueuePtr;typedef struct{QueuePtr front;QueuePtr rear;}LinkQueue;/*初始化:算法思想:生成一个头结点,是队头指针和队尾指针都指向该头结点,并将头结点的指针域置空。 */ int InitQueue(LinkQueue &Q){//构造一个空队列 Q.front=Q.rear=new QNode;if(!Q.front){return 0;//没有生成头结点,初始化失败. }Q.front->next=NULL;return 1; }/*入队操作:算法思想:首先为入队的元素分配一个新的结点,将新元素插入到队尾;并修改队尾指针的值. */ int EnQueue(LinkQueue &Q,int e){//插入e为Q的新的队尾元素struct QNode *s;s=new QNode;if(!s){return 0;//存储分配失败 }s->data=e;s->next=NULL;Q.rear->next=s;Q.rear=s;//修改尾指针 return 1;}/*链队出队算法:首先判断队列是否为空,若空返回0;否则取出Q的队头元素,用e返回其值,修改指针。另外考虑当队列的最后一个元素被删除时,队列的尾指针就消失了需要修改尾指针,让其指挥头结点. */int DeQueue(LinkQueue &Q,int &e){struct QNode *p;if(Q.front==Q.rear){return 0;//队列为空 }p=Q.front->next;//指针p指向队列的第一个元素e=p->data;Q.front->next=p->next;if(Q.rear==p){Q.rear=Q.front;}delete p;return 1;}int main(){LinkQueue Q;if(InitQueue(Q)){printf("链队Q初始化成功!\n");}else{printf("链队Q初始化失败!\n");}int n;printf("请输入入队元素的个数:");scanf("%d",&n);for(int i=0;i<n;i++){int e;printf("请输入地%d个入队的元素:",i+1);scanf("%d",&e);EnQueue(Q,e);}int e;DeQueue(Q,e);printf("队头元素:%d",e);}

0 0