redtie 2023-04-14 17:34:40

。。。

//Queue On Link Structure
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#define MAXSIZE  100
#define FALSE   0
#define TRUE    1

typedef int QueueElementType; //数据元素类型定义

typedef struct Node
{
  QueueElementType  data;     /*数据域*/
  struct Node        *next;     /*指针域*/
}LinkQueueNode;

typedef struct 
{
  LinkQueueNode   * front;
  LinkQueueNode   * rear;
}LinkQueue; 




void InitQueue(LinkQueue *Q);//初始化队列 
int IsEmpty(LinkQueue *Q);//判空 
int IsFull(LinkQueue *Q);//判满 
int EnterQueue(LinkQueue *Q, QueueElementType x); //进队列 
int DeleteQueue(LinkQueue *Q, QueueElementType *x); //出队列 
void PrintQueue(LinkQueue *Q);  //从队头打印到队尾(a1,a2,a3,...,an)
void ClearQueue(LinkQueue *Q);  //清空队列(队列的所有节点空间都释放,包括队列头节点) 
void PrintQueue2(LinkQueue *Q);  //从队尾打印到队头(an,an-1,an-1,...,a1)
int length(LinkQueue *Q); //长度
 
int main()
{
	LinkQueue Q;  //创建一个队列Q 
	QueueElementType x=0;
	QueueElementType y=0;
	//生成菜单 
	char sel=' ';
	while(sel!='0')
	{
		
		printf("------队列(链式顺序存储结构)演示系统-------\n");
		printf("   版本:1.0   作者:XXXXXX 日期:yyyy-mm-dd\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("       0.退出系统\n");
		printf("请输入选项[0-7]:"); 
		sel=getch();
		switch(sel)
		{
			case '1':
				printf("初始化队列.\n");
			    InitQueue(&Q); 
				system("pause"); //按任意键继续 
				break;
			case '2':
				printf("进队列操作.\n");   
				//... 
				printf("请输入进队元素\n");
				scanf("%d",&x);
				if(EnterQueue(&Q,x)==TRUE){
					printf("进队成功\n");
				}
				system("pause"); //按任意键继续 
				break;
			case '3':
				printf("出队列操作.\n");
				//... 
				if(DeleteQueue(&Q,&y)==TRUE){
					printf("出队成功 元素为:%d\n",y);
				}
				system("pause"); //按任意键继续 
				break;
			case '4':
				printf("打印队列长度操作.\n");
				//... 
				printf("长度:%d",length(&Q));
				system("pause"); //按任意键继续 
				break;
			case '5':
				printf("打印队列操作.\n");
				//... 
				printf("队头到队尾\n");
				PrintQueue(&Q);
				printf("队尾到队头\n");
				PrintQueue2(&Q);
				printf("\n");
				system("pause"); //按任意键继续 
				break;
			case '6':
				system("cls");
				break;
			case '7':
				printf("清空队里的所有元素.\n");
				//... 
				ClearQueue(&Q);
				system("pause"); //按任意键继续 
			
				break;
			case '0':
				printf("\n谢谢使用,再见!\n");
				break;
			default:
				printf("您输入的选项不合法,请重新选择!\n");
		}
	}

	return 0;
}


void InitQueue(LinkQueue *Q)//初始化队列 
{
	  LinkQueueNode *p;
	  p=(LinkQueueNode*)malloc(sizeof(LinkQueueNode));
//      Q->front=Q->rear=(LinkQueue*)malloc(sizeof(LinkQueueNode));
      Q->front=Q->rear=p;
      p->next=NULL;
      printf("初始化成功\n");
}

int IsEmpty(LinkQueue *Q)//判空
{
	
		if(Q->rear==Q->front){
			return TRUE; //判空 
		}else{
			return FALSE; //非空 
		}
	
	
} 
 
int IsFull(LinkQueue *Q)//判满 
{
	LinkQueueNode *p;
	p=Q->front;
	int i=0;
if(IsEmpty(Q)==FALSE){
	return FALSE;
}
while(p!=Q->rear){
	i++;
	p=p->next;
}
if(i==MAXSIZE){
	return TRUE;
}else{
	return FALSE;
}
}


int EnterQueue(LinkQueue *Q, QueueElementType x) //进队列 
{
	if(IsFull(Q)==TRUE){
		return FALSE;
	}
  
  LinkQueueNode *p;
  p=(LinkQueueNode*)malloc(sizeof(LinkQueueNode));
  p->next=NULL;
  p->data=x;
  LinkQueueNode *temp=Q->front;
  while(temp!=Q->rear){
  	temp=temp->next;
  }
  temp->next=p;
   Q->rear=p;
return TRUE;
}
int DeleteQueue(LinkQueue *Q, QueueElementType *x) //出队列 
{
  LinkQueueNode *p,*p1;
  if(IsEmpty(Q)==TRUE){
  	return FALSE;
  }
  p=Q->front;
  p1=p->next;
  if(p1->next!=NULL){
  p->next=p->next->next;
}else{
	Q->rear=Q->front;
}
*x=p1->data;
free(p1);
return TRUE;
}

int length(LinkQueue *Q) //长度
{
 int i=0;
 LinkQueueNode *p;
 p=Q->front;
 while(p!=Q->rear){
 i++;
 p=p->next;	
 }
 return i;
}


void PrintQueue(LinkQueue *Q) //从队头打印到队尾(a1,a2,a3,...,an)
{
 LinkQueueNode *p;
 p=Q->front;
 if(IsEmpty(Q)==TRUE){
 	//kon
 	printf("空\n");
 }else{
 	while(p!=Q->rear){
		 p=p->next;
 		printf("%d ",p->data);
	 }
	 printf("\n打印完成\n");
 }
}


void ClearQueue(LinkQueue *Q) //清空队列(队列的所有节点空间都释放,包括队列头节点) 
{
 LinkQueueNode *p,*p1;
 p1=p=Q->front;
 while(p!=Q->rear){
 	
	 p=p->next;
 	free(p1);
 	p1=p;
 }
free(Q->rear);
}


void PrintQueue2(LinkQueue *Q)  //从队尾打印到队头(an,an-1,an-1,...,a1)
{
	LinkQueueNode *p,*p1;
	if(Q->front==Q->rear){
		printf("空\n");
	}else{
	

p1=Q->front; 
p=Q->rear;
while(p!=Q->front){
	p1=Q->front;
	while(p1->next!=p){
		p1=p1->next;
		
	}
	printf("%d ",p->data);
	p=p1;
}
}
}

评论

首页 - Wiki
Copyright © 2011-2024 iteam. Current version is 2.138.0. UTC+08:00, 2024-12-22 12:00
浙ICP备14020137号-1 $访客地图$