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; }

 

posted @ 2018-11-16 20:02  yin_zhaozhao  阅读(249)  评论(0编辑  收藏  举报