c++语言实现 顺序线性表,链式线性表, 链式队,栈,循环链表

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_44833327/article/details/102748243

本代码 来源于同僚吴成伟,仅作参考
顺序线性表功能实现

#include<cstdio>
#include <cctype>
#include<cstdlib>
#include<algorithm>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10 
#define CHUSHIHUA 0     //用于初始化线性表数据元素的值,便于移植 
typedef int Status;

//整型线性表 
typedef int ElemType;
char scan[]="%d";   //用于更换线性表数据元素类型,造成的输入格式的更改,便于移植 
char print[]="%d";  //用于更换线性表数据元素类型,造成的输出格式的更改,便于移植 
char scan1[]="%d%d";  //用于更换线性表数据元素类型,造成的输入格式的更改,便于移植 

/*
//字符型线性表   (每次只能使用一种数据类型的线性表)
typedef char ElemType;
char scan[]="%c";
char print[]="%c";
*/
/*
//浮点型线性表 
typedef double ElemType;
char scan[]="%lf";
char print[]="%lf";
*/
int num;
typedef struct {
	ElemType *elem;
	int length;
	int listsize;
}SqList;
/*
int number;  //元素的位置 
int yuansu;
int qianqu;
int houji;
int flag;
int choose;
int e;  //元素e
int cur_e;  
int pre_e ; //前驱
int next_e;  //后继 */


Status InitList(SqList &L){   //创建空表 
	if( L.elem )
		return ERROR;
	L.elem = (ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));
	if(!L.elem)
		exit(OVERFLOW);
	L.length = 0;
	L.listsize = LIST_INIT_SIZE;
	return OK;
} 
Status DestroyList(SqList &L){   //销毁线性表 
	ElemType *p=&L.elem[L.length-1];
	int i=0;
	if( !L.elem )
		return ERROR;
	for(;i<L.length;i++){
		free( p );
		p--;
	}
	L.elem=NULL;
	return OK;
}
Status ClearList(SqList &L){
	if(!L.elem)
		return ERROR;
	for(int i=0;i<L.length;i++){
		L.elem[i] = 0;
	}  
	L.length=0;
	return OK;
}
Status ListEmpty(SqList L){
	if(L.length==0)
		return TRUE;
	return FALSE;
}
Status ListLength(SqList L){
	if(!L.elem)
		return ERROR;
	return L.length;
}
Status GetElem(SqList L,int i,ElemType &e){
	if(!L.elem || i<0 || i>L.length )
		return ERROR;
	e = L.elem[i-1];
	return OK;
}

Status LocateElem(SqList L,ElemType e){
	if( !L.elem )
		return ERROR;
	int i=0;
	for(;i<L.length;i++){
		if( e==L.elem[i] ){
			num = i+1;
			return OK;
		}	
	} 
	return ERROR;
}

Status PriorElem(SqList L,int cur_e,ElemType &pre_e){
	if(!L.elem || L.elem[0]==cur_e )
		return ERROR;
	int i=1;
	for(;i<L.length;i++){
		if( L.elem[i]==cur_e ){
			pre_e = L.elem[i-1];
			return OK;
		}
	}
	return ERROR;
}
Status NextElem(SqList L,int cur_e,ElemType &next_e){
	if(!L.elem || L.elem[L.length-1]==cur_e )
		return ERROR;
	int i=0;
	for(;i<L.length;i++){
		if( L.elem[i]==cur_e ){
			next_e = L.elem[i+1];
			return OK; 
		}
	}
	return ERROR;
}
Status ListInsert(SqList &L,int i,ElemType e){
	if( !L.elem || i<0 || i>L.length+1 )   //空表,或非法数据的判断 
		return ERROR;
	//第i个元素之后的元素开始数据的后移
	if(L.length>=L.listsize){
		L.elem =(ElemType *)realloc(L.elem, (L.listsize+LISTINCREMENT)*sizeof(ElemType) );
		if(!L.elem)
			exit(OVERFLOW);
		L.listsize+=LISTINCREMENT;
	} 
	ElemType *end=&L.elem[L.length-1];
	ElemType *star=&L.elem[i-1];
	for(;end>=star;end--){
		*(end+1) = *end;
	}
	*star = e;
	++L.length;
	return OK;
}
Status ListDelete(SqList &L,int i,ElemType &e){
	if( !L.elem || i<1 || i>L.length+1 )
		return ERROR;
	ElemType *star = &L.elem[i-1];
	ElemType *end = &L.elem[L.length-1];
	e = *star;
	for(;star<=end;star++){
		*star = *(star+1);
	}
	L.length--;
	return OK;
}
void search(SqList L){   //遍历整个线性表 
	if(!L.elem){
		printf("线性表未创建,无法遍历\n"); 
		return ; 
	} 
	ElemType *star = L.elem;
	int i=1;
	ElemType  *end = &L.elem[L.length-1];
	for(;star<=end;star++,i++){
		printf("线性表第 %d ",i);	
		printf(" 个元素为 ");
		printf(print,*star);
		printf("\n");
	}
}
void WindowsPut(){
	system("cls");	
	printf("   *******************************************************************\n");
	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("***                   8   线性表前驱元素获取                          ***\n");
	printf("***                   9   线性表后驱元素获取                          ***\n");
	printf("***                   10  线性表插入元素                              ***\n");
	printf("***                   11  线性表删除元素                              ***\n");
	printf("***                   12  线性表遍历                                  ***\n"); 
	printf("***                   0   线性表操作结束                              ***\n");
	printf("   *******************************************************************\n");
	if(sizeof(ElemType)==4)
	printf("   ************************整型线性表*********************************\n");
	else if(sizeof(ElemType)==1)
	printf("   ************************字符型线性表*******************************\n");
	else 
	printf("   ************************浮点型线性表*******************************\n"); 
	printf("   *******************************************************************\n");
}
void Choose(int choose){	
} 
int main(){
	SqList L;
	L.elem=NULL;
	int i;  //元素的位置 
	int choose;
	ElemType e;
	ElemType qianqu,houji;
	printf("代码过程,编译过程有点慢,请稍等......");
	while( 1 ){
		WindowsPut();
		printf("请输入线性表的操作值:");
		scanf("%d",&choose);
		if(choose==6){
			printf("请输入需要获取的元素的位置:"); 
			scanf("%d",&i);
		}
		else if(choose==8){
			printf("请输入需要输出前驱元素的后继: ");
			scanf(scan,&qianqu);   //scan之前已经定义过了,方便线性表元素数据类型的更改 
		}
		else if(choose==7){
			printf("请输入需要判断位置的值");
			scanf(scan,&e);     //scan之前已经定义过了,方便线性表元素数据类型的更改 
		}
		else if(choose==9){
			printf("请输入需要输出后继元素的前驱: ");
			scanf(scan,&houji);             //scan之前已经定义过了,方便线性表元素数据类型的更改 
		}
		else if(choose==10){
			printf("请输入插入元素的位置与元素值: ");
			scanf("%d",&i);
			getchar();
            scanf(scan,&e);     //scan之前已经定义过了,方便线性表元素数据类型的更改 
		}
		else if(choose==11){
			printf("请输入需要删除元素的位置: ");
			scanf("%d",&i);
		} 
		switch(choose){
			case 1: InitList(L)==OK? printf("空线性表创建成功") : printf("线性表已创建");       getchar();  break;                                              
			case 2: DestroyList(L)==OK? printf("线性表销毁成功") : printf("线性表不存在");    getchar();  break;
			case 3: ClearList(L)==OK? printf("线性表置空成功") : printf("线性表不存在");    getchar();  break;
			case 4: ListEmpty(L)==TRUE? printf("线性表为空") : printf("线性表不为空");      getchar(); break;
			case 5: ListLength(L)==ERROR? printf("线性表不存在") : printf("线性表长为: %d",ListLength(L));    getchar();  break;
			case 6: GetElem(L,i,e)==ERROR? printf("线性表不存在或输入数据非法") : printf("元素为: ");  printf("%d",e);    getchar(); break;
			case 7: LocateElem(L,e)==ERROR?  printf("线性表不存在或未找到该元素") : printf("该元素所在位置为: ");  printf("%d",num);  getchar(); break;
			case 8: PriorElem(L,qianqu,e)==ERROR? printf("线性表不存在或该元素无前驱") : printf("该元素前驱为: ");  printf("%d",e);  getchar(); break;
			case 9: NextElem(L,houji,e)==ERROR? printf("线性表不存在或该元素无后继") : printf("该元素的后继为: ");  printf("%d",e);  getchar();  break;
			case 10: ListInsert(L,i,e)==ERROR? printf("线性表不存在或输入数据非法") : printf("插入成功");    getchar();  break;
			case 11: ListDelete(L,i,e)==ERROR? printf("线性表不存在或输入数据非法") : printf("删除成功");    getchar(); break;
			case  12: search(L); getchar(); break;
			case 0: printf("操作结束\n"); getchar(); break;
			default: printf("输入操作数据值非法"); getchar(); break;
		}
		if(choose==0)
			break;
		getchar();
	}
	return 0;
}

链式线性表功能实现

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
char print[]="%d";
char scan[]="%d";
typedef int Status;
typedef int ElemType;
typedef struct node{
    int data;
    struct node *next;
}Node,*pNode;
Status CreatList(pNode &L){
	printf("\nCreatList");
	L = (pNode)malloc(sizeof(Node));
	if(!L)
		exit(OVERFLOW);
	L->next = NULL;
	return OK; 
}
Status ListEmpty(pNode L){
	printf("\nListEmpty");
	if(L->next==NULL)
		return  OK;
	else 
		return ERROR;
} 
Status ListLength(pNode L){
	printf("\nListLength");
	int i=0;
	pNode p = L->next;
	while(p){
		p=p->next;
		i++;
	}
	return i;
}
Status getElem(pNode L,int i,ElemType &e){
	printf("\ngetElem");
	pNode p = L->next;
	int j = 1;
	while(p&&i<i){   //讲指针调到 i 元素的前面 
		p = p->next;
		j++; 
	}
	if(!p||j>i)
		return ERROR;
	e =  p->data;
	return OK;
}
Status ListInsert(pNode &L,int i,ElemType e){
	printf("\nListINset");
	pNode p = L;   //为了不破坏线性表的结构,而临时创建的指针
	int j = 1;
	while(L&&j<i){
		p = p->next;
		j++;
	} 
	if(!p||j>i)
		return ERROR;
	pNode now = (pNode)malloc(sizeof(Node));
	now->data = e;
	now->next = p->next;
	p->next = now;	
	return OK;
}
Status ListDelete(pNode &L,int i,ElemType &e){
	printf("\nListDelete");
	pNode p = L;   
	int j = 0;
	while(p->next && j<i-1){
		p = p->next;
		j++;
	} 
	if(!(p->next) || j>i-1 )
		return ERROR;
	pNode q = p->next; 
	p->next = q->next;
	e = q->data;
	free(q);
	return OK;
} 
Status ListLocateElem(pNode L,int &i,ElemType e){
	printf("\nListLocateElem");
	if(L->next==NULL)
		return ERROR;
	pNode q = L->next;
	int j = 0;
	while(q){
		if( q->data==e ){
			return OK;
		}
		q = q->next;
		j++;
	} 
	return ERROR;
}
Status ListTraverse(pNode L){
	if(L->next==NULL){
		printf("线性表为空");
		return ERROR;
	}
	int i = 1;
	pNode p = L->next;
	while(p){
		ElemType e=p->data;
		printf("第%d个元素为:",i);
		printf(print,e);
		printf("\n");
		i++;
		p=p->next;
	}
	return OK;
}
void WindowsPut(){
	system("cls");	
	printf("   *******************************************************************\n");
	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("***                   8   线性表删除元素                              ***\n");
	printf("***                   9   线性表遍历                                  ***\n"); 
	printf("***                   0   线性表操作结束                              ***\n");
	printf("   *******************************************************************\n");
	if(sizeof(ElemType)==4)
	printf("   ************************整型线性表*********************************\n");
	else if(sizeof(ElemType)==1)
	printf("   ************************字符型线性表*******************************\n");
	else 
	printf("   ************************浮点型线性表*******************************\n"); 
	printf("   *******************************************************************\n");
}
int main(){
	pNode L;
	L=NULL;
	ElemType e;
	int i,choose;
/*	printf("main");
	CreatList(L);
	getElem(L,1,e);
	ListEmpty(L);
	ListInsert(L,1,e);
	ListLength(L);
	ListDelete(L,1,e);
	ListLocateElem(L,1,e);
	printf("\n");*/
	
	while(1){
		WindowsPut();
		printf("请输入线性表的操作值:");
		scanf("%d",&choose);
		if(choose==5){
			printf("请输入需要获取的元素的位置");
		}
		if(choose==6){
			printf("请输入需要判断位置的元素的值: ");
			scanf(scan,&e);
		}
		if(choose==7){
			printf("请输入需要插入的元素的位置与元素的值");
			scanf("%d",&i);
			scanf(scan,&e);
		}
		if(choose==8){
			printf("请输入需要删除的元素的位置");
			scanf("%d",&i);
		}
		switch(choose){
			case 1: CreatList(L)==OK? printf("链式线性表创建成功") : printf("链式线性表已被创建"); getchar(); break;
			case 2: break;
			case 3: ListEmpty(L)==OK? printf("链式线性表为空") :printf("链式线性表不为空"); getchar(); break;
			case 4: printf("%d ",ListLength(L)); getchar(); break;
			case 5: getElem(L,i,e)==OK? printf(print,e):printf("元素的位置非法"); getchar(); break;
			case 6: ListLocateElem(L,i,e)==OK? printf("该元素的为第 %d 个",i):printf("该元素不存在"); getchar(); break;
			case 7: ListInsert(L,i,e)==OK?  printf("插入成功") : printf("元素的位置非法"); getchar(); break;
			case 8: ListDelete(L,i,e)==OK? printf("删除成功") : printf("元素的位置非法"); getchar(); break;
			case 9: ListTraverse(L); getchar(); break;
			case 0: printf("链式线性表操作结束");  break;
			default: printf("输入操作数据值非法"); getchar(); break;
		}
		if(choose==0)
			break; 
		getchar();
	}
	return 0;
}

链式栈的实现方法

//栈的顺序存储实现 
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;
typedef int SElemType;
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef struct{
	SElemType *base;
	SElemType *top;
	int stacksize;
}SqStack; 

Status InitStack(SqStack &S){
	if(S.base!=NULL){
		printf("栈已被构造"); 
		return ERROR;
	}	
	S.base = (SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));
	if(!S.base)
		exit(OVERFLOW);
	S.top = S.base;
	S.stacksize = STACK_INIT_SIZE;
	printf("栈构造成功"); 
	return OK;
}
Status DestroyStack(SqStack &S){
	
	return OK;
}
Status ClearStack(SqStack &S){
	if(S.base==NULL){
		printf("栈没有构造,无法置空");
		return ERROR;
	}
	S.top = S.base;
	printf("栈置空成功");
	return OK;
}
Status StackEmpty(SqStack S){
	if(S.base==NULL){
		printf("栈没有被构造");
		return INFEASIBLE;
	}
	if(S.base==S.top){
		printf("栈为空");
		return TRUE;
	}
	else{
		printf("栈不为空"); 
		return ERROR;
	} 	
}
int StackLength(SqStack S){
	if(S.base==NULL)
		return INFEASIBLE;
	if(S.top==S.base)
		return 0;
	int i = 0;
	SElemType *p=S.top;
	while(p!=S.base){
		SElemType e = *p;
		p--;
		i++;
	} 
	return i;
}
Status GetTop(SqStack S,SElemType &e){
	if(S.top==S.base)
		return ERROR;
	e = *--S.top;
	return OK;
}
Status Push(SqStack &S,SElemType &e){
	if(S.top-S.base>=S.stacksize){
		S.base = (SElemType *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType));
		if(!S.base)
			exit(OVERFLOW);
		S.top = S.base + S.stacksize;
		S.stacksize+=STACKINCREMENT;
	}
	*S.top++=e;
	return OK;
}
Status Pop(SqStack &S,SElemType &e){
	if(S.top==S.base)
		return ERROR;
	e = *--S.top;
	return OK;
}
Status StackTreaverse(SqStack S){
	if(S.base==NULL)
		return INFEASIBLE;
	if(S.base==S.top){
		printf("栈空,无元素");
		return OK;
	} 
	SElemType *p = S.top;
	int i=1;
	SElemType e;
	while(p!=S.base){
		if(i!=1)
			printf("\n"); 
		e = *--p;
		printf("距栈顶元素长为%-3d的元素为:   %d",i++,e);
	} 
	return OK;
}
void WindowsPut(){
	system("cls");	
	printf("   *******************************************************************\n");
	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("***                   8   出栈                                        ***\n");
	printf("***                   9   栈遍历                                      ***\n"); 
	printf("***                   0   线性表操作结束                              ***\n");
	printf("   *******************************************************************\n");
	if(sizeof(SElemType)==4)  //用来判断存放线性中的数据类型 
	printf("   ************************整型栈*************************************\n");
	else if(sizeof(SElemType)==1)
	printf("   ************************字符型栈***********************************\n");
	else 
	printf("   ************************浮点型栈***********************************\n"); 
	printf("   *******************************************************************\n");
}

int main(){
	SqStack S;
	S.base=NULL;
	SElemType e;
	int choose;
	while( 1 ){
		WindowsPut();
		printf("\t请输入栈的操作数: ");
		scanf("%d",&choose);
		if(choose==7){
			printf("请输入入栈的元素的值:");
			scanf("%d",&e); 
		}
		switch(choose){
			case 1: InitStack(S); getchar(); break;
			case 2: DestroyStack(S); getchar(); break;
			case 3: ClearStack(S);  getchar(); break;
			case 4: StackEmpty(S); getchar(); break;
			case 5: StackLength(S)==INFEASIBLE? printf("栈空,无元素") : printf("%d",StackLength(S)); getchar(); break;
			case 6: GetTop(S,e)==ERROR? printf("栈空,无栈顶元素") : printf("栈顶元素为:%d",e); getchar(); break;
			case 7: Push(S,e); printf("插入成功"); getchar(); break;
			case 8: Pop(S,e)==ERROR? printf("栈空,无栈顶元素可以出栈"): printf("栈顶元素,出栈成功"); getchar(); break;
			case 9: StackTreaverse(S);  getchar(); break;
			case 0: printf("栈的操作结束");getchar(); break;
			default: printf("输入操作数据值非法,请重新输入"); getchar(); break;
		}
		if(choose==0)
			break;
		getchar();
	}
	return 0;
}

链式队列的实现

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;

//1.数据类型为 int时 
typedef int QElemType;
char scan[]="%d";
char print[]="%d";

/*
//2.数据类型为double时 
typedef double QElemType;
char scan[]="%lf";
char print[]="%.3lf";
*/
typedef struct QNode{
	QElemType data;
	struct QNode *next;
}QNode,*QueuePtr; 
typedef struct{
	QueuePtr front;  
	QueuePtr rear;
}LinkQueue;
Status InitQueue(LinkQueue &Q){
	Q.front = Q.rear = (QueuePtr)malloc(sizeof(QNode));
	if(!Q.front)
		exit(OVERFLOW);
	Q.front->next = NULL; 
	return OK;
}
Status DestroyQueue(LinkQueue &Q){
	while(Q.front){
		Q.rear = Q.front->next;
		free(Q.front);
		Q.front = Q.rear;
	}
	return OK;	
}
Status ClearQueue(LinkQueue &Q){  //没有 
	return OK;
}
Status QueueEmpty(LinkQueue Q){
	if(Q.front==Q.rear)
		return OK;
	else
		return ERROR;
}
Status QueueLength(LinkQueue Q){
	if(Q.front==Q.rear)
		return INFEASIBLE;
	QueuePtr  p = Q.front->next;
	int i=0;
	while(p){
		 i++;
		 p=p->next;
	}
	return i;
}
Status GetHead(LinkQueue Q,QElemType &e){
	if(Q.front->next==NULL)
		return ERROR;
	else
		e = Q.front->next->data;
	printf("队列的队头元素为: "); 
	return OK;
}
Status EnQueue(LinkQueue &Q,QElemType &e){ //插入元素
	QueuePtr p = (QueuePtr)malloc(sizeof(QNode));
	if(!p)
		exit(OVERFLOW);
	p->data = e;
	p->next = NULL;
	Q.rear->next = p;
	Q.rear = p; 
	return OK;
}
Status DeQueue(LinkQueue &Q,QElemType &e){
	if(Q.front==Q.rear)
		return ERROR;
	QueuePtr p = Q.front->next;
	e = p->data;
	Q.front->next = p->next;
	//也可以写成
	//Q.front->next = Q.front->next->next;    
	if(Q.rear==p)
		Q.rear = Q.front;
	free(p);
	return OK;
}
Status QueueTraverse(LinkQueue Q){
	if(Q.front==Q.rear){
		printf("队列为空,无法遍历元素");
		return ERROR;
	}	
	QueuePtr p = Q.front->next;
	int i = 1;
	while(p){
		if(i!=1)
			printf("\n");  //为了排版的好看,第一个元素不换行 
		QElemType e = p->data;
		printf("第%d个元素为: ",i++);
		printf(print,e);
		//如果QElemType的数据类型为int,也可以写成printf("%d\n",e); 
		p=p->next;
	}
	return OK;
}


void WindowsPut(){
	system("cls");	
	printf("   *******************************************************************\n");
	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("***                   8   队列元素遍历                                ***\n");
	printf("***                   0   队列操作结束                                ***\n");
	printf("   *******************************************************************\n");
	if(sizeof(QElemType)==4)
	printf("   *************************整型队列**********************************\n");
	else if(sizeof(QElemType)==1)
	printf("   ************************字符型队列*********************************\n");
	else 
	printf("   ************************浮点型队列*********************************\n"); 
	printf("   *******************************************************************\n");
}




int main(){
	QElemType e;
	int choose;
	LinkQueue Q;
	while(1){
		WindowsPut();
		printf("请输入队列的操作数: ");
		scanf("%d",&choose);
		if(choose==6){
			printf("请输入需要插入队头的元素:");
			scanf(scan,&e);
		}
		switch(choose){
			case 1: InitQueue(Q); printf("空队列创建成功"); getchar(); break;
			case 2: DestroyQueue(Q); printf("队列销毁成功"); getchar(); break;
			case 3: QueueEmpty(Q)==OK? printf("队列为空") : printf("队列不为空"); getchar(); break;
			case 4: QueueLength(Q)==INFEASIBLE? printf("队列为空,无长度") : printf("队列长为: %d ",QueueLength(Q)); getchar(); break;
			case 5: GetHead(Q,e)==ERROR? printf("队列为空,无队头元素"):printf("%d ",e); getchar(); break;
			case 6: EnQueue(Q,e); printf("插入成功"); getchar(); break;
			case 7: DeQueue(Q,e)==ERROR? printf("队列为空,无法删除队头元素"):printf("删除成功"); getchar(); break;
			case 8: QueueTraverse(Q); getchar();  break;
			case 0: printf("队列操作结束"); getchar(); break;
			default: printf("输入操作数据值非法,请重新输入操作数"); getchar(); break;
		}
		if(choose==0)
			break; 
		getchar();
	}
	return 0;
} 

循环队列的实现

#include<stdio.h>
#include<stdlib.h>
#define MAXQSIZE 100   //循环队列的初始化长度(定长) 
#define OVERFLOW -2
#define OK 1
#define ERROR 0
typedef int QElemType;
typedef int Status;
typedef struct{
	QElemType *base;
	int front;
	int rear;
}SqQueue;
Status InitQueue(SqQueue &Q){
	Q.base = (QElemType *)malloc(MAXQSIZE * sizeof(QElemType));  //初始化的动态分配储存空间 
	if(!Q.base)  //如果分配失败,结束程序 
		exit(OVERFLOW);
	Q.front=Q.rear=0;  
	return OK;
}
Status DestroyQueue(SqQueue &Q){
	int i=0;
	for(i=0;i<MAXQSIZE;i++)
		free(Q.base+i);
	return OK;
}
Status ClearQueue(SqQueue &Q){
	Q.front=Q.rear=0; 
	return OK;
}
Status QueueEmpty(SqQueue &Q){
	if(Q.front==Q.rear)
		return OK;
	else
		return ERROR;
}
Status QueueLength(SqQueue &Q){
	return (Q.rear-Q.front+MAXQSIZE)%MAXQSIZE;
	return OK;
}
Status GetHead(SqQueue &Q,QElemType &e){
	if(Q.rear==Q.front)
		return ERROR;
	e=Q.base[Q.front];
	return OK;
}
Status EnQueue(SqQueue &Q,QElemType &e){
	if( (Q.rear+1)%MAXQSIZE==Q.front  )
		return ERROR;
	Q.base[Q.rear] = e;
	Q.rear=(Q.rear+1)%MAXQSIZE;
	return OK;
}
Status DeQueue(SqQueue &Q,QElemType &e){
	if(Q.front==Q.rear)
		return ERROR;
	e=Q.base[Q.front];
	Q.front = (Q.front+1)%MAXQSIZE;
	return OK;
}

Status QueueTraverse(SqQueue &Q){
	if(Q.front==Q.rear){
		printf("队列为空");
		return ERROR;
	}
	int star=Q.front;
	int  end=Q.rear;
	QElemType e;
	int i=1;
	while(star!=end){
		if(i!=1)
			printf("\n");
		e=Q.base[star];
		printf("第%d个元素为:\t%d",i++,e);
		star = (star+1)%MAXQSIZE;
	}
	return OK;
}
void WindowsPut(){
	system("cls");	
	printf("   *******************************************************************\n");
	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("***                   8   队列头出队列                                ***\n");
	printf("***                   9   队列元素遍历                                ***\n");
	printf("***                   0   队列操作结束                                ***\n");
	printf("   *******************************************************************\n");
	if(sizeof(QElemType)==4)
	printf("   *************************整型队列**********************************\n");
	else if(sizeof(QElemType)==1)
	printf("   ************************字符型队列*********************************\n");
	else 
	printf("   ************************浮点型队列*********************************\n"); 
	printf("   *******************************************************************\n");
}

int main(){
	SqQueue Q;
	QElemType e;
	int choose;
	while(1){
		WindowsPut(); 
		printf("\t请输入循环队列的操作数: ");
		scanf("%d",&choose);
		if(choose==7){
			printf("请输入需要入队列的元素: ");
			scanf("%d",&e);
		}
		switch(choose){
			case 1: InitQueue(Q); printf("循环队列创建成功"); getchar(); break;
			case 2: DestroyQueue(Q); printf("循环队列销毁成功"); getchar(); break;
			case 3: ClearQueue(Q); printf("循环队列置空成功"); getchar(); break;
			case 4:	QueueEmpty(Q)==OK? printf("循环队列为空"):printf("循环队列不为空"); getchar(); break;
			case 5: printf("循环队列的长度为:%d",QueueLength(Q)); getchar(); break;
			case 6: GetHead(Q,e)==ERROR? printf("循环队列无元素"):printf("队列头元素为:%d",e); getchar();break;
			case 7: EnQueue(Q,e)==ERROR? printf("循环队列已满,无法入队列"):printf("入队列成功"); getchar(); break;
			case 8: DeQueue(Q,e)==ERROR? printf("队列无元素,无法出队列"):printf("出队列成功"); getchar(); break;
			case 9: QueueTraverse(Q); getchar(); break;
			case 0: printf("循环队列操作结束"); getchar(); break;
			default: printf("输入操作数据值非法,请重新输入操作数"); getchar(); break;
		}
		if(choose==0)
			break; 
		getchar();
	} 
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_44833327/article/details/102748243