数据结构-链队列

版权声明:转载请注明出处。 https://blog.csdn.net/baidu_38304645/article/details/82944906

队列类似线性表和栈,也是定义在线性结构上的ADT,与线性表和栈的区别在于,元素的插入和删除分别在表的两端进行,类似生活中的排队,允许插入的一端为队尾,允许删除端称队头。

用链表表示的队列称为链队列。一个链队列显然需要两个分别指示对头和队尾的指针才能唯一确定。

首先是定义辅助宏:

#define ERROR 0
#define OK 1
#define FALSE 0
#define TRUE 1
#define OVERFLOW -1
typedef int Status;
typedef int QElemType;

链队列的存储结构定义:

//链队列的存储结构定义
typedef struct QNode {
    QElemType data;
    struct QNode *next;
}QNode,*QueuePtr;
typedef struct{
    QueuePtr front;//队头指针
    QueuePtr rear;//队尾指针
}LinkQueue;

构造一个空队列Q.

Status InitQueue(LinkQueue &Q){
	//构造一个空队列Q
    Q.front=(QNode *)malloc(sizeof(QNode));
    if(!Q.front) 
        exit(OVERFLOW); //存储分配失败
    Q.rear=Q.front;
    Q.front->next=NULL;
    return OK;
}

销毁队列.

Status DestroyQueue(LinkQueue &Q){
	//销毁队列
    while(Q.front){ 
       Q.rear=Q.front->next;
       free(Q.front);
       Q.front=Q.rear;
	} 
    Q.front=NULL;
    Q.rear=NULL;
    return OK;
}

向队列中插入一个元素e.

Status EnQueue(LinkQueue &Q,QElemType e){
	//向队列中插入一个元素e
   QueuePtr p;
   p=(QueuePtr)malloc(sizeof(QNode));
   if(!p) //存储分配失败
	  exit(OVERFLOW);
   p->data=e;
   p->next=NULL;
   Q.rear->next=p;  //修改尾指针
   Q.rear=p;
   return OK;
}

若队列不空,则删除Q的队头元素,用e返回其值,并返回OK 否则返回ERROR.

Status DeQueue(LinkQueue &Q,QElemType &e){
	//若队列不空,则删除Q的队头元素,用e返回其值,并返回OK 否则返回ERROR
	if(Q.front==Q.rear)
		return ERROR;
    QueuePtr p=Q.front->next;  
    e=p->data;
    Q.front->next=p->next; 
    if(p==Q.rear) //只有一个结点时修改队尾指针
        Q.rear=Q.front; 
    free(p);
	p=NULL;
    return OK;
}

清空队列.

Status ClearQueue(LinkQueue &Q){
	//清空队列
    QueuePtr p=Q.front->next,q;
    while(p){ 
       q=p->next;
       free(p);
       p=q;
	}  
    Q.rear=Q.front;//修改队尾指针
    return OK;
}

若队列为空队列返回TRUE 否则返回FALSE.

Status QueueEmpty(LinkQueue &Q){
	//若队列为空队列返回TRUE 否则返回FALSE
    if(Q.front==Q.rear) 
        return TRUE;
    return FALSE;
}

返回队列的长度.

扫描二维码关注公众号,回复: 3429138 查看本文章
int QueueLength(LinkQueue &Q){
	//返回队列的长度
	int i=0;
    QueuePtr p=Q.front->next,q;
    while(p){ 
        i++;
        p=p->next;
	} 
    return i;
}

若队列不空用e返回 队头元素,并返回OK 否则返回ERROR.

Status GetHead(LinkQueue &Q,QElemType &e){
	//若队列不空用e返回 队头元素,并返回OK 否则返回ERROR
    if(Q.front==Q.rear)
        return ERROR;
    e=Q.front->next->data;
    return OK;
}

从队头到队尾依次对队列Q中的每个元素调用函数visit() 返回OK.一旦visit失败则操作失败。是空队列返回ERROR

Status QueueTraverse(LinkQueue &Q,Status (*visit)(QElemType &)){
	//从队头到队尾依次对队列Q中的每个元素调用函数visit() 返回OK.一旦visit失败则操作失败。是空队列返回ERROR
    if(Q.front==Q.rear)
       return ERROR;
    QueuePtr p=Q.front->next;
    while(p){
        visit(p->data);
        p=p->next;
	}  
    return OK;
}

猜你喜欢

转载自blog.csdn.net/baidu_38304645/article/details/82944906
今日推荐