链表创建队列

来源:互联网 发布:excel重复数据合计 编辑:程序博客网 时间:2024/06/01 23:26

首先队列需要二个元素front和rear来表示现在所指向的节点,front指向的是 头结点,而头结点指向的是第一个有效元素,尾节点指向最后一个有效元素。

void initQueue(PQUEUE);
void push(PQUEUE,int);
void Front(PQUEUE,int *);
void travers_list(PQUEUE);
bool pop(PQUEUE,int * );
bool is_Empty(PQUEUE);
void Clear(PQUEUE s);

队列实现了以上几个操纵

1.创建队列

void initQueue(PQUEUE q){    q->pRear=(PNODE)malloc(sizeof(NODE));    if(q->pRear==NULL)    {        printf("分配内存失败\n");        exit(-1);    }    q->pFront=q->pRear;    q->pFront->pNext=NULL;}
在此创建头结点,将头结点和尾节点同时指向同一个地址

2.入队

void push(PQUEUE p,int val){    PNODE s=(PNODE)malloc(sizeof(NODE));    if(s==NULL)    {        printf("分配内存失败\n");        exit(-1);        return ;    }    s->date=val;    s->pNext=NULL;    p->pRear->pNext=s;    p->pRear=s;}
 把入队的值分配给新的节点,然后让尾节点的pNext指向此元素,最后尾节点指向此元素顺序不可交换,最后一个节点的pNext要为空,是判断队列为空的重要标志

3.数组的遍历

void travers_list(PQUEUE s){    if(is_Empty(s))    {        printf("队列已经空了\n");         return ;    }    PNODE p=s->pFront->pNext;    while(p!=NULL)    {        printf("%d ",p->date);        p=p->pNext;    }    printf("\n");    return ;}
先判断数组是否为空 如果是空则不用判断,用一个PNODE指针指向头结点的pNext即为第一个元素,当p为空时就是最后一个节点

4.出队

bool pop(PQUEUE s,int * val){    if(is_Empty(s))    {        printf("栈已经空了\n");         return false;    }    PNODE p=s->pFront->pNext;    *val=p->date;    if(p==s->pRear)    s->pRear=s->pFront;    else        s->pFront->pNext=p->pNext;    free(p);    p=NULL;    return true;}
数组为空返回,当判断到是最后一个元素时即p=s->pRear时需要把尾节点的值赋值成头指针

5.判断是否为空

bool is_Empty(PQUEUE s){    if(s->pFront==s->pRear)        return true;        else            return false;}
如果尾节点和头结点指向的地址相同则为空

6.清除所有元素

void Clear(PQUEUE s){    PNODE s1=s->pFront->pNext;    PNODE s2;    while(s1!=NULL)    {        s2=s1;        s1=s1->pNext;        free(s2);        s2=NULL;    }    s->pRear=s->pFront;
最后要让尾节点和头结点指向的一样

完整代码:

#include<stdio.h>#include<string.h>#include<malloc.h>#include<stdlib.h>typedef struct Node{    int date;    Node * pNext;}NODE,*PNODE;typedef struct Queue{    PNODE pFront;    PNODE pRear;}QUEUE,*PQUEUE;void initQueue(PQUEUE);void push(PQUEUE,int);void Front(PQUEUE,int *);void travers_list(PQUEUE);bool pop(PQUEUE,int * );bool is_Empty(PQUEUE);void Clear(PQUEUE s);int main(){    Queue s;    int val;    initQueue(&s);    push(&s,1);    push(&s,2);    push(&s,3);    push(&s,4);    push(&s,5);    push(&s,6);    travers_list(&s);    //printf("%d\n",val);    pop(&s,&val);pop(&s,&val);pop(&s,&val);pop(&s,&val);pop(&s,&val);pop(&s,&val);    travers_list(&s);    push(&s,6);    travers_list(&s);    Clear(&s);    travers_list(&s);}void initQueue(PQUEUE q){    q->pRear=(PNODE)malloc(sizeof(NODE));    if(q->pRear==NULL)    {        printf("分配内存失败\n");        exit(-1);    }    q->pFront=q->pRear;    q->pFront->pNext=NULL;}void push(PQUEUE p,int val){    PNODE s=(PNODE)malloc(sizeof(NODE));    if(s==NULL)    {        printf("分配内存失败\n");        exit(-1);        return ;    }    s->date=val;    s->pNext=NULL;    p->pRear->pNext=s;    p->pRear=s;}void travers_list(PQUEUE s){    if(is_Empty(s))    {        printf("队列已经空了\n");         return ;    }    PNODE p=s->pFront->pNext;    while(p!=NULL)    {        printf("%d ",p->date);        p=p->pNext;    }    printf("\n");    return ;}bool pop(PQUEUE s,int * val){    if(is_Empty(s))    {        printf("栈已经空了\n");         return false;    }    PNODE p=s->pFront->pNext;    *val=p->date;    if(p==s->pRear)    s->pRear=s->pFront;    else        s->pFront->pNext=p->pNext;    free(p);    p=NULL;    return true;}bool is_Empty(PQUEUE s){    if(s->pFront==s->pRear)        return true;        else            return false;}void Clear(PQUEUE s){    PNODE s1=s->pFront->pNext;    PNODE s2;    while(s1!=NULL)    {        s2=s1;        s1=s1->pNext;        free(s2);        s2=NULL;    }    s->pRear=s->pFront;}





原创粉丝点击