?这篇文章收录了王道考研课程中涉及的数据结构的所有代码。此外,本博客可能会添加一些额外的代码(不仅限于王道考研),因为408考试中会频繁考察一些冷门的知识点,所以这篇博客会涵盖所有相关的代码。这也是我数据结构的第一轮复习,希望能与大家共同进步。由于博客篇幅的限制,可能无法一次性包含所有内容,欢迎指出代码错误部分!!!
// @FileName :DuiLie.c
// @Time :2023/8/14 20:49
// @Author :YKW
# include <stdio.h>
# include <stdbool.h>
# include <stdlib.h>
//队列(Queue)只允许在一段进行插入(入队、队尾),在另一端删除的线性表
//顺序队列
#define MaxSize 10
typedef struct{
int data[MaxSize];
int front,rear;
//int size;//计数变量,判断队列空满,插入加一,删除减一
//int tag;//每次删除,=0,每次插入,=1
//则队满:front==rear&&tag==1;
//队空:front==rear&&tag==0;
}SqQueue;
void InitQueue(SqQueue *Q){
Q->front=Q->rear=0;
}
//入队
bool EnQueue(SqQueue *Q,int x){
if((Q->rear+1)%MaxSize==Q->front)//队列满,报错
return false;
Q->data[Q->rear]=x;
Q->rear=(Q->rear+1)%MaxSize;//循环队列,牺牲一个储存空间,变成环状
}
//出队
bool DeQueue(SqQueue *Q,int x){
if(Q->rear==Q->front)//判断队空
return false;
x=Q->data[Q->front];
Q->front=(Q->front+1)%MaxSize;//队头指针后移
return true;
}
//获得队头元素值,返回x
bool GetHead(SqQueue *Q,int x){
if(Q->rear==Q->front)//判断队空
return false;
x=Q->data[Q->front];
return true;
}
/*
* 队满(Q->rear+1)%MaxSize==Q->front;
* 队空Q->rear==Q.front;
* */
//链队列
typedef struct LinkNode{//链式队列节点
int data;
struct LinkNode *next;
}LinkNode;
typedef struct {///链式队列
LinkNode *front,*rear;//对头/尾指针
}LinkQueue;
void InitQueue2(LinkQueue *Q){
Q->front=Q->rear=(LinkNode*)malloc(sizeof(LinkNode));
Q->front->next=NULL;
}
//入队
void EnQueue2(LinkQueue *Q,int x){
LinkNode *s=(LinkNode*)malloc(sizeof(LinkNode));
s->data=x;
s->next=NULL;
Q->rear->next=s;
Q->rear=s;
}
//出队
bool DeQueue2(LinkQueue *Q,int *x){
if(Q->front==Q->rear)//空队
return false;
LinkNode *p=Q->front->next;
*x=p->data;//x返回被删除的元素
Q->front->next=p->next;
if(Q->rear==p)
Q->rear=Q->front;
free(p);
return true;
}
//双端队列:两端均可插入删除
//输入(输出)受限的双端队列