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
- 3.6使用带头结点的循环链表链表表示队列
- 带头结点的循环链表表示队列的初始化、入队列和出队列的算法
- 带头结点的循环链表表示队列的初始化、入队列和出队列的算法
- 用带头循环链表表示队列的问题
- 假设以带头结点的循环链表表示队列, 并且只设一个指针指向队尾元素结点(注意不设头指针) 试编写相应的队列初始化,入队列和出队列的算法
- 假设以不带头结点的循环链表表示队列,并且只设一个指针指向队尾结点,但不设头指针。试设计相应的入队和出队的算法
- 使用不带头结点的循环链表实现队列(数据结构)
- 循环队列的链表表示
- 设以带头结点的双向循环链表表示的线性表L=(a1,a2,……,an)。
- 带头结点的链队列实现
- 带头结点的双向循环链表
- 带头结点的双向循环链表
- 带头结点的循环单向链表
- 带头结点的双向循环链表
- 带头结点的循环单链表
- 带头结点循环链表
- 设以带头结点的双向循环链表表示的线性表L= (a1,a2,…,an),试写一时间复杂度O(n)的算法,将L改造为 (a1,a3,…,an,…,a4,a2)。
- 带头结点的链队列实现(C语言)
- python opencv3 安装
- HBase 0.98 分布式集群安装详解
- 判断合法标识符
- ssh框架
- 鉴别图像中含有给定颜色的所有像素
- 3.6使用带头结点的循环链表链表表示队列
- leetcode 112 Path Sum
- 在windows上部署Redis系统服务
- 化零为整
- MIT 6.828 学习笔记6 Lab4实验报告
- Michael &Scott 无锁队列 C++ 实现
- 软件人才应具备的五种素质
- 回传数据的代理方法
- 堆和堆栈的区别