功能模块设计
编写一个程序实现链队列的各种基本运算,并在此基础上设计一个主程序,完成如下功能:
- 初始化并建立链队列
- 销毁链队列
- 入队
- 出队
- 遍历链队列
- 判断链队列是否为空
- 清空链队列
- 获取链队列长度
- 获取链队列头元素
完整代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190
| #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include <time.h>
typedef int QElemType; typedef struct QNode //队列节点 { QElemType data; struct QNode* next; } QNode, * QueuePtr; typedef struct { QueuePtr front; QueuePtr rear; } LinkQueue;
int InitQueue(LinkQueue* Q); int DestroyQueue(LinkQueue* Q); int EnQueue(LinkQueue* Q, QElemType e); int DeQueue(LinkQueue* Q, QElemType* e); int QueueEmpty(LinkQueue Q); void ClearQueue(LinkQueue* Q); int QueueLength(LinkQueue Q); int GetHead(LinkQueue Q, QElemType* e); void QueueTraverse(LinkQueue Q);
int main(void) { int n = 0, k = 0, i = 0; QElemType d = 0; LinkQueue Q; srand((unsigned)time(NULL)); int status = InitQueue(&Q); if (status) printf("队列初始化成功!\n"); else printf("队列初始化失败!\n"); printf("输入队列初始元素个数:"); scanf("%d", &n); printf("队列初始化成功!\n执行%d次入队操作:\n", n); for (i = 0; i < n; i++) { d = rand() % 90 + 10; printf("第%-2d次:元素%d入队\n", i + 1, d); EnQueue(&Q, d); } printf("打印当前队列:"); QueueTraverse(Q); k = QueueLength(Q); printf("\n当前队列长度为:%d\n\n", QueueLength(Q)); printf("执行%d次出队操作:\n", k / 2); for (i = 0; i < k / 2; i++) { DeQueue(&Q, &d); printf("第%-2d次:元素%d出队", i + 1, d); printf("\t打印当前队列:"); QueueTraverse(Q); } n = GetHead(Q, &d); if (n) printf("\n队头元素的值:%d\n", d); printf("执行清空队列操作\n"); ClearQueue(&Q); printf("清空队列后:q.front=%p q.rear=%p q.front->next=%p\n", Q.front, Q.rear, Q.front->next); DestroyQueue(&Q); printf("销毁队列后:q.front=%p q.rear=%p\n", Q.front, Q.rear); return 0; }
int InitQueue(LinkQueue* Q) { Q->front = Q->rear = (QueuePtr)malloc(sizeof(QNode)); if (!Q->front) return 0; Q->front->next = NULL; return 1; }
int DestroyQueue(LinkQueue* Q) { while (Q->front) { Q->rear = Q->front->next; free(Q->front); Q->front = Q->rear; } return 1; }
int EnQueue(LinkQueue* Q, QElemType e) { QueuePtr p = (QueuePtr)malloc(sizeof(QNode)); if (!p) return 0; p->data = e; p->next = NULL; Q->rear->next = p; Q->rear = p; return 1; }
int DeQueue(LinkQueue* Q, QElemType* e) { if (Q->front == Q->rear) return 0; QueuePtr p = Q->front->next; *e = p->data; Q->front->next = p->next; if (Q->rear == p) Q->rear = Q->front; free(p); return 1; }
int QueueEmpty(LinkQueue Q) { if (Q.front->next == NULL) return 1; else return 0; }
void ClearQueue(LinkQueue* Q) { Q->front->next = NULL; }
int QueueLength(LinkQueue Q) { int i = 0; QueuePtr p = Q.front; while (p != Q.rear) { i++; p = p->next; } return i; }
int GetHead(LinkQueue Q, QElemType* e) { QueuePtr p; if (Q.front == Q.rear) return 0; p = Q.front->next; *e = p->data; return 1; }
void QueueTraverse(LinkQueue Q) { QueuePtr p = Q.front->next; while (p) { printf("%d ", p->data); p = p->next; } printf("\n"); }
|
运行方法
- 新建一个cpp文件,命名为”main.cpp”。
- 将完整代码复制粘贴至”main.cpp”中。
- 利用Dev C++运行”main.cpp”即可。
运行结果