数据结构C语言实现—队列操作
生活随笔
收集整理的這篇文章主要介紹了
数据结构C语言实现—队列操作
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
1 #include <stdio.h>
2 #include <stdlib.h>
3
4 typedef int elemType;
5 /************************************************************************/
6 /* 以下是關(guān)于隊(duì)列鏈接存儲(chǔ)操作的6種算法 */
7 /************************************************************************/
8
9 struct sNode{
10 elemType data; /* 值域 */
11 struct sNode *next; /* 鏈接指針 */
12 };
13
14 struct queueLK{
15 struct sNode *front; /* 隊(duì)首指針 */
16 struct sNode *rear; /* 隊(duì)尾指針 */
17 };
18
19 /* 1.初始化鏈隊(duì) */
20 void initQueue(struct queueLK *hq)
21 {
22 hq->front = hq->rear = NULL; /* 把隊(duì)首和隊(duì)尾指針置空 */
23 return;
24 }
25
26 /* 2.向鏈隊(duì)中插入一個(gè)元素x */
27 void enQueue(struct queueLK *hq, elemType x)
28 {
29 /* 得到一個(gè)由newP指針?biāo)赶虻男陆Y(jié)點(diǎn) */
30 struct sNode *newP;
31 newP = malloc(sizeof(struct sNode));
32 if(newP == NULL){
33 printf("內(nèi)存空間分配失敗! ");
34 exit( 1 );
35 }
36
37 /* 把x的值賦給新結(jié)點(diǎn)的值域,把新結(jié)點(diǎn)的指針域置空 */
38 newP->data = x;
39 newP->next = NULL;
40
41 /* 若鏈隊(duì)為空,則新結(jié)點(diǎn)即是隊(duì)首結(jié)點(diǎn)又是隊(duì)尾結(jié)點(diǎn) */
42 if(hq->rear == NULL){
43 hq->front = hq->rear = newP;
44 }else {
45 /* 若鏈隊(duì)非空,則依次修改隊(duì)尾結(jié)點(diǎn)的指針域和隊(duì)尾指針,使之指向新的隊(duì)尾結(jié)點(diǎn) */
46 hq->rear = hq->rear->next = newP; /* 注意賦值順序哦 */
47 }
48 return;
49 }
50
51 /* 3.從隊(duì)列中刪除一個(gè)元素 */
52 elemType outQueue(struct queueLK *hq)
53 {
54 struct sNode *p;
55 elemType temp;
56
57 /* 若鏈隊(duì)為空則停止運(yùn)行 */
58 if(hq->front == NULL){
59 printf("隊(duì)列為空,無(wú)法刪除! ");
60 exit(1);
61 }
62 temp = hq->front->data; /* 暫存隊(duì)尾元素以便返回 */
63 p = hq->front; /* 暫存隊(duì)尾指針以便回收隊(duì)尾結(jié)點(diǎn) */
64 hq->front = p->next; /* 使隊(duì)首指針指向下一個(gè)結(jié)點(diǎn) */
65
66 /* 若刪除后鏈隊(duì)為空,則需同時(shí)使隊(duì)尾指針為空 */
67 if (hq->front == NULL){
68 hq->rear = NULL;
69 }
70
71 free(p); /* 回收原隊(duì)首結(jié)點(diǎn) */
72 return temp; /* 返回被刪除的隊(duì)首元素值 */
73 }
74
75 /* 4.讀取隊(duì)首元素 */
76 elemType peekQueue(struct queueLK *hq)
77 {
78 /* 若鏈隊(duì)為空則停止運(yùn)行 */
79 if(hq->front == NULL){
80 printf("隊(duì)列為空,無(wú)法刪除! ");
81 exit(1);
82 }
83
84 return hq->front->data; /* 返回隊(duì)首元素 */
85 }
86
87 /* 5.檢查鏈隊(duì)是否為空,若為空則返回1, 否則返回0 */
88 int emptyQueue(struct queueLK *hq)
89 {
90 /* 判斷隊(duì)首或隊(duì)尾任一個(gè)指針是否為空即可 */
91 if(hq->front == NULL){
92 return 1;
93 }else{
94 return 0;
95 }
96 }
97
98 /* 6.清除鏈隊(duì)中的任何元素 */
99 void clearQueue(struct queueLK *hq)
100 {
101 struct sNode *p = hq->front; /* 隊(duì)首指針賦給p */
102 /* 依次刪除隊(duì)列中的每一個(gè)結(jié)點(diǎn),最后使隊(duì)首指針為空 */
103 while(p != NULL){
104 hq->front = hq->front->next;
105 free(p);
106 p = hq->front;
107 } /* 循環(huán)結(jié)束后隊(duì)首指針已為空 */
108
109 hq->rear = NULL; /* 置隊(duì)尾指針為空 */
110 return;
111 }
112
113 /************************************************************************/
114
115 int main(int argc, char* argv[])
116 {
117 struct queueLK q;
118 int a[8] = {3, 8, 5, 17, 9, 30, 15, 22};
119 int i;
120
121 initQueue(&q);
122 for(i = 0; i < 8; i ){
123 enQueue(&q, a[i]);
124 }
125 printf("%d ", outQueue(&q));
126 printf("%d ", outQueue(&q));
127
128 enQueue(&q, 68);
129 printf("%d ", peekQueue(&q));
130 printf("%d ", outQueue(&q));
131
132 while(!emptyQueue(&q)){
133 printf("%d ", outQueue(&q));
134 }
135
136 printf("");
137 clearQueue( &q);
138 system("pause");
139
140 return 0;
141 }
2 #include <stdlib.h>
3
4 typedef int elemType;
5 /************************************************************************/
6 /* 以下是關(guān)于隊(duì)列鏈接存儲(chǔ)操作的6種算法 */
7 /************************************************************************/
8
9 struct sNode{
10 elemType data; /* 值域 */
11 struct sNode *next; /* 鏈接指針 */
12 };
13
14 struct queueLK{
15 struct sNode *front; /* 隊(duì)首指針 */
16 struct sNode *rear; /* 隊(duì)尾指針 */
17 };
18
19 /* 1.初始化鏈隊(duì) */
20 void initQueue(struct queueLK *hq)
21 {
22 hq->front = hq->rear = NULL; /* 把隊(duì)首和隊(duì)尾指針置空 */
23 return;
24 }
25
26 /* 2.向鏈隊(duì)中插入一個(gè)元素x */
27 void enQueue(struct queueLK *hq, elemType x)
28 {
29 /* 得到一個(gè)由newP指針?biāo)赶虻男陆Y(jié)點(diǎn) */
30 struct sNode *newP;
31 newP = malloc(sizeof(struct sNode));
32 if(newP == NULL){
33 printf("內(nèi)存空間分配失敗! ");
34 exit( 1 );
35 }
36
37 /* 把x的值賦給新結(jié)點(diǎn)的值域,把新結(jié)點(diǎn)的指針域置空 */
38 newP->data = x;
39 newP->next = NULL;
40
41 /* 若鏈隊(duì)為空,則新結(jié)點(diǎn)即是隊(duì)首結(jié)點(diǎn)又是隊(duì)尾結(jié)點(diǎn) */
42 if(hq->rear == NULL){
43 hq->front = hq->rear = newP;
44 }else {
45 /* 若鏈隊(duì)非空,則依次修改隊(duì)尾結(jié)點(diǎn)的指針域和隊(duì)尾指針,使之指向新的隊(duì)尾結(jié)點(diǎn) */
46 hq->rear = hq->rear->next = newP; /* 注意賦值順序哦 */
47 }
48 return;
49 }
50
51 /* 3.從隊(duì)列中刪除一個(gè)元素 */
52 elemType outQueue(struct queueLK *hq)
53 {
54 struct sNode *p;
55 elemType temp;
56
57 /* 若鏈隊(duì)為空則停止運(yùn)行 */
58 if(hq->front == NULL){
59 printf("隊(duì)列為空,無(wú)法刪除! ");
60 exit(1);
61 }
62 temp = hq->front->data; /* 暫存隊(duì)尾元素以便返回 */
63 p = hq->front; /* 暫存隊(duì)尾指針以便回收隊(duì)尾結(jié)點(diǎn) */
64 hq->front = p->next; /* 使隊(duì)首指針指向下一個(gè)結(jié)點(diǎn) */
65
66 /* 若刪除后鏈隊(duì)為空,則需同時(shí)使隊(duì)尾指針為空 */
67 if (hq->front == NULL){
68 hq->rear = NULL;
69 }
70
71 free(p); /* 回收原隊(duì)首結(jié)點(diǎn) */
72 return temp; /* 返回被刪除的隊(duì)首元素值 */
73 }
74
75 /* 4.讀取隊(duì)首元素 */
76 elemType peekQueue(struct queueLK *hq)
77 {
78 /* 若鏈隊(duì)為空則停止運(yùn)行 */
79 if(hq->front == NULL){
80 printf("隊(duì)列為空,無(wú)法刪除! ");
81 exit(1);
82 }
83
84 return hq->front->data; /* 返回隊(duì)首元素 */
85 }
86
87 /* 5.檢查鏈隊(duì)是否為空,若為空則返回1, 否則返回0 */
88 int emptyQueue(struct queueLK *hq)
89 {
90 /* 判斷隊(duì)首或隊(duì)尾任一個(gè)指針是否為空即可 */
91 if(hq->front == NULL){
92 return 1;
93 }else{
94 return 0;
95 }
96 }
97
98 /* 6.清除鏈隊(duì)中的任何元素 */
99 void clearQueue(struct queueLK *hq)
100 {
101 struct sNode *p = hq->front; /* 隊(duì)首指針賦給p */
102 /* 依次刪除隊(duì)列中的每一個(gè)結(jié)點(diǎn),最后使隊(duì)首指針為空 */
103 while(p != NULL){
104 hq->front = hq->front->next;
105 free(p);
106 p = hq->front;
107 } /* 循環(huán)結(jié)束后隊(duì)首指針已為空 */
108
109 hq->rear = NULL; /* 置隊(duì)尾指針為空 */
110 return;
111 }
112
113 /************************************************************************/
114
115 int main(int argc, char* argv[])
116 {
117 struct queueLK q;
118 int a[8] = {3, 8, 5, 17, 9, 30, 15, 22};
119 int i;
120
121 initQueue(&q);
122 for(i = 0; i < 8; i ){
123 enQueue(&q, a[i]);
124 }
125 printf("%d ", outQueue(&q));
126 printf("%d ", outQueue(&q));
127
128 enQueue(&q, 68);
129 printf("%d ", peekQueue(&q));
130 printf("%d ", outQueue(&q));
131
132 while(!emptyQueue(&q)){
133 printf("%d ", outQueue(&q));
134 }
135
136 printf("");
137 clearQueue( &q);
138 system("pause");
139
140 return 0;
141 }
轉(zhuǎn)載于:https://www.cnblogs.com/smalltigerlee/archive/2011/10/26/2224944.html
總結(jié)
以上是生活随笔為你收集整理的数据结构C语言实现—队列操作的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【译】Lesson 1: 一个三角形和一
- 下一篇: 转: Linux下单网卡多vlan多虚拟