C语言实现泛型队列

泛型队列(C语言实现)

队列结构体



typedef struct Aqueue
{
    void *data[MAXQUEUE];      //数据域
    int front;
    int rear;
    size_t length;           //队列长度
    //一个节点可存放不同的数据
    int type[MAXQUEUE];    //存放进入队列的数据类型 
} AQueue;


基本操作

初始化队列

void InitAQueue(AQueue *Q)
{
    int i;
	Q->length = MAXQUEUE;
    for(i = 0; i < MAXQUEUE; i++)
        //不知道用户想放入的数据类型大小,所以给个20
        Q->data[i] = (void *)malloc(21);
	Q->front = Q->rear = 0;
}

销毁队列

void DestoryAQueue(AQueue *Q)
{
	if(Q->data[0] == NULL)
    {
        printf("队列目前未初始化!请先初始化队列!\n");
        return;
    }
	for(int i = 0; i < MAXQUEUE; i++)
        free(Q->data[i]);
	Q->data[0] = NULL;
}

判断为满

Status IsFullAQueue(const AQueue *Q)
{
    if(Q->data[0] == NULL)
    {
        printf("队列目前未初始化!请先初始化队列!\n");
        return FALSE;
    }
    if(IsEmptyAQueue(Q))
        return FALSE;
    if(LengthAQueue(Q)==MAXQUEUE-1)
    {
        return TRUE;
    }
    else
        return FALSE;
}

判断为空

Status IsEmptyAQueue(const AQueue *Q)
{
    if(Q->data[0] == NULL)
    {
        printf("队列目前未初始化!请先初始化队列!\n");
        return FALSE;
    }
	return (LengthAQueue(Q) == 0 ? TRUE : FALSE);
}

查看队头元素

Status GetHeadAQueue(AQueue *Q, void *e)
{
	if (IsEmptyAQueue(Q))
	{
		printf("队列为空!没有队头!\n");
		return FALSE;
	}
	memcpy(e, Q->data[Q->front],20);
    return TRUE;
}

获取队列长度

    int LengthAQueue(AQueue *Q)
    {
        return (Q->rear-Q->front+Q->length)%Q->length;
    }

入队

Status EnAQueue(AQueue *Q, void *data)
{
	if (IsFullAQueue(Q))
	{
		printf("队列满了!不能再入队了!\n");
		return FALSE;
	}
	if (IsEmptyAQueue(Q))
	{
		memcpy(Q->data[Q->front], data, 20);
		Q->rear = (Q->rear + 1) % Q->length;
		return TRUE;
	}
    memcpy(Q->data[Q->rear], data, 20);
	Q->rear = (Q->rear + 1) % Q->length;
    return TRUE;
}

这里插一个函数调用

	printf("你想入队哪种类型?:\n");
    printf("1. 整型 2. 字符型 3. 浮点型(精确到小数点后2位) 4. 字符串\n");
    scanf("%d", &t);
    while(t<1 || t>4)
    {
     	printf("应输入在[1,4]之间的整数!\n请重输:");
      	scanf("%d", &t);
    }
	printf("想入队的数据 :");
    switch(t)
    {
     	case INT:{
			int a;
			scanf("%d", &a);
			Q->type[Q->rear]=t;
			EnAQueue(Q, &a);
		break;
		}
		case CHAR: {
			char a ;
			scanf("%c", &a);
			Q->type[Q->rear]=t;
			EnAQueue(Q, &a);
			break;
		}
        case DOUBLE:{
			double a ;
			scanf("%lf", &a);
			Q->type[Q->rear]=t;
			EnAQueue(Q, &a);
			break;
		}
        case STRING:{
			char a[20];
			printf("最大长度为20哦!\n");
			scanf("%s", a);
			Q->type[Q->rear]=t;
			EnAQueue(Q, a);
			break;
		}
}

出队操作

    Status DeAQueue(AQueue *Q)
    {
    	if (IsEmptyAQueue(Q))
    	{
    		printf("队列是空的!出不了队!\n");
    		return FALSE;
    	}
        Q->front = (Q->front+1)%Q->length;
        return TRUE;
    }

清空队列

void ClearAQueue(AQueue *Q)
{
	if (IsEmptyAQueue(Q))
	{
		printf("队列已经是空的了!\n");
		return;
	}
    Q->front = Q->rear = 0;
}

遍历队列

    Status TraverseAQueue(const AQueue *Q, void (*foo)(void *q, int typeData))
    {
        if(Q->data[0] == NULL)
        {
            printf("队列目前未初始化!请先初始化队列!\n");
            return FALSE;
        }
    	if (IsEmptyAQueue(Q))
    	{
    		printf("队列里面什么都没有!\n");
    		return FALSE;
    	}
    	int i = 0;
    	while (i < (MAXQUEUE - Q->front + Q->rear) % MAXQUEUE) {
    		foo(Q->data[Q->front+i], Q->type[Q->front+i]);
    		i = (i + 1) % MAXQUEUE;
    	}
        return TRUE;
    }

调用到的Aprint函数

    void APrint(void *q, int typeData)
    {
        if(typeData == DOUBLE)
            printf("--> %.2lf", *(double*)q);
        if(typeData == CHAR)
            printf("--> %c", *(char*)q);
        if(typeData == INT)
            printf("--> %d ", *(int*)q);
        if(typeData == STRING)
            printf("--> %s ", (char*)q);
    }

这里的队列是顺序队列!

你可能感兴趣的:(C语言实现泛型队列)