数据结构 分别实现顺序队列和链式队列

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

分别实现顺序队列和链式队列

实现入队列, 出队列, 和取队首元素

顺序队列

seqqueue.h
#pragma once

#include <stdio.h>
#include <stdlib.h>

#define TITLE printf("\n====================%s====================",__FUNCTION__);


#define SeqQueueMaxSize 1000

typedef char SeqQueueType;

typedef struct SeqQueue
{
 SeqQueueType data[SeqQueueMaxSize];
 size_t head;
 size_t tail;
 size_t size;
}SeqQueue;

void SeqQueueInit(SeqQueue* q); //初始化
void SeqQueueDestroy(SeqQueue *q);//销毁
void SeqQueuePrint(SeqQueue* q);//打印
void SeqQueuePush(SeqQueue*q,SeqQueueType value);//入队列
void SeqQueuePop(SeqQueue*q);//出队列
int SeqQueueGet(SeqQueue* q,char* value);//获取队首元素
seqqueue.c
#include "seqqueue.h"

void SeqQueueInit(SeqQueue* q)
{
 if(q == NULL)
 {
  //非法输入
  return;
 }
 q->size = 0;
 q->head = 0;
 q->tail = 0;
 return;
}

void SeqQueueDestroy(SeqQueue* q)
{
 if(q == NULL)
 {
  //非法输入
  return;
 }
 q->size = 0;
 q->head = 0;
 q->tail = 0;
 return;
}

//实际上队列是不允许被打印的,这里仅为测试代码是否正确
void SeqQueuPrint(SeqQueue* q,const char* msg)
{
 printf("\n[%s]:\n",msg);
 if(q == NULL)
 {
  //非法输入
  return;
 }
 if(q->size == 0)
 {
  //空队列
  return;
 }
 //tail在head后面
 if(q->head < q->tail)
 {
  int i = q->head;
  for(;i<q->tail;i++)
  {
   printf("[%c] ",q->data[i]);
  } 
  printf("\n");
  return;
 }
 // tail在head前
 else
 {
  int i = q->head;
  for(;i<SeqQueueMaxSize;i++)
  {
   printf("[%c] ",q->data[i]);
  }
  i = 0;
  for(;i<q->tail;i++)
  {
   printf("[%c] ",q->data[i]);
  }
  printf("\n");
 }
}

void SeqQueuePush(SeqQueue*q,SeqQueueType value)
{
 if(q == NULL)
 {
  //非法输入
  return;
 }
 if(q->size >= SeqQueueMaxSize)
 {
  printf("队列已满\n");
  return;
 }
 q->data[q->tail] = value;
 q->tail++;
 q->size++;
 if(q->tail >= SeqQueueMaxSize)
 {
  q->tail = 0;
 }
}

void SeqQueuePop(SeqQueue*q)
{
 if(q == NULL)
 {
  return;
 }
 if(q->size == 0)
 {
  //空队列
  return;
 }
 if(q->head >= SeqQueueMaxSize)
 {
  q->head = 0;
 }
 q->head++;
 q->size--;
} 

int SeqQueueGet(SeqQueue* q,char* value)
{
 if(q == NULL)
 {
  //非法输入
  return 0;
 }
 if(q->size == 0)
 {
  //空队列
  return 0;
 }
 *value = q->data[q->head];
 q->head++;
 q->size--;
}


//////////////////////////////////////////////
//              以下为测试代码              //
/////////////////////////////////////////////

void TestSeqQueuePush()
{
 TITLE;
 SeqQueue q;
 SeqQueueInit(&q);
 SeqQueuePush(&q,'a');
 SeqQueuePush(&q,'b');
 SeqQueuePush(&q,'c');
 SeqQueuePush(&q,'d');
 SeqQueuPrint(&q,"入队列4个元素");
}

void TestSeqQueuePop()
{
 TITLE;
 SeqQueue q;
 SeqQueueInit(&q);
 SeqQueuePush(&q,'a');
 SeqQueuePush(&q,'b');
 SeqQueuePush(&q,'c');
 SeqQueuePush(&q,'d');
 SeqQueuPrint(&q,"入队列4个元素");
 SeqQueuePop(&q);
 SeqQueuPrint(&q,"出队列1个元素");
 SeqQueuePop(&q);
 SeqQueuePop(&q);
 SeqQueuePop(&q);
 SeqQueuPrint(&q,"出队列3个元素"); 
}

void TestSeqQueueGet()
{
 TITLE;
 SeqQueueType value;
 SeqQueue q;
 SeqQueueInit(&q);
 SeqQueuePush(&q,'a');
 SeqQueuePush(&q,'b');
 SeqQueuePush(&q,'c');
 SeqQueuePush(&q,'d');
 SeqQueuPrint(&q,"入队列4个元素");
 SeqQueueGet(&q,&value); 
 printf("取得队首元素为:[%c] \n",value);
}

int main()
{
 TestSeqQueuePush();
 TestSeqQueuePop();
 TestSeqQueueGet();
 return 0;
}
运行结果:



链式队列

listqueue.h
#include <stdio.h>
#include <stdlib.h>

#define TITLE printf("\n======================%s====================\n",__FUNCTION__);

typedef char ListQueueType;

typedef struct ListQueue
{
 ListQueueType data;
 struct ListQueue* next;
}ListQueue;



void ListQueueInit(ListQueue** head);//初始化
void ListQueueDestroy(ListQueue** head);//销毁队列
void ListQueuePush(ListQueue** head,ListQueueType value);//入队列
ListQueue* ListQueueCreate(ListQueueType value);//创建结点
void ListQueuePrint(ListQueue* head,const char *msg);//打印队列
void ListQueuePop(ListQueue** head);//出队列
int ListQueueGet(ListQueue** head,char* value);//取队列首元素,成功返回1,否则返回0

listqueue.c
#include"listqueue.h"

void ListQueueInit(ListQueue** head)
{
 if(head == NULL)
 {
  //非法输入
  return;
 }
 *head = NULL;
 return;
}


void ListQueueDestroy(ListQueue** head)
{
 if(head == NULL)
 {
  return; 
 }
 if(*head == NULL)
 {
  return;
 }
 ListQueue* cur = *head;
 ListQueue* to_delete = NULL;
 while(cur != NULL)
 {
  to_delete = cur;
  cur = cur->next;
  free(to_delete);
 }
 return;
}

ListQueue* ListQueueCreate(ListQueueType value)
{
 ListQueue* new_node = (ListQueue*)malloc(sizeof(ListQueue));
 new_node->data = value;
 new_node->next = NULL;
}

void ListQueuePrint(ListQueue* head,const char *msg)
{
 printf("[%s]:\n",msg);
 if(head == NULL)
 {
  //空队列
  return;
 }
 ListQueue* cur = head;
 while(cur != NULL)
 {
  printf("[%c] ",cur->data); 
  cur = cur->next;
 }
 printf("\n");
}


void ListQueuePush(ListQueue**head,ListQueueType value)
{
 if(head == NULL) 
 {
  return;
 }
 if(*head == NULL)
 {
  *head = ListQueueCreate(value);
  return;
 }
 ListQueue* cur = *head;
 while(cur->next != NULL)
 {
  cur = cur->next;
 }
 cur->next = ListQueueCreate(value);
 return;
}

void ListQueuePop(ListQueue** head)
{
 if(head == NULL)
 {
  return;
 }
 if(*head == NULL)
 {
  return;
 }
 if((*head)->next == NULL)
 {
  ListQueueDestroy(head);
  return;
 }
 ListQueue* to_delete = *head;
 *head = (*head)->next;
 free(to_delete);
 return;
}

int ListQueueGet(ListQueue** head,char* value)
{
 if(head == NULL)
 {
  return 0;
 }
 if(*head == NULL)
 {
  return 0;
 }
 *value = (*head)->data;  
 return 1;
}




/////////////////////////////////////////////////////////////
//                      以下为测试函数                     //
/////////////////////////////////////////////////////////////

void TestListQueuePush()
{
 TITLE;
 ListQueue* head;
 ListQueueInit(&head);
 ListQueuePush(&head,'a'); 
 ListQueuePush(&head,'b'); 
 ListQueuePrint(head,"入队列2个元素");
 ListQueuePush(&head,'c'); 
 ListQueuePush(&head,'d'); 
 ListQueuePrint(head,"入队列2个元素");
}


void TestListQueueDestroy()
{
 TITLE;
 ListQueue* head;
 ListQueueInit(&head);
 ListQueuePush(&head,'a'); 
 ListQueuePush(&head,'b'); 
 ListQueuePrint(head,"入队列2个元素");
 ListQueueDestroy(&head);
 ListQueuePrint(head,"销毁队列");
}


void TestListQueuePop()
{
 TITLE;
 ListQueue* head;
 ListQueueInit(&head);
 ListQueuePush(&head,'a'); 
 ListQueuePush(&head,'b'); 
 ListQueuePush(&head,'c'); 
 ListQueuePush(&head,'d'); 
 ListQueuePrint(head,"入队列4个元素");
 ListQueuePop(&head); 
 ListQueuePop(&head); 
 ListQueuePrint(head,"出队列2个元素");
 ListQueuePop(&head); 
 ListQueuePop(&head); 
 ListQueuePrint(head,"出队列2个元素");
}

void TestListQueueGet()
{
 
 TITLE;
 ListQueueType value;
 int ret = 0;
 ListQueue* head;
 ListQueueInit(&head);
 ListQueuePush(&head,'a'); 
 ListQueuePush(&head,'b'); 
 ListQueuePush(&head,'c'); 
 ListQueuePush(&head,'d'); 
 ListQueuePrint(head,"入队列4个元素");
 ret = ListQueueGet(&head,&value);
 printf("ret = %d\n队首元素为:%c\n",ret,value);
}


int main()
{
 TestListQueuePush();
 TestListQueueDestroy();
 TestListQueuePop();
 TestListQueueGet();
 return;
}
运行结果:


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

本版积分规则

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

下载期权论坛手机APP