队列的链表实现

本文介绍如何使用C语言通过链表实现队列,强调了队列头文件不应包含链表操作,并讨论了前后置队尾元素的优化,使得插入和删除操作达到O(1)的时间复杂度。
摘要由CSDN通过智能技术生成

数据结构与算法分析——c语言描述 第三章 队列的链表实现

虽然是用链表实现,但队列头文件可不能有链表的函数,封装隐藏起来,所以在.c文件里,函数前面加了一个static,相当于c++的private下的函数。用脑想一想拆分功能,模块化。


2016.3.25更新,以前的版本是rear在最全,front在最后。上课听了老师讲后,改成front在前,rear在后,省去了遍历,复杂度为O(1)。


queue_cursor.h

typedef int ElementType;

#ifndef _queue_cursor_h
#define _queue_cursor_h

struct QueueRecord;
typedef struct QueueRecord *Queue;

struct Node;
typedef struct Node *PtrToNode;
typedef PtrToNode List;
typedef PtrToNode Position;

int IsEmpty(Queue Q);
Queue CreateQueue();
void DisposeQueue(Queue Q);
void MakeEmpty(Queue Q);
void Enqueue(ElementType X, Queue Q);
ElementType Front(Queue Q);
void Dequeue(Queue Q);
ElementType FrontAndDequeue(Queue Q);
#endif



queue_cursor.c

#include "queue_cursor.h"
#include "fatal.h"
#include <stdlib.h>

struct QueueRecord {
	List L;
	PtrToNode Rear;
	int Size;
};

struct  Node {
	ElementType Element;
	Position Next;
};

static void DeleteList(List L) {
	Position p;
	p = L->Next;
	L->Next = NULL;
	while (p != NULL) {
		Position tmp;
		tmp = p->Next;
		free(p);
		p = tmp;
	}
}

static void DisposeList(List L) {
	DeleteList(L);
	free(L);
}

static void Insert(ElementType X, Queue Q, Position P) {
	Position tmpCell;
	tmpCell = malloc(sizeof(struct Node));
	if (tmpCell == NULL)
		FatalError("Out of space!!");
	tmpCell->Element = X;
	if (P->Next == NULL)
		Q->Rear = tmpCell;
	tmpCell->Next = P->Next;
	P->Next = tmpCell;
}

static List creatList() {
	List L = malloc(sizeof(struct Node));
	if (L == NULL)
		Error("out of memory");
	L->Next = NULL;
	return L;
}

int IsEmpty(Queue Q) {
	return Q->Size == 0;
}

Queue CreateQueue() {
	Queue q;
	q = malloc(sizeof(struct QueueRecord));
	if (q == NULL)
		Error("out of memory");
	q->L = creatList();
	q->Rear = q->L;
	q->Size = 0;
	return q;
}

void DisposeQueue(Queue Q) {
	if (Q != NULL) {
		DisposeList(Q->L);
		free(Q);
	}
}

void MakeEmpty(Queue Q) {
	DeleteList(Q->L);
	Q->Rear = Q->L;
	Q->Size = 0;
}

void Enqueue(ElementType X, Queue Q) {
	Insert(X, Q, Q->Rear);
	Q->Size++;

}

ElementType Front(Queue Q) {
	if (IsEmpty(Q))
		Error("Empty queue");
	return Q->L->Next->Element;
}

void Dequeue(Queue Q) {
	if (IsEmpty(Q))
		Error("Empty queue");
	Position temp = Q->L->Next->Next;
	free(Q->L->Next);
	Q->L->Next = temp;
	Q->Size--;

}

ElementType FrontAndDequeue(Queue Q) {
	ElementType X = Front(Q);
	Dequeue(Q);
	return X;
}





main.c

#include<stdlib.h>
#include<stdio.h>
#include"queue_cursor.h"
int main() {
	Queue q = CreateQueue();
	for (int i = 0; i < 8; i++){
		Enqueue(i, q);
	}
	printf("%d\n", FrontAndDequeue(q));
	printf("%d\n", FrontAndDequeue(q));
	printf("%d\n", FrontAndDequeue(q));
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值