【数据结构】数据结构C语言的实现(队列)
2016-12-17 13:27
471 查看
队列
/* * 链式队列 */ #include <stdio.h> #include <stdlib.h> #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define OVERFLOW -2 typedef int QElemType; typedef int Status; typedef struct QNode { QElemType data; // 元素数据 struct QNode *next; // 指向下一个元素的指针 } QNode, *QueuePtr; typedef struct { QueuePtr front; // 队首指针 Q->front->next指向第一个元素 QueuePtr rear; // 队尾指针 Q->rear指向最后一个元素 } LinkQueue; // 初始化队列 Status InitQueue(LinkQueue *Q) { Q->front = Q->rear = (QueuePtr)malloc(sizeof(QNode)); if (!Q->front) exit(OVERFLOW); Q->front->next = NULL; return OK; } // 销毁队列 Status DestroyQueue(LinkQueue *Q) { while (Q->front) { Q->rear = Q->front->next; free(Q->front); Q->front = Q->rear; } return OK; } // 清空队列 Status ClearQueue(LinkQueue *Q) { DestroyQueue(Q); InitQueue(Q); return OK; } // 判断队列是否为空 Status IsEmpty(LinkQueue Q) { if (Q.front->next == NULL) return TRUE; else return FALSE; } // 获取队列长度 int GetLength(LinkQueue Q) { int i = 0; QueuePtr p = Q.front; while (Q.rear != p) { i++; p = p->next; } return i; } Status GetHead(LinkQueue Q, QElemType *e) { QueuePtr p; if (Q.front == Q.rear) return ERROR; p = Q.front->next; *e = p->data; return OK; } // 入队 Status EnQueue(LinkQueue *Q, QElemType e) { QueuePtr p = (QueuePtr)malloc(sizeof(QNode)); if (!p) exit(ERROR); p->data = e; p->next = NULL; Q->rear->next = p; Q->rear = p; return OK; } // 出队 Status DeQueue(LinkQueue *Q, QElemType *e) { QueuePtr p; if (Q->front == Q->rear) return ERROR; p = Q->front->next; *e = p->data; Q->front->next = p->next; if (Q->rear == p) Q->rear = Q->front; free(p); return OK; } // 访问元素 void visit(QElemType e) { printf("%d ", e); } // 遍历队列 Status TraverseQueue(LinkQueue Q, void (*visit)(QElemType)) { QueuePtr p = Q.front->next; while (p) { visit(p->data); p = p->next; } printf("\n"); return OK; } int main() { LinkQueue Q; if (InitQueue(&Q)) { QElemType e; int i; printf("init_success\n"); if (IsEmpty(Q)) printf("queue is empty\n"); for (i = 0; i < 10; i++) EnQueue(&Q, i); GetHead(Q, &e); printf("The first element is %d\n", e); printf("length is %d\n", GetLength(Q)); DeQueue(&Q, &e); printf("delete element is %d\n", e); TraverseQueue(Q, *visit); EnQueue(&Q, 10); printf("Insert element is %d\n", 10); TraverseQueue(Q, *visit); if (DestroyQueue(&Q)) printf("\ndestroy_success\n"); } }
init_success queue is empty The first element is 0 length is 10 delete element is 0 1 2 3 4 5 6 7 8 9 Insert element is 10 1 2 3 4 5 6 7 8 9 10 destroy_success
相关文章推荐
- 数据结构C语言实现系列——队列
- 数据结构.队列(C语言实现)
- 数据结构:循环队列(C语言实现)
- 数据结构---队列C语言实现
- 数据结构队列及其用法(C语言实现)
- 数据结构实现链式队列(C语言)
- 数据结构:循环队列(C语言实现)
- 数据结构:循环队列(C语言实现)
- 数据结构:循环队列(C语言实现)
- 数据结构:循环队列(C语言实现)
- 数据结构C语言实现系列——队列
- [数据结构]C语言队列的实现
- (C语言队列的顺序实现(数据结构十)
- 数据结构C语言实现系列——队列
- 数据结构C语言实现之链式队列的6种算法代码
- 数据结构 --静态队列的一个简单的C语言代码实现
- (C语言)队列的链式实现(数据结构十一)
- (C语言)队列的链式实现(数据结构十一)
- c语言实现数据结构中的队列
- 数据结构:循环队列(C语言实现)