c语言描述的链队列的基本操作

#include<stdio.h>
#include<stdlib.h>
#define ok 0
#define error 1 
//链队列特点在于不仅有链的头指针和尾指针,还有组成链的每一个节点,所以结构体要设置两个
typedef struct qlnode{
    int data;
    struct qlnode *next;
}Qlnode;
typedef struct {
    Qlnode *front;
    Qlnode *rear;
}Ql;
int InitQl(Ql *ql){
    ql->front=ql->rear=(Qlnode *)malloc(sizeof(Qlnode));
    if(!ql->front){
        printf("分配内存失败");
        exit(error);
    }//每一次都要判断分配内存是否成功了
    ql->front->next=NULL;//设置头结点为空
    printf("分配成功!\n");
    return ok;
}
int EnQl(Ql *ql,int e){
    Qlnode *p;
    p=(Qlnode *)malloc(sizeof(Qlnode));
    p->data=e;p->next=NULL;
    ql->rear->next=p;//队尾插入p
    ql->rear=p;//另p为队尾
    return ok;
}

int DeQl(Ql *ql){
    int e;
    Qlnode *p;
    if(ql->front=ql->rear){//空的链队列的判决条件为头指针和尾指针均指向头结点
        printf("链队列为空");
        exit(error);
    }
    p=ql->front->next;
    e=p->data;
    ql->front->next=p->next;//重新赋予头结点后的第一个结点
    free(p);
    return ok;

}
int  Destroy(Ql *ql){
    while(ql->front){
        ql->rear=ql->front->next;
        free(ql->front);
        ql->front=ql->rear;//通过ql->rear来保存队头释放之前的下一节点,然后赋给下一次循环的新队头;
    }
}
int Traverse(Ql *ql){
    Qlnode *p=ql->front->next;
    while(p){
        printf("%d \n",p->data);
        p=p->next;
    };
}
void main(){
    Ql ql;
    int i,j;
    j=0;
    InitQl(&ql);
    while(j<5){
        printf("输入要插入的值:\n");
        scanf("%d",&i);
        EnQl(&ql,i);
        j++;
    }
    printf("\n");
    Traverse(&ql);
    //printf("%d \n",(ql.front->next)->data);ql->front->next->data,这样就不对因为ql不是指针,应该使用ql.xxx
}

 

posted @ 2016-07-28 11:08  风雨缠舟  阅读(1342)  评论(0编辑  收藏  举报