链式队列

来源:互联网 发布:快速排序 java 编辑:程序博客网 时间:2024/06/05 08:27
<span style="font-family:Microsoft YaHei;font-size:12px;">声明  Queue.h</span>
<span style="font-family:Microsoft YaHei;font-size:12px;">typedef  struct queue{int num;int high;struct queue *pNext;//存储下一个节点的地址}Queue;Queue * init(Queue *queueA);//初始化Queue * EnQueue(Queue *queueA, int num, int high);//入队Queue * DeQueue(Queue *queueA, Queue *pout);//出队Queue * freeall(Queue *queueA);//清空void  sort(Queue *queueA);//根据优先级排队  冒泡void printfall(Queue *queueA);//打印所有数据,递归Queue * insertEnQueue(Queue *queueA, int num, int high);</span>
<span style="font-family:Microsoft YaHei;font-size:12px;">-------------------------------------------------------------------------------</span>
<span style="font-family:Microsoft YaHei;font-size:12px;">定义  Queue.c</span>

<span style="font-family:Microsoft YaHei;font-size:12px;">Queue * init(Queue *queueA)//初始化{return  NULL;}Queue * EnQueue(Queue *queueA, int num, int high)//顺序入队{Queue  *pnewnode = (Queue *)malloc(sizeof(Queue));//分配内存pnewnode->num = num;pnewnode->high = high;pnewnode->pNext = NULL;if (queueA==NULL)//链表为空{queueA = pnewnode;return queueA;//返回值}else{Queue  *p = queueA;//头结点while (p->pNext!=NULL){p = p->pNext;}//确定要插入的位置p->pNext = pnewnode;//插入return queueA;//返回}}Queue * DeQueue(Queue *queueA, Queue *pout)//顺序出队{if (NULL == queueA){return NULL;}else{//每次只删除第一个节点pout->num = queueA->num;pout->high = queueA->high;//优先级   赋值Queue *ptemp = queueA;//记录要删除的地址queueA = queueA->pNext;//跳过queueAfree(ptemp);//释放节点return queueA;}}Queue * freeall(Queue *queueA)//清空{if (NULL==queueA){return NULL;} else{Queue*pq1 = NULL, *pq2 = NULL;pq1 = queueA;while (pq1->pNext!=NULL){pq2 = pq1->pNext;pq1->pNext = pq2->pNext;free(pq2);}free(queueA);}return NULL;}//队列插入排序实现  优先级入队Queue * insertEnQueue(Queue *queueA, int num, int high){Queue  *pnewnode = (Queue *)malloc(sizeof(Queue));//分配内存pnewnode->num = num;pnewnode->high = high;if (queueA == NULL)//节点为空{pnewnode->pNext = NULL;queueA = pnewnode;return queueA;}else{if (pnewnode->high  >queueA->high){pnewnode->pNext = queueA;//头部插入queueA = pnewnode;//指向这个节点return queueA;}else  {Queue *p = queueA;//头结点while (p->pNext != NULL){p = p->pNext;}//p循环到尾部if (pnewnode->high <= p->high){p->pNext = pnewnode;pnewnode->pNext = NULL;return queueA;}else{Queue *p1, *p2;p1 = p2 = NULL;//避免野指针p1 = queueA;//头结点while (p1->pNext != NULL){p2 = p1->pNext;if (p1->high>=pnewnode->high && p2->high<pnewnode->high){pnewnode->pNext = p2;p1->pNext = pnewnode;//插入break;}p1 = p1->pNext;}return queueA;}}}}void  Popsort(Queue *queueA)//优先级排队{if (NULL ==  queueA|| NULL ==  queueA->pNext ){return NULL;}for (Queue * p1 = queueA; p1 != NULL;p1=p1->pNext){for (Queue *p2 = queueA; p2 != NULL; p2 = p2->pNext){if (p1->high >p2->high){Queue temp;temp.num = p1->num;p1->num = p2->num;p2->num = temp.num;temp.high = p1->high;p1->high = p2->high;p2->high = temp.high;//交换节点数据}}}}void printfall(Queue *queueA)//递归{if (NULL==queueA){return;}else{printf("%-6d  %-2d  %p  %p\n", queueA->num, queueA->high, queueA, queueA->pNext);printfall(queueA->pNext);//进入下一个节点 }}</span>
<span style="font-family:Microsoft YaHei;font-size:12px;">-----------------------------------------------------------------------------</span>
<span style="font-family:Microsoft YaHei;font-size:12px;">测试  main.c</span>
<span style="font-family:Microsoft YaHei;font-size:12px;">#include<stdio.h>#include<stdlib.h>#include"Queue.h"//测试  入队出队void  main1(){Queue *phead = NULL;//创建头结点phead = init(phead);//初始化phead = EnQueue(phead, 43, 1);phead = EnQueue(phead, 889, 2);phead = EnQueue(phead, 23, 4);phead = EnQueue(phead, 1234, 9);phead = EnQueue(phead, 678, 0);phead = EnQueue(phead, 501, 4);printfall(phead);printf("\n按照优先级(大->小)排序后的输出样式:\n");Popsort(phead);printfall(phead);//出队int count = 0;while (phead != NULL){//分配内存Queue * ptemp = (Queue *)malloc(sizeof(Queue));phead = DeQueue(phead, ptemp);printf("\n第%d次出队以后的数据显示:\n",++count);printfall(phead);printf("出队的是%d   %d\n", ptemp->num, ptemp->high);}system("pause");}//测试  按照优先队列插入void main2(){Queue *phead = NULL;//创建头结点phead = init(phead);//初始化phead = insertEnQueue(phead, 1, 1);printf("\n");printfall(phead);phead = insertEnQueue(phead, 2, 12);printf("\n");printfall(phead);phead = insertEnQueue(phead, 3, 44);printf("\n");printfall(phead);phead = insertEnQueue(phead, 4, 14);printf("\n");printfall(phead);phead = insertEnQueue(phead, 5, 5);printf("\n");printfall(phead);phead = insertEnQueue(phead, 6, 16);printf("\n");printfall(phead);phead = insertEnQueue(phead, 6, 45);printf("\n");printfall(phead);phead = insertEnQueue(phead, 7, 0);printf("\n");printfall(phead);phead = insertEnQueue(phead, 8, 0);printf("\n");printfall(phead);phead = insertEnQueue(phead, 9, 1);printf("\n");printfall(phead);phead = insertEnQueue(phead, 10, 0);printf("\n");printfall(phead);phead = insertEnQueue(phead, 11, 16);printf("\n");printfall(phead);phead = insertEnQueue(phead, 111, 89);printf("\n");printfall(phead);system("pause");}</span>




0 0
原创粉丝点击