链式队列【数据结构-朱战立】

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 //#include <malloc.h>
  4 
  5 //定义抽象数据
  6 typedef int DataType;
  7 typedef struct queue{
  8     DataType data;
  9     struct  queue *next;
 10 }Queue;
 11 
 12 //定义链式队列的头尾指针
 13 typedef struct{
 14     Queue *front;
 15     Queue *rear;
 16 }ListQueue;
 17 
 18 //链式队列初始化
 19 void ListQueueInit(ListQueue *myQ)
 20 {
 21     myQ->front = NULL;
 22     myQ->rear = NULL;
 23 }
 24 
 25 //链式队列判断是否为空
 26 int ListQueueNoEmpty(ListQueue myQ)
 27 {
 28     if (myQ.front==NULL)
 29     {
 30         return 0;
 31     }
 32     else
 33     {
 34         return 1;
 35     }
 36 }
 37 
 38 //链式队列的入队操作
 39 int ListQueuePush(ListQueue *myQ, DataType x)
 40 {
 41     Queue *pTemp;
 42     if ((pTemp=(Queue*)malloc(sizeof(Queue)))==NULL)
 43     {
 44         return 0;
 45     }
 46     pTemp->data = x;
 47     pTemp->next = NULL;        //2018年8月16日 16:23:06  更正    最致命错误
 48 
 49 
 50     if (myQ->rear!=NULL)    //第一次入队的时候rear为null所以不执行。
 51     {
 52         myQ->rear->next = pTemp;
 53     }
 54     myQ->rear = pTemp;     //将队尾指针指向第一个入队的元素。
 55     if (myQ->front==NULL)
 56     {
 57         myQ->front = pTemp;//将队头指针指向第一个入队的元素,然后不再移动。
 58     }
 59     return 1;
 60 }
 61 
 62 //链式队列的出队操作
 63 int ListQueuePop(ListQueue *myQ, DataType *x)
 64 {
 65     ListQueue *del;
 66     /*if ((del = (ListQueue*)malloc(sizeof(ListQueue))) == NULL)
 67     {
 68         return 0;
 69     }*/
 70     if (myQ->front==NULL/*&&myQ->rear==NULL*/)
 71     {
 72         return 0;
 73     }
 74     else
 75     {
 76         *x = myQ->front->data;
 77         del = myQ->front;
 78         myQ->front = myQ->front->next;
 79         if (myQ->front == NULL)//如果只有一个节点
 80         {
 81             myQ->rear = NULL;
 82         }
 83         free(del);
 84         return 1;
 85     }
 86     
 87 }
 88 
 89 //链式队列取队头
 90 int ListQueueTop(ListQueue myQ,DataType *num)
 91 {
 92     if (myQ.front==NULL)
 93     {
 94         return 0;
 95     }
 96     else
 97     {
 98         *num = myQ.front->data;
 99         return 1;
100     }
101     
102 }
103 
104 
105 //销毁队列内存
106 void ListQueueDes(ListQueue myQ)
107 {
108     ListQueue *temp,*pre;
109     pre =myQ.front;
110     while (pre!=NULL)
111     {
112         temp = pre;
113         pre->front= pre->front->next;
114         free(temp);
115         temp = NULL;
116     }
117     myQ.front = NULL;
118     myQ.rear = NULL;
119 }
120 
121 //主函数
122 void main(void)
123 {
124     ListQueue Q;
125     int i;
126     DataType x,m;
127 
128     ListQueueInit(&Q);
129     for ( i = 0; i <10; i++)
130     {
131         if ((ListQueuePush(&Q, i + 1)) == 0)
132         {
133             printf("1error");
134             getchar();
135             return;
136         }
137     }
138     /*if ((ListQueueTop(&Q,&m))==0)
139     {
140         printf("2error");
141         getchar();
142         return;
143     }
144     else
145     {
146         printf("队头:%d\n", m);
147     }*/
148     ListQueueTop(Q, &x);
149     printf("\n取出队头为:%d\n", x);
150     ListQueuePop(&Q, &x);
151     while ((ListQueueNoEmpty(Q)) == 1)
152     {
153         if ((ListQueueTop(Q,&x))==0)
154         {
155             printf("3error");
156             return;
157         }
158         else
159         {
160             printf("%d    ", x);
161             ListQueuePop(&Q, &x);
162         }
163     }
164     ListQueueDes(Q);
165     getchar();
166 }

 

posted @ 2018-08-16 16:30  蓝莓派Alex  阅读(271)  评论(0编辑  收藏  举报