# 链式存储 #include#include #define STACK_INIT_SIZE 100//存储空间初始分配量#define STACKINCREMENT 10//存储空间分配增量#define TURE 1#define FALSE 0#define OK 1#define ERROR 0#define OVERFLOW -2typedef 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;}