天天看點

手把手寫資料結構之隊列操作

1#define ARGLEN        50
  2 
  3 #define Test(ARG)     if(ARG == NULL){
  4             printf("Invalid arg.......
");
  5             return -1;
  6 }
  7 
  8 //隊列任務節點
  9 typedef struct node
 10 {
 11     char arg[ARGLEN+1];            //任務參數
 12     void (* pfun)(char *);        //任務處理函數
 13     struct node *next;            //next結點指針
 14 }Q_NODE;
 15 
 16 //隊列資訊
 17 typedef struct queue_info
 18 {
 19     int max;        //目前排隊任務個數
 20     Q_NODE *head;    //隊列頭指針
 21     Q_NODE *tail;    //隊列尾指針
 22 }QUEUE_INFO;
 23 
 24 
 25 
 26 //建立任務結點
 27 static Q_NODE *__Create_Node__(void (*pfun)(char *), char *arg)
 28 {
 29     Q_NODE *new_node = (Q_NODE *)malloc(sizeof(Q_NODE));
 30     if(NULL == new_node)
 31     {
 32         perror("Create_Node");
 33         return NULL;
 34     }
 35 
 36     new_node->pfun = pfun;
 37     strncpy(new_node->arg, arg, ARGLEN);
 38     
 39     return new_node;
 40 }
 41 
 42 
 43 /****************************************************
 44 *Des:    建立隊列
 45 *Ret:    成功傳回0,失敗傳回-1
 46 *******************************************************/
 47 int Create_Queue(QUEUE_INFO **plist)
 48 {
 49     Test(plist);//函數入口檢測
 50 
 51     *plist = (QUEUE_INFO *)malloc(sizeof(QUEUE_INFO));
 52     if(NULL == *plist)
 53     {
 54         perror("Create_Queue");
 55         return -1;
 56     }
 57 
 58     (*plist)->head = NULL;
 59     (*plist)->tail = NULL;
 60     (*plist)->max = 0;
 61 
 62     return 0;
 63 }
 64 
 65 
 66 /****************************************************
 67 *Des:    判斷隊列是否為空
 68 *Ret:    成功傳回1,失敗傳回0
 69 *******************************************************/
 70 int Is_empty_Queue(QUEUE_INFO *plist)
 71 {
 72     return (NULL == plist->head);
 73 }
 74 
 75 
 76 /****************************************************
 77 *Des:    清空隊列
 78 *Ret:    成功傳回0,失敗傳回-1
 79 *******************************************************/
 80 int Empty_Queue(QUEUE_INFO *plist)
 81 {
 82     Test(plist);//函數入口檢測
 83 
 84     if(Is_empty_Queue(plist))
 85     {
 86         printf("the queue is emtpy!
");
 87         return -1;
 88     }
 89 
 90     Q_NODE *fnode = NULL, *pnode = plist->head;
 91     while(NULL != pnode)
 92     {
 93         fnode = pnode;
 94         pnode = pnode->next;
 95         free(fnode);
 96     }
 97 
 98     plist->max = 0;
 99     plist->head = plist->tail = NULL;
100 
101     return 0;
102 }
103 
104 /****************************************************
105 *Des:    入隊隊操作
106 *Ret:    成功傳回0,失敗傳回-1
107 *******************************************************/
108 int Push_Queue(QUEUE_INFO *plist, void (*pfun)(char *), char *arg)
109 {
110     //函數入口檢測
111     if(NULL == plist || NULL == pfun || NULL == arg)
112     {
113         printf("Invalid arg........
");
114         return -1;
115     }
116 
117     //建立結點
118     Q_NODE *new_node = __Create_Node__(pfun, arg);
119     if(NULL == new_node)
120     {
121         return -1;
122     }
123 
124     //判斷隊列是否為空
125     if(Is_empty_Queue(plist))
126     {
127         plist->head = plist->tail = new_node;
128     }
129     else
130     {
131         plist->tail->next = new_node;
132         plist->tail = new_node;
133     }
134 
135     plist->max++;
136 
137     return 0;
138 }
139 
140 /****************************************************
141 *Des:    出隊操作(并執行任務)
142 *Ret:    成功傳回0,失敗傳回-1
143 *******************************************************/
144 int Pop_Queue(QUEUE_INFO *plist)
145 {
146     Test(plist);//函數入口檢測
147 
148     //判斷隊列是否為空
149     if(Is_empty_Queue(plist))
150     {
151         printf("The queue is empty!
");
152         return -1;
153     }
154 
155     Q_NODE *pnode = plist->head;
156     if(plist->head->next == NULL)//隻有一個節點
157     {
158         plist->head = plist->tail = NULL;
159     }
160     else        
161     {
162         plist->head = pnode->next;
163     }
164 
165     //執行任務函數
166     (pnode->pfun)(pnode->arg);
167 
168     free(pnode);
169     plist->max--;
170 
171     return 0;
172 }
173 
174 
175 /****************************************************
176 *Des:    擷取目前任務節點個數
177 *Ret:    成功傳回0,失敗傳回-1
178 *******************************************************/
179 int Get_count_Queue(QUEUE_INFO *plist)
180 {
181     return plist->max;
182 }
183 
184 /****************************************************
185 *Des:    銷毀隊列
186 *Ret:    成功傳回0,失敗傳回-1
187 *******************************************************/
188 int Destory_Queue(QUEUE_INFO **plist)
189 {
190     Test(plist);    //函數入口檢測
191 
192     //清空連結清單
193     if(Empty_Queue(*plist) < 0)
194         return -1;
195 
196     free(*plist);
197 
198     *plist = NULL;
199 
200     return 0;
201 }