C语言 数据结构 队列

1、队列简介:队列是一种特殊的线性表,它只允许在表的前端进行删除操作,而在表的后端进行插入操作,进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。

2、队列的声名:和栈不同,我将链表中的每个元素添加上头指针与尾指针(还有一个计数器,判空时可以直接拿来用)将其变成一个队列。这样在入队与出队的操作就与链表大同小异了。

typedef struct quee
{
    int val;
    struct quee *pnext;
}myqueue;
typedef struct node
{
    int ncount;
    myqueue *phead;
    myqueue *ptail;
}que;

3、初始化队列:

void q_init(que **pqueue)
{
    *pqueue = (que*)malloc(sizeof(que));
    (*pqueue)->ncount = 0;
    (*pqueue)->phead = NULL;
    (*pqueue)->ptail = NULL;
}

4、入队:

void q_push(que *pqueue,int n)
{
    if(pqueue == NULL) return ;

    myqueue *ptemp = NULL;
    ptemp = (myqueue*)malloc(sizeof(myqueue));
    ptemp->val = n;
    ptemp->pnext = NULL;

    if(pqueue->phead == NULL)
    {
        pqueue->phead = ptemp;
    }
    else
    {
        pqueue->ptail->pnext = ptemp;
    }
    pqueue->ptail = ptemp;
    pqueue->ncount++;
}

5、出队:

void q_push(que *pqueue,int n)
{
    if(pqueue == NULL) return ;

    myqueue *ptemp = NULL;
    ptemp = (myqueue*)malloc(sizeof(myqueue));
    ptemp->val = n;
    ptemp->pnext = NULL;

    if(pqueue->phead == NULL)
    {
        pqueue->phead = ptemp;
    }
    else
    {
        pqueue->ptail->pnext = ptemp;
    }
    pqueue->ptail = ptemp;
    pqueue->ncount++;
}

6、判空:

int isempty(que *pqueue)
{
    if(pqueue == NULL) exit(1);
    return pqueue->ncount == 0?1:0;		//1为空,0为非空
}

测试:

int main()
{
	que *qtmp = NULL;
	q_init(&qtmp);
	q_push(qtmp,1);
	q_push(qtmp,3);
	q_push(qtmp,4);
	printf("该队列为:");
	while(!isempty(qtmp))
	{
		printf("%d ",q_pop(qtmp));
	}
	printf("\n");
    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章