#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#define MAX 100
/**
*@Name:线性表--队列--链接表示
*@Description:链接队列的创建,元素的入队、出队、取队头元素,队列溢出的判断等基本操作。
*@Author:Freedoman
*@Date: 2014-8-10
*/
struct Node /*链接队列元素结点类型*/
{
int data; /*结点数据域*/
struct Node * next; /*结点指针域*/
};
typedef struct Node * PNode;
struct LinkedQueue /*链接栈类型*/
{
PNode head; /*队头*/
PNode tail; /*队尾*/
};
typedef struct LinkedQueue * PLinkedQueue;
/*函数声明*/
PLinkedQueue createNullLinkedQueue();
int isNullLinkedQueue(PLinkedQueue curLinkedQueue);
int enQueue(PLinkedQueue curLinkedQueue);
int deQueue(PLinkedQueue curLinkedQueue);
int loadQueueHeadElement(PLinkedQueue curLinkedQueue);
void printLinkedQueue(PLinkedQueue curLinkedQueue);
/*------------创建空队列(带头结点和尾结点)------------*/
PLinkedQueue createNullLinkedQueue(){
printf("创建空队列\n");
PLinkedQueue curLinkedQueue = (PLinkedQueue)malloc(sizeof(PLinkedQueue));
PNode p = (PNode)malloc(sizeof(Node));
if(p != NULL){
curLinkedQueue->head = p;
curLinkedQueue->tail = curLinkedQueue->head;
curLinkedQueue->head->next = NULL;
printf("创建成功!\n");
}else{
printf("创建失败!\n");
}
return curLinkedQueue;
}
/*-------------判断当前队列是否为空------------*/
int isNullLinkedQueue(PLinkedQueue curLinkedQueue){
if(curLinkedQueue->head == curLinkedQueue->tail){
printf("空队列!\n");
return 1;
}else{
printf("非空队列!\n");
return 0;
}
}
/*-----------元素入队(限定在队尾操作)---------*/
int enQueue(PLinkedQueue curLinkedQueue){
printf("元素入队\n");
int data;
printf("请输入元素>>>");
scanf("%d",&data);
PNode p = (PNode)malloc(sizeof(Node));
if(p != NULL){
p->data = data;
p->next = NULL;
curLinkedQueue->tail->next = p;
curLinkedQueue->tail = p;
printf("入队成功!\n");
printLinkedQueue(curLinkedQueue);
return 1;
}
return 0;
}
/*------元素出队(既定在队头操作)----------*/
int deQueue(PLinkedQueue curLinkedQueue){
// 出队可能产生下溢
if(!isNullLinkedQueue(curLinkedQueue)){
PNode temp = curLinkedQueue->head->next;
curLinkedQueue->head->next = temp->next;
if(temp->next == NULL){
curLinkedQueue->tail = curLinkedQueue->head;
}
free(temp);
printf("出队成功!\n");
printLinkedQueue(curLinkedQueue);
return 1;
} else{
printf("下溢!\n");
}
return 0;
}
/*---------取队头元素------------*/
int loadQueueHeadElement(PLinkedQueue curLinkedQueue){
if(!isNullLinkedQueue(curLinkedQueue)){
int x = curLinkedQueue->head->next->data;
printf("队头元素>>>>%d\n",x);
return x;
}
return 0;
}
/*-------------从头到尾打印队列元素--------*/
void printLinkedQueue(PLinkedQueue curLinkedQueue){
PNode temp;
temp = curLinkedQueue->head->next;
printf("打印[");
do{
printf(" %d ",temp->data);
temp = temp->next;
}while(temp != NULL);
printf("]\n");
}
int main(){
int input;
PLinkedQueue curLinkedQueue = NULL;
printf("\n------链接队列的基本操作------\n");
while(1){
printf("\n 1_创建空队列\n 2_判断当前队列是否为空\n");
printf(" 3_元素入队\n 4_元素出队\n 5_取队头元素\n 6_打印当前队列元素\n");
printf("\n请选择>>>");
scanf("%d",&input);
switch(input){
case 1 : curLinkedQueue = createNullLinkedQueue();break;
case 2 : isNullLinkedQueue(curLinkedQueue);break;
case 3 : enQueue(curLinkedQueue);break;
case 4 : deQueue(curLinkedQueue);break;
case 5 : loadQueueHeadElement(curLinkedQueue);break;
case 6 : printLinkedQueue(curLinkedQueue);break;
default : printf("当前输入有误!\n");
}
}
return 0;
}
线性表----队列(链接表示)的基本操作
最新推荐文章于 2022-04-15 15:51:12 发布