数据结构之队列(顺序队列和链队列)

参照书上及网上大神的算法思想所写代码
1.顺序队列:顺序队列的基本实现是顺序表,出队后再进队时会出现“假溢出”现象,所以用循环队列来实现,其核心步骤为:r = (r+1)%msize;(用于进队)和 f = (f+1)%msize;(用于出队)
具体的各个功能的实现类似于顺序栈的实现,顺序栈的实现
直接上完整代码

#include <stdio.h>
#include <stdlib.h>

typedef struct Queue{
	int f;
	int r;
	int msize;
	int *elem;//基指针
}Queue;

void Init(Queue *q,int msize){//初始化队列
	q->r = 0;
	q->f = 0;
	q->msize = msize;
	q->elem = (Queue*)malloc(q->msize * sizeof(Queue));
} 

int isEmpty(Queue *q){//判空
	if(q->r == q->f)
	return 1;
	return 0;
}

void destory(Queue *q){//销毁
	q->f = -1;
	q->r = -1;
	q->msize = -1;
	free(q->elem);
}

//进队 
void EnQueue(Queue *q,int x){
	if((q->r + 1)%q->msize == q->f)
	return;
	q->r = (q->r+1)%q->msize;
	q->elem[q->r] = x;
}

void DeQueue(Queue *q){//出队
	if(isEmpty(q))
	return;
	q->f = (q->f + 1)%q->msize;
}

int getTop(Queue *q){//获得队头顶元素
	if(!isEmpty(q))
	return q->elem[(q->f+1)%q->msize];
}

int main(int argc, char *argv[]) {
	Queue *q;
	Init(q,10);
	int i;
	for(i = 0; i < 7; i++){
		EnQueue(q,i);
	}
	printf("%d\n",getTop(q));
	DeQueue(q);
	printf("%d\n",getTop(q));
	EnQueue(q,9);
	printf("%d",q->elem[q->r]);
}

2.链队列:主要是通过移动对头指针和队尾指针来进行进队的操作,当对头指针和队尾指针同时指向头结点时,队列为空,其余各个功能的实现和单链表相似单链表的常用操作
完整代码如下

#include <stdio.h>
#include <stdlib.h>

typedef struct Noded{
	struct Noded *next;
	int data;
}Noded;

typedef struct{
	struct Noded *f;//头指针 
	struct Noded *r;//尾指针 
}link;
//对头指针和队尾指针都指向头结点时队列为空 
void Init(link *link){//初始化
	Noded *p = (Noded *)malloc(sizeof(Noded));
	if(!p)
	return; 
	link->f = p;
	link->r = p;
	link->r->next = NULL;//link->r->next始终不变 
}

void EnQueue(link *link,int x){//进队
	Noded *p = (Noded*)malloc(sizeof(Noded));
	p->data = x;
	p->next = NULL;
	link->r->next = p;
	link->r = p;
	
	
}

void DeQueue(link *link){//出队
	Noded *p = link->f;
	link->f = link->f->next;
	free(p);
}

void print(link *l){//打印
	Noded *p = l->f->next;
	while(p!=NULL){
		printf("%d ",p->data);
		p = p->next;
	}
}

int main(){
	link *link;
	Init(link);
	int i;
	for(i = 0; i < 7; i++){
		EnQueue(link,i);
	}
	print(link);
	printf("\n");
	DeQueue(link);
	print(link);
}

猜你喜欢

转载自blog.csdn.net/qq_43060759/article/details/83032892