#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;
/* 链式队列节点结构体定义 */
typedef struct LinkNode{
ElemType data;
struct LinkNode *next;
}LinkNode;
/* 链式队列结构体定义 */
typedef struct{
LinkNode *front;
LinkNode *rear;
}LinkQueue;
/* 初始化操作 */
void init(LinkQueue *Queue)
{
//初始时front、rear都指向头节点
Queue->front = (LinkNode *)malloc(sizeof(LinkNode));
Queue->rear = Queue->front;
Queue->front->next = NULL;
}
/* 销毁操作 */
void destory(LinkQueue *Queue)
{
LinkNode *now = Queue->front->next;
LinkNode *temp = NULL;
while (now != NULL)//循环释放所有指针,now表示当前节点,temp用于临时保存节点并进行释放
{
temp = now;
now = now->next;
free(temp);
}
//将front、rear指针释放
free(Queue->front);
Queue->rear = NULL;
}
/* 输出操作 */
void display(LinkQueue Queue)
{
if (Queue.front->next == NULL)//空队
{
printf("链队为空,不允许进行输出操作");
return;
}
int i = 1;
LinkNode *p = Queue.front->next;
while (p != NULL)
{
printf("Queue[%d] = %d\n",i,p->data);
p = p->next;
i++;
}
}
/* 入队操作 */
int push(LinkQueue *Queue,int x)//队尾入队
{
LinkNode *p = (LinkNode *)malloc(sizeof(LinkNode));
if (p == NULL)
return -1; //空间分配失败
p->data = x;
p->next = NULL;//将新节点的next指针置空
if (Queue->front->next == NULL)//队列为空
{
Queue->front->next = p;
}else{
Queue->rear->next = p;
}
Queue->rear = p;
return 1;
}
/* 出队操作 */
int pop(LinkQueue *Queue,int *popNum)//队头出队
{
if (Queue->front->next == NULL)
return -1;//链队为空
LinkNode *p = Queue->front->next;
*popNum = p->data;
Queue->front->next = p->next;
if (Queue->rear == p) //最后一个节点则需要更新尾指针
Queue->rear = Queue->front;//尾指针指回头节点
free(p);
return 1;
}
/* 取队头元素操作 */
int peek(LinkQueue Queue,int *peekNum)
{
if (Queue.front->next == NULL)
return -1;//链队为空
*peekNum = Queue.front->next->data;
return 1;
}
/* 判空操作 */
int isempty(LinkQueue Queue)
{
if (Queue.front == Queue.rear)
return 1;//链队为空
else
return -1;//链队非空
}
/* 主函数 */
int main()
{
LinkQueue Queue;
init(&Queue);
//循环控制变量
int flag = 1;
while (flag != -1)
{
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("\n");
printf("*****************************************************************\n");
int a = 0;
scanf("%d",&a);//switch选择器
//入队操作所需参数
int x;
int pushflag;
//出队操作所需参数
int popNum;
int popflag;
//取队头元素操作所需参数
int peekNum;
int peekflag;
//判断链队是否为空操作所需参数
int isemptyflag;
switch (a)
{
case 1: printf("请输入你想要入队的元素值:");
scanf("%d",&x);
pushflag = push(&Queue,x);
if (pushflag == -1)
printf("入队失败请重试\n");
else
printf("元素入队成功\n");
break;
case 2: popflag = pop(&Queue,&popNum);
if (popflag == -1)
printf("链队为空,禁止出队!\n");
else
printf("出队成功!出队的元素为:%d\n",popNum);
break;
case 3: peekflag = peek(Queue,&peekNum);
if (peekflag == -1)
printf("链队为空,禁止取队头元素!\n");
else
printf("取队头元素成功,队头元素值为:%d",peekNum);
break;
case 4: isemptyflag = isempty(Queue);
if (isemptyflag == 1)
printf("链队为空");
else
printf("链队非空");
break;;
case 5: display(Queue);break;
case 6: destory(&Queue);break;
case 7: flag = -1;break;
default:flag = -1;
break;
}
}
}
数据结构-------------链队的定义以及基本操作的实现
最新推荐文章于 2024-10-11 18:53:59 发布