队列的链式表示

      队列是和栈相反的一中线性结构,栈的后进先出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 }

 

posted @ 2015-03-18 20:00  CSUER  阅读(314)  评论(0编辑  收藏  举报