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 }
運行結果: