c語言隊列的實現


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 }

 

 

運行結果:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM