数据结构-顺序队列(C语言)

论坛 期权论坛 脚本     
匿名网站用户   2020-12-19 18:41   129   0

队列:插入数据只在队尾进行,删除数据只在队头进行。

顺序队列操作会出现 假溢出(tail指向队列最后,进行入队操作时,即使前面有空位置也显示队列已满)

解决:

1.在出队操作后,增加移动元素操作。每次进行完出队操作后,队列中后面的元素向前移动,始终保持队列第一个位置有元素。(每次移动大量元素,效率低)

2.队列首位相连--循环队列


SeqQueue.h

#define QUEUEMAX 15
typedef struct
{
 DATA data[QUEUEMAX];//队列数组 
 int head;//队头 
 int tail;//队尾 
}SeqQueue;

SeqQueue *SeqQueueInit()//初始化队列 
{
 SeqQueue *q;
 if(q=(SeqQueue *)malloc(sizeof(SeqQueue)))
 {
  q->head=0;
  q->tail=0;
  return q;
 }
 else
  return NULL;
}

void SeqQueueFree(SeqQueue *q)//释放队列 
{
 if(q!=NULL) free(q);
}

int SeqQueueIsEmpty(SeqQueue *q)//队列是否为空,空为0 
{
 return (q->head==q->tail);
}

int SeqQueueIsFull(SeqQueue *q)//队列是否为已满,满为1 
{
 return (q->tail==QUEUEMAX);
}

int SeqQueueLen(SeqQueue *q)//返回队列长度 
{
 return (q->tail-q->head);
}

int SeqQueueIn(SeqQueue *q,DATA data)//入队 
{
 if(q->tail==QUEUEMAX){//判断队列q是否已满,满返回0 
  printf("Queue is full!\n");
  return 0;
 }
 else{
  q->data[q->tail++]=data;
  return 1;
 }
}

DATA *SeqQueueOut(SeqQueue *q)//出队 
{
 if(SeqQueueIsEmpty(q))
 {
  printf("Queue is empty!\n");//判断队列是否为空,空返回NULL 
  return NULL;
 }
 else{
  return &(q->data[q->head++]);
 }
}

DATA *SeqQueuePeek(SeqQueue *q)//获取队头元素 
{
 if(SeqQueueIsEmpty(q))
 {
  printf("Queue is empty!\n");
  return NULL;
 }
 else{
  return &(q->data[q->head]);
 }
}

SeqQueueTest.c

#include<stdio.h>
#include<stdlib.h>
typedef struct{
 char key[15];
 char name[15];
}DATA;
#include"SeqQueue.h"

int main()
{
 DATA *data1,data;
 SeqQueue *q;
 q=SeqQueueInit();
 printf("input key name:");//一次入队 
 scanf("%s%s",&data.key,&data.name);
 SeqQueueIn(q,data);
 
 data1=SeqQueueOut(q);//一次出队 
 printf("(%s,%s)",data1->key,data1->name);
 SeqQueueFree(q);
 getch();
 return 0;
}







分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:1136255
帖子:227251
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP