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 }