C语言实现队列在实际开发中经常会遇到,但是网上的写的都比较复杂,在这里写一个实现队列的方式,记录下来,以便自己日后查看,也为别人提供参考。
外国有一句话叫1张图抵得上10句话,我这里主要画图解释,通俗易懂,整个的实现逻辑是:
队列一定有头指针和尾指针,第一个节点时头指针和尾指针指向同一个节点
下一个数据到来后,rear->next指向新节点(连接起来),rear指向新节点(移动rear)
最终rear始终指向数据最后一个数据的地址(实时跟踪节点变化,像不像GPS,^_^)
下面贴上代码:
有几点需要说明,我在main函数了里初始化了头结点,也许是链表的习惯。
这里面使用了2级指针,因为一级指针定以后不初始化,指向的是内存的一个未知区域,而2级指针方便指针赋值操作,减少bug的产生
1 typedef char* QElemType; 2 3 typedef struct QNode //节点结构 4 { 5 QElemType data; 6 struct QNode *next; 7 }QNode,*QueuePtr; 8 9 typedef struct Link_queue//队列的链表结构 10 { 11 QueuePtr front,rear; //队列的头、尾指针 12 }LinkQueue; 13 14 15 typedef int Status; 16 17 #define ERR_OK 0 18 #define ERR_NO 1 19 20 //入队操作 21 Status Enqueue(LinkQueue* Q,QElemType e) 22 { 23 QueuePtr newNode = (QueuePtr)malloc(sizeof(QNode)); //新建队列节点 24 25 size_t len = strlen(e); 26 27 newNode->data = (QElemType)malloc(len+2*sizeof(char)); //为节点数据域分配内存 28 29 //数据域循环赋值 30 int i=0; 31 for(i=0;i<len;i++) 32 { 33 newNode->data[i] = e[i]; 34 } 35 newNode->data[len] = '\0'; 36 37 38 newNode->next = NULL; 39 40 Q->rear->next = newNode; //队列的尾指针指向的当前节点的下一个位置,指向s 41 Q->rear = newNode; //队列的尾指针向后移动至新节点 42 return ERR_OK; 43 44 } 45 46 //出队操作,使用后需要释放e的内存 47 Status DeQueue(LinkQueue* Q,QElemType* e) 48 { 49 QueuePtr p; 50 51 p = Q->front->next; //要出队的是头结点的下一个节点 52 //*e = p->data; //将要出队的节点数据赋值给e 53 size_t len = strlen(p->data); 54 55 *e=(QElemType)malloc(len+2*sizeof(char)); 56 57 58 int i=0; 59 for(i=0;i<len;i++) 60 { 61 (*e)[i] = p->data[i]; 62 } 63 (*e)[len]='\0'; 64 65 Q->front->next = p->next; 66 67 if(Q->rear == p) //尾指针指向p说明队列空了 68 { 69 Q->rear = Q->front; 70 } 71 72 free(p->data); 73 free(p); 74 return ERR_OK; 75 } 76 77 78 void main(void) 79 { 80 QueuePtr s = (QueuePtr)malloc(sizeof(QNode)); 81 82 s->data = 0; 83 s->next = NULL; 84 85 LinkQueue linkqueue; 86 87 linkqueue.front = s; 88 linkqueue.rear = s; 89 90 Enqueue(&linkqueue,"hello1"); 91 Enqueue(&linkqueue,"hello2"); 92 Enqueue(&linkqueue,"hello3"); 93 Enqueue(&linkqueue,"hello4"); 94 Enqueue(&linkqueue,"hello5"); 95 96 QElemType value; 97 QElemType value1; 98 QElemType value2; 99 QElemType value3; 100 101 DeQueue(&linkqueue,&value); 102 printf("value=%s",value); 103 // 104 DeQueue(&linkqueue,&value1); 105 printf("value1=%s",value); 106 107 DeQueue(&linkqueue,&value2); 108 printf("value2=%s",value); 109 110 DeQueue(&linkqueue,&value3); 111 printf("value3=%s",value); 112 113 114 getchar(); 115 116 }
运行结果: