C語言實現鏈佇列的基本操作
阿新 • • 發佈:2019-02-02
//標頭檔案內容
*************************************************鏈佇列.h*******************************************************
#include<stdio.h> #include<malloc.h> #include<stdlib.h> #define OK 1 int yes=0; typedef struct node { char data; struct node *next; }node,*queueptr; typedef struct { queueptr front; queueptr rear; }linkqueue;
**********************************************鏈佇列.c***********************************************************
#include<stdio.h> #include<stdlib.h> #include"鏈佇列.h" void initqueue(linkqueue *q) //初始化操作,建立一個空佇列 { q->front=q->rear=(queueptr)malloc(sizeof(node)); if(!(q->front)) exit(1); q->front->next=0; } void enqueue(linkqueue *q,char e) //插入新元素e到佇列中併成為隊尾元素 { queueptr p; p=(queueptr)malloc(sizeof(node)); if(!p)exit(1); p->data=e; p->next=0; q->rear->next=p; q->rear=p; } void creatqueue(linkqueue *q) //建立一個長度由自己決定的佇列並初始化 { int i,length; int num; queueptr p; printf("請輸入佇列長度:\n"); scanf("%d",&length); printf("請輸入佇列的元素:\n"); for(i=0;i<length;i++) { p=(queueptr)malloc(sizeof(node)); if(!p)exit(1); scanf("%d",&num); p->data=num; p->next=0; q->rear->next=p; q->rear=p; } yes=1; } void destroyqueue(linkqueue *q) //若佇列存在,則銷燬它 { if(!q) { printf("鏈佇列已經是空佇列!\n"); exit(1); } while(q->front) { q->rear=q->front->next; free((q->front)); q->front=q->rear; if(!q->rear) free(q->rear); } free(q->front); } void disqueue(linkqueue *q) //輸出佇列元素 { node *r=q->front->next; printf("此時的鏈佇列輸出:\n"); while(r) { printf("%d ",r->data); r=r->next; } printf("\n"); } void lenqueue(linkqueue *q) //求佇列長度 { node *r=q->front->next; int s=0; printf("此時的鏈佇列長度為:\n"); while(r) { r=r->next; s++; } printf("%d\n",s); } char dequeue(linkqueue *q,int e) //刪除佇列中隊頭元素,並用e返回其值 { node *p; if(q->front==q->rear) return -1; p=q->front->next; e=p->data; q->front->next=p->next; if(q->rear==p) q->rear=q->front; free(p); return e; } int queueempty(linkqueue *q) // 判斷佇列是否為空 { if(q->front==q->rear) return 1; else return 0; } void menu() //選單 { printf(" 鏈佇列試驗統一介面 \n"); printf("********************************************\n"); printf("1 建立鏈佇列! *\n"); printf("2 鏈佇列入隊操作! *\n"); printf("3 鏈隊列出隊操作! *\n"); printf("4 求鏈佇列長度! *\n"); printf("5 判斷鏈佇列是否為空! *\n"); printf("6 輸出鏈佇列! *\n"); printf("7 銷燬鏈佇列! *\n"); printf("0 退出! *\n"); printf("********************************************\n"); }
*************************************************************Test.c***************************************************
#include<stdio.h> #include<malloc.h> #include<stdlib.h> #include"鏈佇列.c" int main(void) { linkqueue ptr; int sel; int num; initqueue(&ptr); while(1) { menu(); printf("please input command:\n"); scanf("%d",&sel); switch(sel) { case 1:if(yes==1) { printf("此時表已建立!不能再次建立!\n"); break; } else creatqueue(&ptr);break; case 2:if(yes==0) { printf("此時表未建立!不能入隊!\n"); break; } else { printf("請輸入隊的元素值:"); scanf("%d",&num); enqueue(&ptr,num); break; } case 3:if(yes==0) { printf("此時表為建立!不能出隊!\n"); break; } else { num=dequeue(&ptr,num); printf("目前出隊的元素是%d",num); break; } case 4:if(yes==0) { printf("此時鏈佇列未建立!不能求其長度!\n"); break; } lenqueue(&ptr); break; case 5:if(yes==0) { printf("此時表未建立!不能判斷是否為空!\n"); break; } else { if(queueempty(&ptr)) printf("此時佇列為空佇列!\n"); else printf("此時佇列為非空佇列!\n"); break; } case 6:if(yes==0) { printf("此時鏈佇列未建立!不能輸出!\n"); break; } disqueue(&ptr); break; case 7:if(yes==0) { printf("此時鏈佇列未建立!不能銷燬!\n"); break; } destroyqueue(&ptr); printf("銷燬成功\n"); break; case 0:exit(1);break; default:printf("輸入命令錯誤!請重新輸入:\n"); break; } } return OK; }