#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
typedef struct Queue {
int data;
struct Queue * next;
}Queue; //队列数据项的组成,数据部分和next指针
typedef struct {
struct Queue *front;
struct Queue *rear;
}Linkqueue; //定义一个数据结构队列[限制操作],需要头指针和尾指针
int Init (Linkqueue &Q){//创建队列,建立一个头节点,易于操作
Q.front=Q.rear=(Queue *)malloc(sizeof(Queue));
if (! Q.front ) return -1;
Q.front->next=NULL;
return 1;
}
//int Destory (Linkqueue &Q){//销毁队列,不保留头结点即彻底销毁队列
//
// while (Q.front){
// Q.rear=Q.front->next;
// free (Q.front);
// Q.front=Q.rear;
// }
// return 1;
//}
int Destory (Linkqueue &Q){//销毁队列,保留头结点
Queue *p=Q.front->next;
while (p){
Q.rear=p->next;
free (p);
p=Q.rear;
}
Q.front->next=NULL;
Q.rear=Q.front;
return 1;
}
//
int Enqueue (Linkqueue &Q, int e ){//入队
Queue *p;
p=(Queue *)malloc(sizeof(Queue));
if (!p) return 0;
p->data=e;
p->next=NULL;
Q.rear->next=p;
Q.rear=p;
return 1;
}
int Dequeue (Linkqueue &Q,int &e){ //出队
if (Q.front==Q.rear) return 0;
Queue *p;
p=Q.front->next;
e=p->data;
Q.front->next=p->next;
if (p==Q.rear) //注意,若仅有一个队列成员,则要将尾指针指向头节点,防止丢失
Q.rear=Q.front;
free(p);
return 1;
}
void show (Linkqueue Q){
Queue * p;
p=Q.front->next;
if (Q.front==Q.rear) {
printf("空队\n");
}
while (p){
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
int main()
{
Linkqueue Q;
int i,x;
if (Init(Q))printf("[单链表创建成功]\n");
printf("1:插入元素到队尾\n2:删除队头元素\n3:销毁队列\n4:展示队列\n0:退出\n");
while (1){
scanf("%d",&i);
switch (i) {
case 1:
printf("输入插入元素\n");
scanf("%d",&x);
if (Enqueue(Q,x)==1) printf("插入成功\n");
else printf("插入失败\n");
break;
case 2:
printf("删除队头元素\n");
if (Dequeue (Q,x)==1) printf("成功删除%d\n",x);
else printf("删除失败\n");
break;
case 3:
if (Destory ( Q)) printf("销毁成功\n");
// Init(Q);printf("重置空表\n");
break;
case 4:
show (Q);
break;
}
}
return 0;
}
单链队列的基本操作实现
最新推荐文章于 2022-03-14 18:01:46 发布