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
}

 

转载于:https://www.cnblogs.com/zzy-frisrtblog/p/5714033.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值