3.6使用带头结点的循环链表链表表示队列

来源:互联网 发布:守护进程 windows 编辑:程序博客网 时间:2024/05/29 13:21
题目描述:
用带头结点的循环链表表示队列,并设置一个尾指针指向队尾元素。
不设置投指针。编写置队空,判断队空,出队,入队等算法, 




/*链队结构定义 *///定义节点类型 typedef struct QNode{int data;//数据域 struct QNode *next;//指针域 }QNode,*QueuePtr;//只设置一个尾指针 typedef struct{QueuePtr rear;//尾指针 }LinkQueue;

初始化:

就是创建一个只有头结点的循环链表,队列的尾指针指向头结点,头结点的指针域指向头结点本身。

/*1.首先生成一个头结点,并分配存储空间; 2.初始时,尾指针指向头结点,头结点的指针域指向尾指针 带有一个尾指针,初始时,尾指针指向头结点。尾指针指向的是链表的最后一个元素,假设尾指针为p,则,p=头结点这里尾指针是Q.rear,则Q.rear=头结点 */int InitQueue(LinkQueue &Q){Q.rear=new QNode;if(!Q.rear){return 0;//存储分配失败 } Q.rear->next=Q.rear;// return 1;}

//判断队列是否为空/*由于尾指针指向最后一个结点,所以当尾指针执行那个本身,即Q.rear->next=Q.rear时,表示队列为空。 */int IsEmpty(LinkQueue &Q){if(Q.rear->next==Q.rear){return 1;//空 }else{return 0;}}


//将队列置空//就是将除了头结点以外的结点删除 int InitEmpty(LinkQueue &Q){//QNode *s;//用节点s暂时保存要删除的节点 Q.rear=Q.rear->next;//将尾指针指向头结点 while(Q.rear=Q.rear->next){struct QNode *s;s=new QNode;s=Q.rear->next->next;//s指向第一个元素(结点)Q.rear->next->next=s->next;delete s;}return 1;}



//入队操作int  EnQueue(LinkQueue &Q,int e){struct QNode *p;p=new QNode;if(!p){return 0;//存储分配失败 }p->data=e;p->next=Q.rear->next;Q.rear->next=p;Q.rear=p;return 1;}


//出队int DeQueue(LinkQueue &Q,int &e){if(Q.rear->next==Q.rear){return 0;//队空 }struct QNode *p;p=Q.rear->next->next;//p指向第一个节点 e=p->data;if(p==Q.rear){//当只有一个元素时,p出队后,要将队尾指针指向头结点Q.rear=Q.rear->next;Q.rear->next=p->next; }else{Q.rear->next->next=p->next;delete p;}return 1; }


#include<stdio.h>#define MAX 100/*链队结构定义 *///定义节点类型 typedef struct QNode{int data;//数据域 struct QNode *next;//指针域 }QNode,*QueuePtr;//只设置一个尾指针 typedef struct{QueuePtr rear;//尾指针 }LinkQueue;/*1.首先生成一个头结点,并分配存储空间; 2.初始时,尾指针指向头结点,头结点的指针域指向尾指针 带有一个尾指针,初始时,尾指针指向头结点。尾指针指向的是链表的最后一个元素,假设尾指针为p,则,p=头结点这里尾指针是Q.rear,则Q.rear=头结点 */int InitQueue(LinkQueue &Q){Q.rear=new QNode;if(!Q.rear){return 0;//存储分配失败 } Q.rear->next=Q.rear;// return 1;}//判断队列是否为空/*由于尾指针指向最后一个结点,所以当尾指针执行那个本身,即Q.rear->next=Q.rear时,表示队列为空。 */int IsEmpty(LinkQueue &Q){if(Q.rear->next==Q.rear){return 1;//空 }else{return 0;}}//将队列置空//就是将除了头结点以外的结点删除 int InitEmpty(LinkQueue &Q){//QNode *s;//用节点s暂时保存要删除的节点 Q.rear=Q.rear->next;//将尾指针指向头结点 while(Q.rear=Q.rear->next){struct QNode *s;s=new QNode;s=Q.rear->next->next;//s指向第一个元素(结点)Q.rear->next->next=s->next;delete s;}return 1;}//入队操作int  EnQueue(LinkQueue &Q,int e){struct QNode *p;p=new QNode;if(!p){return 0;//存储分配失败 }p->data=e;p->next=Q.rear->next;Q.rear->next=p;Q.rear=p;return 1;}//出队int DeQueue(LinkQueue &Q,int &e){if(Q.rear->next==Q.rear){return 0;//队空 }struct QNode *p;p=Q.rear->next->next;//p指向第一个节点 e=p->data;if(p==Q.rear){//当只有一个元素时,p出队后,要将队尾指针指向头结点Q.rear=Q.rear->next;Q.rear->next=p->next; }else{Q.rear->next->next=p->next;delete p;}return 1; } int main(){LinkQueue Q;if(InitQueue(Q)){printf("链队初始化成功.\n");}else{printf("链队初始化失败.\n");}if(IsEmpty(Q)){printf("队列为空.\n");}else{printf("队列非空.\n");}int n;printf("请输入入队元素的个数:");scanf("%d",&n);for(int i=0;i<n;i++){int e;printf("请输入第%d个入队的元素:",i+1);scanf("%d",&e);if(EnQueue(Q,e)){printf("入队成功.\n");}else{printf("入队失败.\n"); }}int s;DeQueue(Q,s); printf("队头元素出队:%d",s);} 


0 0
原创粉丝点击