队列的链式表示和实现

/*队列,先进后出,插入的东西放在队尾,
取出时从队列拿出*/
#include<stdio.h>
#include<malloc.h>

/*直接将结构体的对象和指针类型用一种简省
的类型替代*/
typedef struct QNode{
	int data;
	struct QNode *next;
}QNode, *QePtr;

/*下面这个结构体是相当重要的,
这样的话,在函数里只需要传QPtr类型的e对象
这样就可以使用属性和属性的属性,不,这是必须的*/
typedef struct{
    QePtr front;
    QePtr rear;
}QPtr;

void InitQueue(QPtr &Q);
void EnQueue(QPtr &Q, int e);
void DestroyQueue(QPtr &Q);
void DeQueue(QPtr &Q, int &e);
void print(QPtr Q);

main(){
    QPtr Q;
	int e, i;
	//初始化队列
	printf("初始化队列\n");
	InitQueue(Q);
	for(i=5; i>0; i--){
        printf("输入数据:");
        scanf("%d", &e);
        EnQueue(Q, e);
	}
	print(Q);
	///
	printf("插入新的队尾元素\n");
	printf("请输入:");
	scanf("%d", &e);
	EnQueue(Q, e);
	print(Q);
	/
	printf("删除两个队头节点\n");
	printf("删除队头节点\n");
	DeQueue(Q, e);
	printf("%d\n", e);
	print(Q);
	printf("删除队头节点\n");
	DeQueue(Q, e);
	printf("%d\n", e);
	print(Q);
	/
	printf("摧毁队列\n");
	DestroyQueue(Q);
	print(Q);
}

void InitQueue(QPtr &Q){
	//构造一个空队列
	/*队头指针里面存的地址是QPtr类型所占的一段内存的首地址,
	而这段内存其实是不存数据的,也就是说front指针所指向的内存
	不是数据区,只是一段空内存,如果队列里面有数据的话,那么
	rear指向的是存有数据的内存*/
	Q.front = Q.rear = (QePtr)malloc(sizeof(QNode));
	if(!Q.front){
		printf("error");
		exit(0);
	}
	Q.front->next = NULL;
}

void EnQueue(QPtr &Q, int e){
	QePtr p;
	//插入元素为Q的新的队尾元素
	p = (QePtr)malloc(sizeof(QNode));
	if(!p){
		printf("error");
		exit(0);
	}
	p->data = e;
	p->next = NULL;

	Q.rear->next = p;
	Q.rear = p;
}


void DestroyQueue(QPtr &Q){
	//销毁队列
	while(Q.front){
		Q.rear = Q.front->next;
		free(Q.front);
		/*释放的不是指针,而是指针所指向的内存,
		且指针不变,某一次,rear成为真正的队尾,
		好,写的真纠结,真得仔细看啊*/
		Q.front = Q.rear;
	}
}


void DeQueue(QPtr &Q, int &e){
	//若队列不空,则删除Q的对头元素,用e返回其值,并返回OK
	//否则返回ERROR
	QePtr p;
	if(Q.front == Q.rear)
		return;
    /*Q.front是不存有效数据的QPtr类型的一段内存的首地址,
    反正不用它*/
	p = Q.front->next;
	e = p->data;
	Q.front->next = p->next;
}

void print(QPtr Q){
    QePtr pt;
    if(Q.front == Q.rear){
        printf("空队列");
        return;
    }
    pt = Q.front->next;
    while(pt){
        printf("%d", pt->data);
        pt = pt->next;
    }
    printf("\n"); 
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值