操作受限的线性表:链队列

队列的链式表示叫作链队列
和栈的链式存储一样,都是单链表的阉割版
以下实现的是带头结点的链队列 
(成员变量有结构体的结构体在访问成员时用->,其余用.)

//队列的链式表示叫作链队列
//和栈的链式存储一样,都是单链表的阉割版
//以下实现的是带头结点的链队列 
//(成员变量有结构体的结构体在访问成员时用->,其余用.)
//Elemtype:int 
#include
#include
typedef struct LinkNode{//链式队列节点 
	int data;//数据域 
	struct LinkNode* next;//指针域 
}LinkNode; 
typedef struct{//链式队列 
	LinkNode *front,*rear;//头尾指针 
}LinkQueue;

void InitQueue(LinkQueue &Q){
	Q.front=(LinkNode*)malloc(sizeof(LinkNode));//分配一个头结点,头指针指向头结点 
	Q.front->next=NULL;
	Q.rear = Q.front;//尾指针初始也指向头结点 
}

//other functions
bool IsEmpty(LinkQueue Q){//判空 
	if(Q.front==Q.rear)return true;
	else return false;
}

//important functions
void EnQueue(LinkQueue &Q,int x){//入队操作 
	LinkNode* s=(LinkNode*)malloc(sizeof(LinkNode));
	s->data=x;
	s->next=NULL;
	Q.rear->next=s;
	Q.rear=s;
}
bool DeQueue(LinkQueue &Q,int &x){//出队操作 
	if(Q.front==Q.rear)return false;
	LinkNode* p=Q.front->next;//p指向第一个数据元素
	x=p->data; 
	Q.front->next=p->next;
	if(p->next==NULL){//如果删除的节点为最后一个节点,将rear指向头结点 
		Q.rear=Q.front;
	}
	free(p);//释放被删除的节点,p函数结束后系统会自动回收 
	return true;
}

int main(){
	LinkQueue Q;
	InitQueue(Q);
	EnQueue(Q,1);
	EnQueue(Q,2);
	EnQueue(Q,3);
	EnQueue(Q,4);
	int x;
	DeQueue(Q,x);
	printf("%d",x);
	return 0;
}

 

你可能感兴趣的:(算法/数据结构)