1. 程式人生 > >c_資料結構_隊的實現

c_資料結構_隊的實現

# 鏈式儲存
#include<stdio.h> #include<stdlib.h> #define STACK_INIT_SIZE 100//儲存空間初始分配量 #define STACKINCREMENT 10//儲存空間分配增量 #define TURE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define OVERFLOW -2 typedef struct QNode{ int data; struct QNode *next; }QNode,*QueuePtr; typedef struct{ QueuePtr front;
//隊頭指標 QueuePtr rear; //隊尾指標 }LinkQueue; //批量存入資料 int create(LinkQueue &Q){ int i,n; QNode *p; printf("請輸入需要存入的元素個數:"); scanf("%d",&n); while(n<=0){ printf("\n元素個數小於了“1”,請重新輸入元素個數:"); scanf("%d",&n); } printf("請輸入元素:\n"); for(i=n;i>0;--i) { p
=(QueuePtr)malloc(sizeof(QNode)); scanf("%d",&p->data); Q.rear->next=p; //尾指標後移 Q.rear=p; //放入元素 } p->next=NULL; return OK; } //構建空隊 int InitQueue_Q(LinkQueue &Q){ Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode)); if
(!Q.front) { printf("儲存空間分配失敗!!"); exit(OVERFLOW); } Q.front->next=NULL; return OK; } //列印佇列中的元素 int pr(LinkQueue &Q,int e) { QueuePtr p; p=Q.front->next; if(Q.front==Q.rear) return ERROR; printf("\n佇列中的元素為:\n"); while(p) { printf("%d\n",p->data); p=p->next; } return OK; } int GetHead_Q(LinkQueue &Q,int &e){ if(Q.rear==Q.front)return ERROR; QueuePtr p; p=Q.front->next; //將原佇列的頭結點賦值給p e=p->data; printf("隊頭元素為:%d\n",e); return OK; } //隊尾插入元素 int EnQueue_Q(LinkQueue &Q,int &e){ QueuePtr p; p=(QueuePtr)malloc(sizeof(QNode)); if(!p){ //儲存分配失敗 printf("儲存空間分配失敗!!!\n"); exit(OVERFLOW); } printf("請輸入插入元素:"); scanf("%d",&e); p->data=e; //e賦值給p指向的空間 p->next=NULL; //p指向NULL Q.rear->next=p; Q.rear=p; //將p賦給Q return OK; } // 刪除佇列頭元素 int DeQueue_Q(LinkQueue &Q,int &e){ QNode *P; if(Q.front==Q.rear) return ERROR; P=Q.front->next ; e=P->data; Q.front ->next =P->next; //將原對頭的後繼p->next賦值給頭結點後繼 if(Q.rear ==P) //當佇列中只有一個元素時,q->rear指向頭結點 Q.rear =Q.front; free(P); printf("刪除的元素為:%d",e); return OK; } // 銷燬佇列 int dest(LinkQueue &Q){ while(Q.front){ Q.rear=Q.front->next; free(Q.front); Q.front=Q.rear; } InitQueue_Q(Q); //隊銷燬後,呼叫create()從新建立一個空隊,因為初始化不在witch語句裡 return OK; } void OperateMenu(){ printf("\n\n--------------請選擇元素處理方式---------\n\n"); printf("注:此程式為隊的實現,故只能對序列尾進行元素的插入和刪除\n\n"); printf("0> 退出程式\n\n"); printf("1> 批量存入資料\n\n"); printf("2> 獲取隊頭元素\n\n"); printf("3> 隊尾插入元素\n\n"); printf("4> 刪除隊頭元素\n\n"); printf("5> 列印佇列\n\n"); printf("6> 銷燬佇列\n\n"); printf("請選擇對元素的處理:"); } void main() { LinkQueue Q; int w,e,k,boo=1; printf("注:此測試過程輸入值應全為數字\n\n"); printf("請使用者選擇初始化隊或退出程式:\n\n"); printf("隊初始化請輸入:'1'\n\n"); printf("退出請選擇'0'或 其它!!\n\n"); printf("請選擇:"); scanf("%d",&w); if(w==1){ if(InitQueue_Q(Q)) printf("\n構建空隊成功!!"); else printf("\n構建失敗!!"); OperateMenu(); scanf("%d",&k); while(k) { switch(k) { case 0:break; case 1:boo=create(Q); if(boo) printf("\n存入成功!!\n"); else printf("\n存入失敗!!\n"); break; case 2:boo=GetHead_Q(Q,e); if(boo) printf("\n獲取成功!!\n"); else printf("\n隊為空,獲取失敗!!\n"); break; case 3:boo=EnQueue_Q(Q,e); if(boo) printf("\n插入成功!!\n"); else printf("\n插入失敗!!\n"); break; case 4:boo=DeQueue_Q(Q,e); if(boo) printf("\n刪除成功!!\n"); else printf("\n隊為空,刪除失敗!!\n"); break; case 5:boo=pr(Q,e); if(boo) printf("\n列印成功!!\n"); else printf("\n隊為空,列印失敗!!\n"); break; case 6:boo=dest(Q); if(boo) printf("\n 銷燬成功!!\n"); else printf("\n銷燬失敗!!\n"); } OperateMenu(); scanf("%d",&k); } } // return OK; }