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;
}

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