#数据结构学习之队列(C语言)
队列( queue)也是存放数据对象的一种容器,其中的数据对象也按线性的逻辑次序排列。队列结构同样支持对象的插入和删除,但两种操作的范围分别被限制于队列的两端,若约定新对象只能从某一端插入其中,则只能从另一端删除已有的元素。允许取出元素的一端称作队头( front),而允许插入元素的另一端称作队尾( rear)。队列中各对象的操作次序遵循所谓先进先(first-in-first-out, FIFO)的规律:更早(晚)出队的元素应为更早(晚)入队者,反之,更早(晚)入队者应更早(晚)出队。
在一个队列结构中,有三个元素,分别是头指针,尾指针以及表示队列中当前成员个数的参数
typedef struct
{
Qnodetype* front; /*头指针*/
Qnodetype* rear; /*尾指针*/
int num; /*短消息数量*/
}Queue;
队列中的成员采取链式存储结构。
typedef struct Qnode
{
char data[MaxMessage];
struct Qnode* next;
}Qnodetype;
队列设置有以下接口:
int initQueue(Queue **q); /*初始化队列*/
int enQueue(Queue* q, char x[]); /*进队操作*/
int sizeofQueue(Queue* q); /*队列大小*/
int outQueue(Queue* q,char x[]); /*出队操作*/
void get(Queue* q, char x[]); /*获取成员*/
int delAll(Queue* q); /*删除所有队列成员*/
int delOne(Queue* q,int num); /*删除指定成员(按序号)*/
int displayAll(Queue* q); /*显示所有成员*/
int displayOne(Queue* q,int num); /*显示一个成员(按序号)*/
具体代码如下:
Queue.h
#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MaxMessage 50 /*消息最大长度*/
#define LEN 3 /*队列最大长度*/
#define MALLOC_QNODE (Qnodetype*)malloc(sizeof(Qnodetype))
/*成员结构*/
typedef struct Qnode
{
char data[MaxMessage];
struct Qnode* next;
}Qnodetype;
/*定义队列*/
typedef struct
{
Qnodetype* front; /*头指针*/
Qnodetype* rear; /*尾指针*/
int num; /*短消息数量*/
}Queue;
int initQueue(Queue **q);
int enQueue(Queue* q, char x[]);
int sizeofQueue(Queue* q);
int outQueue(Queue* q,char x[]);
void get(Queue* q, char x[]);
int delAll(Queue* q);
int delOne(Queue* q,int num);
int displayAll(Queue* q);
int displayOne(Queue* q,int num);
Queue.c
#include "Queue.h"
/*初始化队列*/
int initQueue(Queue **q)
{
Qnodetype* node = NULL;
*q = (Queue*)malloc(sizeof(Queue));
node = MALLOC_QNODE;
if ((*q) == NULL || node == NULL) return 0;
(*q)->front = node;
(*q)->rear = (*q)->front;
(*q)->front->next = NULL;
(*q)->num = 0;
return 1;
}
/*进队操作*/
int enQueue(Queue* q, char x[])
{
Qnodetype* node = NULL;
node = MALLOC_QNODE;
int i = 0;
while (i < MaxMessage)
{
node->data[i] = x[i];
i++;
}
node->next = NULL;
q->rear->next = node;
q->rear = node;
(q->num)++;
return 1;
}
/*队列大小*/
int sizeofQueue(Queue* q)
{
if(q!=NULL)
return (q->num);
}
/*出队操作*/
int outQueue(Queue* q,char x[])
{
Qnodetype* delnode = NULL;
int i = 0;
delnode = q->front->next;
//while (i < MaxMessage)
//{
// //x[i] = delnode->data[i];
// //x[i] = 'x';
// i++;
//}
q->front->next = delnode->next;
if (q->rear == delnode) q->front = q->rear;
(q->num)--;
printf("\n\t\t\t\t\t\t\tMsg: %s is outQueue!\n\n", delnode->data);
free(delnode);
return 1;
}
/*获取成员*/
void get(Queue* q, char x[])
{
char* s = NULL;
if (q->num < LEN)
enQueue(q, x);
else
{
outQueue(q, s);
enQueue(q, x);
}
}
/*删除所有队列成员*/
int delAll(Queue* q)
{
//Qnodetype* node = NULL;
char* s = NULL;
//node = q->front->next;
while (q->front != q->rear)
{
if (outQueue(q, s));
else return 0;
}
return 1;
}
/*删除指定成员(按序号)*/
int delOne(Queue* q,int num)
{
int i = 0;
Qnodetype* node = NULL, * node_t = NULL;
node = node_t = q->front;
if ((q->num) >= num)
{
for (i = 0; i < (q->num); i++)
{
if (i == num - 1)
{
node_t = node->next;
node->next = node_t->next;
printf("\t\t\t\t\t\tDeleting Msg No.%d: %s\n", num, node_t->data);
free(node_t);
}
else
{
node = node->next;
if (node == NULL)return 0;
}
}
}
else return 0;
return 1;
}
/*显示所有成员*/
int displayAll(Queue* q)
{
int i = 0;
Qnodetype* node = NULL;
node = q->front->next;
if (q->num == 0)
{
printf("\t\t\t\t\t\t\tQueue is empty!\n");
return 1;
}
while (i <= q->num)
{
printf("\t\t\t\t\t\t\tMsg No.%d: %s\n", i, node->data);
node = node->next;
if (node == NULL) return 0;
i++;
}
return 1;
}
/*显示一个成员(按序号)*/
int displayOne(Queue* q,int num)
{
int i = 0;
Qnodetype* node = NULL;
node = q->front;
if (q->num == 0)
{
printf("\t\t\t\t\t\tQueue is empty!\n");
return 1;
}
while (i <= q->num)
{
if (i == num)
{
printf("\t\t\t\t\t\tMsg No.%d: %s\n", num, node->data);
break;
}
else
{
node = node->next;
if (node == NULL) return 0;
}
i++;
}
return 1;
}
/*主函数*/
int main(void)
{
Queue* q = NULL;
Qnodetype* node_h = NULL;
int i = 0;;
char command = 0;
char str[MaxMessage] ="";
initQueue(&q);
node_h = q->front;
while (1)
{
printf("Get information(%d),please enter R/r\n", q->num);
printf("Display one information(%d),please enter L/l\n", q->num);
printf("Display all information(%d),please enter A/a\n", q->num);
printf("Delete one information(%d),please enter D/d\n", q->num);
printf("Delete all information(%d),please enter U/u\n", q->num);
printf("Quit,please enter Q/q\n");
printf("please input command:\n");
//getchar();
scanf_s("%c", &command);
switch (command)
{
case 'r':
case 'R':
getchar();
gets(str);
//scanf_s("%s",&str);
q->front = node_h;
get(q, str);
break;
case 'l':
case 'L':
printf("enter No.:");
scanf_s("%d", &i);
q->front = node_h;
displayOne(q, i);
getchar();
break;
case 'a':
case 'A':
q->front = node_h;
displayAll(q);
getchar();
break;
case 'd':
case 'D':
printf("enter No.:");
scanf_s("%d", &i);
q->front = node_h;
delOne(q, i);
getchar();
break;
case 'u':
case 'U':
q->front = node_h;
delAll(q);
getchar();
break;
case 'q':
case 'Q':
printf("quit!!!\n");
Sleep(1000*3);
}
if (command == 'q' || command == 'Q')
break;
}
return 0;
}