数据结构与算法(8)链队

    xiaoxiao2025-04-15  8

    在C语言中不能用动态分配的一维数组来实现循环队列,如果我们需要使用循环队列,那么就必须设定一个最大的队列长度;如果我们没有办法估计所用队列的最大长度的话,应该使用链队

    链队的结构和实现代码

    #include <stdio.h> #include <stdlib.h> #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 typedef int Status; typedef char Elemtype; typedef struct QNode{ Elemtype data; struct QNode *next; }QNode, *QueuePtr; typedef struct { QueuePtr front; QueuePtr rear; }LinkQueue; /* 链队初始化 */ Status InitQueue(LinkQueue *q) { q->front = q->rear = (QueuePtr)malloc(sizeof(QNode)); if (!q->rear) return ERROR; q->rear->next = NULL; return OK; } /* 链队销毁 */ Status DestoryQueue(LinkQueue *q) { while (q->front){ q->rear = q->front->next; free(q->front); q->front = q->rear; } return OK; } /* 入队 */ Status EnQueue(LinkQueue *q, Elemtype e) { //新建一个结点并排在队尾处 QueuePtr newNode = (QueuePtr)malloc(sizeof(QNode)); if (!newNode) return ERROR; newNode->data = e; newNode->next = NULL; (*q).rear->next = newNode; (*q).rear = newNode; return OK; } /* 出队 */ Status DeQueue(LinkQueue *q, Elemtype *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); } /* 得到队中的元素 */ Status DispQueue(LinkQueue q) { QueuePtr p; if (q.front->next == NULL) return ERROR; //空队 p = q.front->next; while (p){ printf("%c ", p->data); p = p->next; } printf("\n"); return OK; } int main() { LinkQueue q; Elemtype e; printf("初始化链队\n"); InitQueue(&q); printf("入队\n"); EnQueue(&q, 'a'); EnQueue(&q, 'b'); EnQueue(&q, 'c'); EnQueue(&q, 'd'); EnQueue(&q, 'e'); EnQueue(&q, 'f'); EnQueue(&q, 'g'); printf("链队中元素为\n"); DispQueue(q); printf("出队操作\n"); DeQueue(&q, &e); DeQueue(&q, &e); DeQueue(&q, &e); DeQueue(&q, &e); printf("链队中元素为\n"); DispQueue(q); printf("销毁链队\n"); system("pause"); return 0; }
    转载请注明原文地址: https://ju.6miu.com/read-1298088.html
    最新回复(0)