c语言链式队列 字符串,队列的链式储存结构,以及循环队列(C语言)。

队列的链式储存结构如下:

#include

#include

typedef int QElemType;

typedef int Status;

/*-----------单链队列---队列的链式储存结构-------------------------*/

typedef struct QNode {

QElemType data;   /*数据域*/

struct QNode *next;  /*指针域*/

}QNode,*QueuePtr;

typedef struct {

QueuePtr front;  /*队头指针*/

QueuePtr rear;   /*队尾指针*/

}LinkQueue;

常用算法:

Status InitQueue(LinkQueue *Q) /*构造一个空队列Q*/

{

Q->front=Q->rear=(QueuePtr)malloc(sizeof(QNode));

if(!Q->front)exit(0);  /*储存分配失败*/

Q->front->next=NULL; /*头结点指针域指向null*/

return 1;

}

Status EnQueue(LinkQueue *Q,QElemType e)/*插入元素e为q的队尾元素*/

{

QueuePtr p;

p=(QueuePtr)malloc(sizeof(QNode));

p->data=e;

p->next=NULL;

Q->rear->next=p;

Q->rear=p;

return 1;

}

Status Dequeue(LinkQueue *Q,QElemType *e)/*若队列不为空,则删除Q的队头元素,并返回其值*/

{

QueuePtr p;

p=Q->front->next;

*e=p->data;

Q->front->next=p->next;

if(Q->rear==p)Q->rear=Q->front;

free(p);

return 1;

}

Status queueEmpty(LinkQueue *Q)//若队列不为空,则返回1

{

QueuePtr p;

p=Q->front->next;

if(p->data)

{

return 1;

}

else return 0;

}

Status DestroyQueue(LinkQueue *Q)/*销毁队列Q*/

{

while(Q->front){

Q->rear=Q->front->next;

free(Q->front);

Q->front=Q->rear;

}

return 1;

}

测试函数:先入队0,1,2,3,4,5,6,7,8,然后岀队6个在入队0,1,2,3,4,5,6,7,8.在岀队6个。

void main()  /*测试函数*/

{

int i,e;

LinkQueue Q;

InitQueue(&Q);

for(i=0;i<9;i++)/*入队0~8*/

{

EnQueue(&Q,i);

}

printf("入队0~8后,岀队六个元素为:");

for(i=0;i<6;i++)/*岀队六个*/

{

Dequeue(&Q,&e);

printf("%d\t",e);

}

printf("\n");

for(i=0;i<9;i++)/*入队0~8*/

{

EnQueue(&Q,i);

}

printf("入队0~8后,岀队五个元素为:");

for(i=0;i<6;i++)/*岀队六个*/

{

Dequeue(&Q,&e);

printf("%d\t",e);

}

printf("\n");

DestroyQueue(&Q);/*销毁队列*/

system("pause");

}

测试结果如下:(应该是岀队六个元素)

ec461649cb57506b2abb78be92d3adb5.png

循环队列:

#include

typedef int QElemType;

typedef int Status;

/*-------------循环队列-- 队列的顺序储存结构--------------*/

#define MAXQSIZE 100  /*最大队列长度*/

typedef struct{

QElemType *base; /*初始化动态分配的空间*/

int front;  /*如果队列不为空,指向头指针*/

int rear;  /*尾指针,如果队列不为空,指向下一个位置*/

}SqQueue;

Status InitQueue(SqQueue *Q)/*构造一个空队列*/

{

Q->base=(QElemType*)malloc (MAXQSIZE*sizeof(QElemType));

if(!Q->base)exit(0);

Q->front=Q->rear=0;

return 1;

}

Status EnQueue(SqQueue *Q,QElemType e)/*插入新元素*/

{

if((Q->rear+1)%MAXQSIZE==Q->front)return 0;

Q->base[Q->rear]=e;

Q->rear=(Q->rear+1)%MAXQSIZE;

return 1;

}

Status DeQueue(SqQueue *Q,QElemType *e)/*删除头元素,返回其值*/

{

if(Q->front==Q->rear) return 0;

*e=Q->base[Q->front];

Q->front=(Q->front+1)%MAXQSIZE;

return 1;

}

测试函数如上,注意去掉没有的函数。程序运行结果如上。

注意:

循环队列判断是否队满有三种方式:

加一个标志位。

空一位,判断时队尾指针加1取模。

加一个计数器。

------------------------------------------华丽分割线-----------------------------------------------------

学习数据结构记录,如有错误欢迎指正。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值