05 -- 队列

顺序循环队列

seqqueue.h

#ifndef __SEQQUEUE_H__
#define __SEQQUEUE_H__

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

#define MAX 10
typedef struct NODE{
        int data[MAX];
        int head;
        int tail;
}seqqueue;


seqqueue* seqqueue_create();
void seqqueue_in(seqqueue*Q,int value);
int seqqueue_out(seqqueue*Q);

#endif

seqqueue.c

#include "seqqueue.h"

#define MAX 10
seqqueue* seqqueue_create()
{
	seqqueue*Q =NULL;

	Q = (seqqueue*)malloc(sizeof(seqqueue));
	Q->head = 0%MAX;
	Q->tail = -1%MAX;
}
void seqqueue_in(seqqueue*Q,int value)
{
	Q->tail +=1;
	Q->tail = Q->tail%MAX;
	Q->data[Q->tail] = value;
}
int seqqueue_out(seqqueue*Q)
{
	int value = Q->data[Q->head];
	Q->head += 1;
	Q->head = Q->head%MAX;
	return value;
}

seqqueue_test.c

#include "seqqueue.h"

void main()
{
	seqqueue*Q = seqqueue_create();

	printf("\n入循环队列10,20...120,循环队列空间10\n");
	seqqueue_in(Q,10);
	seqqueue_in(Q,20);
	seqqueue_in(Q,30);
	seqqueue_in(Q,40);
	seqqueue_in(Q,50);
	seqqueue_in(Q,60);
	seqqueue_in(Q,70);
	seqqueue_in(Q,80);
	seqqueue_in(Q,90);
	seqqueue_in(Q,100);
	seqqueue_in(Q,110);
	seqqueue_in(Q,120);
	printf("\n出循环队列:\n");

	printf("%d\t",seqqueue_out(Q));
	printf("%d\t",seqqueue_out(Q));
	printf("%d\t",seqqueue_out(Q));
	printf("%d\t",seqqueue_out(Q));
	printf("%d\t",seqqueue_out(Q));
	printf("%d\t",seqqueue_out(Q));
	printf("%d\t",seqqueue_out(Q));
	printf("%d\t",seqqueue_out(Q));
	printf("%d\t",seqqueue_out(Q));
	printf("%d\t",seqqueue_out(Q));
}

Makefile

seqqueue_text:seqqueue.o seqqueue_text.c
	gcc seqqueue.o seqqueue_text.c -o seqqueue_text

seqqueue.o:seqqueue.c seqqueue.h
	gcc seqqueue.c -c -o seqqueue.o

.PHONY:clean
clean:
	rm -rf seqqueue.o seqqueue_text

运行结果

入循环队列1020...120,循环队列空间10

出循环队列:
110	120	30	40	50	60	70	80	90	100	

链式队列

listqueue.h

#ifndef __LINKQUEUE_H__
#define __LINKQUEUE_H__

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

typedef struct NODE{
	int data;
	struct NODE*next;
}listqueue_node;

typedef struct LNODE{
	listqueue_node* head;
	listqueue_node* tail;
}listqueue_t;

listqueue_t* listqueue_create(void);

void listqueue_in(listqueue_t*LQ,int value);

int listqueue_out(listqueue_t*LQ);

#endif

listqueue.c

#include "listqueue.h"

listqueue_t* listqueue_create(void)
{
	listqueue_t*LQ = NULL;
	LQ = (listqueue_t*)malloc(sizeof(listqueue_t));
	LQ->tail = (listqueue_node*)malloc(sizeof(listqueue_node));	 //注意:嵌套结构体对象,需要多个malloc
	LQ->head = (listqueue_node*)malloc(sizeof(listqueue_node));	
	LQ->tail->next = NULL;
	LQ->head->next = LQ->tail;
	return LQ;	
}

void listqueue_in(listqueue_t*LQ,int value)
{
	//插入节点作为尾节点
	listqueue_node *P;
	P = (listqueue_node*)malloc(sizeof(listqueue_node));
	P->data = value;
	LQ->tail->next = P;
	LQ->tail = P;
}

int listqueue_out(listqueue_t*LQ)
{
	//头节点后移
	int value;
	listqueue_node *P = LQ->head;
	LQ->head = LQ->head->next; 
	P->next=NULL;
	value = P->data;
	free(P);
	return value;
}

listqueue_test.c

#include "listqueue.h"

void main()
{
	listqueue_t *LQ;
	int P;
	LQ = listqueue_create();
	listqueue_in(LQ,10);
	listqueue_in(LQ,20);
	listqueue_in(LQ,30);
	listqueue_in(LQ,40);
	listqueue_in(LQ,50);
	
	
	printf("%d\t",listqueue_out(LQ));
	printf("%d\t",listqueue_out(LQ));
	//出队
	printf("%d\t",listqueue_out(LQ));
	printf("%d\t",listqueue_out(LQ));
	printf("%d\t",listqueue_out(LQ));
	printf("%d\t",listqueue_out(LQ));
	printf("%d\t",listqueue_out(LQ));
}


Makefile

listqueue_text:listqueue.o listqueue_text.c
	gcc -g listqueue.o listqueue_text.c -o listqueue_text

listqueue.o:listqueue.c listqueue.h
	gcc -g listqueue.c -c -o listqueue.o

.PHONY:clean
clean:
	rm -rf listqueue.o listqueue_text

执行结果

root@ubuntu:/home/yqj/desktop/链式队列# ./listqueue_text 
0	0	10	20	30	40	50	
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值