我是靠谱客的博主 哭泣嚓茶,最近开发中收集的这篇文章主要介绍数据结构(C语言)-线性表之队列(顺序队列、链式队列)-学习笔记041. 基本介绍2. 顺序队列3. 链式队列,觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
文章目录
- 1. 基本介绍
- 2. 顺序队列
- 2.1 定义 sequeue.h
- 2.2 sequeue.c
- 3. 链式队列
- 3.1 定义 linkqueue.h
- 3.2 linkqueue.c
所有代码实现:Tian-hy/c_ds
1. 基本介绍
- 队列是限制在一端进行插入和另一端进行删除操作的线性表
- 允许进行存入操作的一端是队尾
- 允许进行删除操作的是队头
- 没有元素时是空队
- 先进先出
2. 顺序队列
2.1 定义 sequeue.h
#define N 128
typedef int data_t;
typedef struct{
data_t data[N];
int front, rear;
}sequeue;
sequeue *sequeue_create(); //创建队列
int sequeue_enqueue(sequeue *sq, data_t x);//入队
data_t sequeue_dequeue(sequeue *sq);//出队
int sequeue_empty(sequeue *sq);//判断队是否为空
int sequeue_full(sequeue *sq);//判断队是否已满
int sequeue_clear(sequeue *sq);//清空队列数据
sequeue *sequeue_free(sequeue *sq);//释放队列空间
2.2 sequeue.c
front
是队头,rear
是队尾指向的空位置,初始化的时候都是指向0
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "sequeue.h"
sequeue *sequeue_create(){
sequeue *sq;
if ((sq = (sequeue *)malloc(sizeof(sequeue))) == NULL){
return NULL;
}
memset(sq->data, 0, sizeof(sq->data));
sq->front = sq->rear = 0;
return sq;
}
int sequeue_enqueue(sequeue *sq, data_t x){
if (sq == NULL){
printf("sq is NULLn");
return -1;
}
if ((sq->rear+1)%N == sq->front){
printf("sqeueue is fulln");
return -1;
}
sq->data[sq->rear] = x;
sq->rear = (sq->rear+1) % N;
return 0;
}
data_t sequeue_dequeue(sequeue *sq){
if (sq == NULL){
printf("sq is NULLn");
return -1;
}
data_t data;
data = sq->data[sq->front];
sq->front = (sq->front+1)%N;
return data;
}
int sequeue_empty(sequeue *sq){
if (sq == NULL){
printf("sq is NULLn");
return -1;
}
return sq->front == sq->rear;
}
int sequeue_full(sequeue *sq){
if (sq == NULL){
printf("sq is NULLn");
return -1;
}
return (sq->rear+1)%N == sq->front;
}
int sequeue_clear(sequeue *sq){
if (sq == NULL){
printf("sq is NULLn");
return -1;
}
sq->front = sq->rear = 0;
return 0;
}
sequeue *sequeue_free(sequeue *sq){
if (sq == NULL){
printf("sq is NULLn");
return NULL;
}
free(sq);
sq = NULL;
return NULL;
}
3. 链式队列
- 插入在队尾进行,删除操作在队头进行,由队头指针和队尾指针控制队
- 空队如下图所示
3.1 定义 linkqueue.h
先定义一个结点,在定义一个队列,队列的front指向头结点,队列的rear指向链表的最后一个元素
typedef int data_t;
typedef struct node{
data_t data;
struct node *next;
}listnode, *linklist;
typedef struct {
linklist front;
linklist rear;
}linkqueue;
linkqueue *create();
int enqueue(linkqueue *lq, data_t x);
data_t dequeue(linkqueue *lq);
int empty(linkqueue *lq);
int clear(linkqueue *lq);
linkqueue *queue_free(linkqueue *lq);
3.2 linkqueue.c
#include <stdio.h>
#include <stdlib.h>
#include "linkqueue.h"
linkqueue *create(){
linkqueue *lq;
lq = (linkqueue *)malloc(sizeof(linkqueue));
if (lq == NULL)
return NULL;
lq->front = lq->rear = (linklist)malloc(sizeof(listnode));
if (lq->front == NULL)
return NULL;
lq->front->next = NULL;
lq->front->data = 0;
return lq;
}
int enqueue(linkqueue *lq, data_t x){
linklist p;
if ((p = (linklist)malloc(sizeof(listnode))) == NULL){
return -1;
}
p->data = x;
p->next = NULL;
lq->rear->next = p;
lq->rear = p;
return 0;
}
data_t dequeue(linkqueue *lq){
linklist p;
p = lq->front;
lq->front = lq->front->next;
free(p);
p = NULL;
return lq->front->data;
}
int empty(linkqueue *lq){
return (lq->front == lq->rear);
}
int clear(linkqueue *lq){
linklist p;
while(lq->front != lq->rear){
p = lq->front;
lq->front = lq->front->next;
printf("clear: %dn", p->data);
free(p);
}
return 0;
}
linkqueue *queue_free(linkqueue *lq){
linklist p;
while(lq->front){
p = lq->front;
lq->front = lq->front->next;
printf("free: %dn", p->data);
free(p);
}
free(lq);
return NULL;
}
最后
以上就是哭泣嚓茶为你收集整理的数据结构(C语言)-线性表之队列(顺序队列、链式队列)-学习笔记041. 基本介绍2. 顺序队列3. 链式队列的全部内容,希望文章能够帮你解决数据结构(C语言)-线性表之队列(顺序队列、链式队列)-学习笔记041. 基本介绍2. 顺序队列3. 链式队列所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复