資料結構---線性表(鏈式佇列)
阿新 • • 發佈:2018-12-16
LinkQueue.h
#ifndef __LINKQUEUE__H_ #define __LINKQUEUE__H_ //一些庫函式的標頭檔案包含 #include <string.h> #include <ctype.h> #include <malloc.h> #include <limits.h> #include <stdio.h> #include <stdlib.h> #include <io.h> #include <math.h> //自定義bool typedef int Boolean; //定義函式返回狀態 typedef int Status; #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 typedef struct Node { int data; struct Node *next; }LNode,*PNode; typedef struct queue { PNode front; //佇列頭指標 PNode rear; //佇列尾指標 }Queue; /* 初始化 */ Status init(Queue *que); /* 銷燬 */ Status destroy(Queue *que); /* 重置 */ Status clear(Queue *que); /* 判空 */ Boolean isEmpty(Queue que); /* 獲取已存元素的數量 */ int listLen(Queue que); /* 獲取佇列頭元素 */ Status getFront(Queue que, int *front); /* 入隊 */ Status inQue(Queue *que, int elem); /* 出隊 */ Status outQue(Queue *que, int *out_elem); /* 根據給定關係改變元素的值 */ Status traverse(Queue que, void (*vi)(int *) ); #endif
LinkQueue.c
#include "LinkQueue.h" /* 初始化 */ Status init(Queue *que) { PNode p; p = (PNode)malloc(sizeof(LNode)); if(!p) { printf("動態記憶體分配失敗"); exit(-1); } (*que).front = p; (*que).rear = p; (*que).front->next = NULL; return OK; } /* 銷燬 */ Status destroy(Queue *que) { PNode p; while(que->front) { p = que->front->next; free(que->front); que->front = p; } return OK; } /* 重置 */ Status clear(Queue *que) { PNode q,p = que->front->next; while(p) { q = p->next; free(p); p = q; } que->rear = que->front; que->front->next = NULL; return OK; } /* 判空 */ Boolean isEmpty(Queue que) { if(que.front == que.rear) { return TRUE; } else { return FALSE; } } /* 獲取已存元素的數量 */ int listLen(Queue que) { int i = 0; PNode p = que.front->next; while(p) { i++; p = p->next; } return i; } /* 獲取佇列頭元素 */ Status getFront(Queue que, int *front) { PNode p = que.front->next; //if(!p) //{ // return ERROR; //} if(que.front == que.rear) { return ERROR; } *front = p->data; return OK; } /* 入隊 ,在隊尾插入元素*/ Status inQue(Queue *que, int elem) { PNode p = (PNode)malloc(sizeof(LNode)); p->data = elem; p->next = NULL; que->rear->next = p; //把尾結點的指標域設定為新結點 que->rear = p; //把佇列尾指標設定為新結點 return OK; } /* 出隊 ,在隊頭刪除元素*/ Status outQue(Queue *que, int *out_elem) { PNode p = que->front->next; //獲取首結點 if(que->front == que->rear) { return ERROR; } que->front->next = p->next; //吧頭結點的指標域設定為首結點的下個結點 *out_elem = p->data; if(que->rear == p)//如果只有一個有效結點 { que->rear = que->front; } free(p); p = NULL; return OK; } /* 根據給定關係改變元素的值 */ Status traverse(Queue que, void (*vi)(int *) ) { PNode p = que.front->next; while(p) { vi(&p->data); p = p->next; } printf("\n"); return OK; }