队列的链式表示

      队列是和栈相反的一中线性结构,栈的后进先出LIFO结构,而队列是先进先出FIFO结构。它只允许在表的一端进行插入,而在另一端进行删除。

  1 /**

  2 和栈相反,队列是一种先进先出FIFO的结构,包括队头front,队尾rear

  3 使用链式结构表示队列时,分别一个头指针和尾指针。为操作方便,链队列也有一个头结点,则空的队列的判断条件就是

  4 头指针和尾指针都指向头结点

  5 */

  6 #include <stdio.h>

  7 #include <stdlib.h>

  8 

  9 //*************************单链队列的存储结构**********************************

 10 typedef struct QNode

 11 {

 12     int data;

 13     QNode *next;

 14 }QNode,*QuenePtr;

 15 typedef struct

 16 {

 17     QuenePtr front;  //队头指针

 18     QuenePtr rear;   //队尾指针

 19 }LinkQuene;

 20 

 21 //**************************基本操作算法说明************************************

 22 

 23 //***************************构造一个空队列*************************************

 24 void InitQuene(LinkQuene &Q)

 25 {

 26     //构造一个空队列Q

 27     Q.front = (QuenePtr)malloc(sizeof(QNode));

 28     if (!Q.front)

 29     {

 30         printf("存储分配失败,任意键退出!\n");

 31         getchar();

 32         exit(1);

 33     }

 34     Q.rear = Q.front;

 35     Q.front ->next = NULL;

 36 }

 37 //*****************************输出队列元素*************************************

 38 void PrintQuene(LinkQuene Q)

 39 {

 40     if (Q.front == Q.rear)

 41     {

 42         printf("该队列为空,无法输出!任意键退出!\n");

 43         getchar();

 44         exit(1);

 45     }

 46     QNode *p = Q.front->next;//另p指向第一个数据元素

 47     while(p->next)

 48     {

 49         printf("%d ", p->data);

 50         p = p -> next;

 51     }

 52     //输出队尾数据

 53     printf("%d\n",Q.rear->data);

 54 }

 55 

 56 

 57 //*******************************销毁队列**************************************

 58 void DestroyQuene(LinkQuene &Q)

 59 {

 60     //销毁队列,不是置空,从前向后一个一个删除

 61     while(Q.front)

 62     {

 63         Q.rear = Q.front;

 64         free(Q.front);

 65         Q.front = Q.rear;

 66     }

 67 }

 68 

 69 //********************************队列的数据元素插入*****************************

 70 void EnQuene(LinkQuene &Q,int e)

 71 {

 72     //插入元素e作为队列新的队尾元素

 73     QuenePtr p = (QuenePtr)malloc(sizeof(QNode));

 74     if (!p)

 75     {

 76         printf("存储分配失败,任意键退出!\n");

 77         getchar();

 78         exit(1);

 79     }

 80     p -> data = e;

 81     p -> next = NULL;

 82     //插入p结点

 83     Q.rear ->next = p;

 84     Q.rear = p;

 85 }

 86 

 87 //*******************************队列数据元素的删除********************************

 88 void DeQuene(LinkQuene &Q)

 89 {

 90     //若队列不空,则删除Q的队头元素,否则,报错

 91     if (Q.front == Q.rear)

 92     {

 93         printf("队列Q为空,无法删除!任意键退出\n");

 94         getchar();

 95         exit(1);

 96     }

 97 

 98     QuenePtr p = Q.front -> next;

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

100     if (Q.rear == p)

101     {

102         //只有一个结点元素的情况

103         Q.rear = Q.front;

104     }

105     free(p);

106 }

107 

108 

109 int main()

110 {

111     LinkQuene Q;

112     //初始化队列Q

113     InitQuene(Q);

114 

115     //构造队列

116     int count;//初始队列元素个数

117     int value;//初始队列元素值

118     printf("请输入初始队列的元素个数:");

119     scanf("%d",&count);

120     printf("请依次输入这些数据元素:");

121     for (int i = 0; i < count; ++i)

122     {

123         scanf("%d",&value);

124         EnQuene(Q,value);

125     }

126     printf("当前队列的元素为:");

127     PrintQuene(Q);

128 

129     //插入队列尾元素

130     printf("请输入插入值:");

131     scanf("%d",&value);

132     EnQuene(Q,value);

133     printf("插入后队列的元素为:");

134     PrintQuene(Q);

135 

136     //删除队列头元素

137     DeQuene(Q);

138     printf("删除后队列的元素为:");

139     PrintQuene(Q);

140     return 0;

141 }

 

你可能感兴趣的:(队列)