//rear指向队尾部元素,front指向队头元素的前一个
//链式队列相当与链表很相似,有着头指针和头节点,传参数也都是传的指针,但是不同的是这里的指针是结构体指针,可以看成二级指针
//所以在打印等函数中需要有个中间变量,否则会改变front和rear的指向
#include <stdio.h>
#include <stdlib.h>
struct book
{
int isbn;
char name[32];
};
struct node
{
struct book b;
struct node * next;
};
typedef struct
{
struct node * front;
struct node * rear;
}linkqueue;
void menu(void);
void Insert_Linkqueue(linkqueue *q, struct book data);
void Print_Linkqueue(linkqueue *q);
void Delete_LInkqueue(linkqueue *q);
int is_empty_linkqueue(linkqueue *q);
void Init_Linkqueue(linkqueue *q);
int main(void)
{
int choice;
int ret;
struct book data;
linkqueue *q;
q = (linkqueue *)malloc(sizeof(linkqueue));
Init_Linkqueue(q);
menu();
while(1)
{
printf("pleas input a choce:\n");
scanf("%d",&choice);
switch(choice)
{
case -1:
exit(0);
case 1:
while(1)
{
printf("please input isbn and name:\n");
scanf("%d%s",&data.isbn, data.name);
if(data.isbn == -1)
{
break;
}
Insert_Linkqueue(q,data);
}
break;
case 2:
Print_Linkqueue(q);
break;
case 3:
Delete_LInkqueue(q);
break;
case 4:
ret = is_empty_linkqueue(q);
if(ret == 1)
printf("empty linkqueue\n");
else
printf("linkqueue not empty\n");
break;
default:
break;
}
}
return 0;
}
int is_empty_linkqueue(linkqueue *q)
{
if(q->rear == q->front)
return 1;
else
return 0;
}
void menu(void)
{
printf("1->Insert_Linkqueue\n");
printf("2->Print_Linkqueue\n");
printf("3->Delete_LInkqueue\n");
printf("4->is_empty_linkqueue\n");
}
void Insert_Linkqueue(linkqueue *q, struct book data)
{
struct node *p;
p = (struct node *)malloc(sizeof(struct node));
p->b = data;
p->next = NULL;
q->rear->next = p;
q->rear = p;
}
void Print_Linkqueue(linkqueue *q)
{
struct node *tmp;
tmp = q->front;
q->front = q->front->next;
while(1)
{
if(q->front == NULL)
{
break;
}
printf("%d\t%s\n",q->front->b.isbn, q->front->b.name);
q->front = q->front->next;
}
q->front = tmp;
}
void Init_Linkqueue(linkqueue *q)
{
q->rear = q->front = (struct node *)malloc(sizeof(struct node));
q->front->next = NULL;
}
void Delete_LInkqueue(linkqueue *q)
{
struct node *p;
p = q->front->next;
q->front->next = p->next;
if(p->next == NULL)
{
q->rear = q->front;
}
free(p);
}
C语言实现链式队列的基本功能
最新推荐文章于 2023-02-25 23:26:37 发布