队列queue(2):链表实现队列
基本概念
队列是只允许在一端进行插入操作,另一端进行删除操作的线性表。
我们规定,允许删除的叫做队首“head”,允许插入的叫做队尾“tail”。
基本操作
我们规定,一个结点包含数值域与指针域两部分,数值域存放链表所需要用到的非指针型数值,指针域用于存放数值以及指向下一个结点的next指针。
/*定义链表队列*/
struct Node{ int dota;struct Node *next}node; //结构体存放结点
struct linkqueue{struct Node *head;struct Node *tail}queue; //存放队头指针和队尾指针,不存放在Node中是为了节省节点入队时占用的内存空间
/* 初始化队列 */
1.队头指针和队尾指针共同申请一个内存空间,我们假定申请到的内存地址是0X01
2.结点下一结指向NULL
注意:头结点的数据域为空
PS:框框下头的&q、head、tail表示的是已串到0X01内存地址上的结点
/* 入队操作 */
1.申请新结点p,申请内存空间,我们规定申请到的内存空间地址为0X02
2.输入的数据elem存放在新结点数据中
3.新结点p的下一结指向NULL
4.尾结点tail的下一结点指向新结点p,即把新结点p串到链表中
5.队尾指针tail->next指向新结点,保证尾结点指针tail->next始终指向NULL
/* 出队操作 */
1.申请结点指针p,指向队头结点head,内存地址为0X01
2.队头结点head传入下一结点,以免其被free();而失去了删除的这一端
3.free();指针p指向的结点,原队头结点head所在的内存地址0X01
4.p=NULL //避免野指针
/* 打印操作 */
1.若队头结点还位于内存地址0X01上,由于0X01内存地址上结点的数值域未写入,所以队头结点head应移入下一结点中,即head=head->next;
2.申请一个结点p
3.把结点p串入含有数值域的结点,即p=q->head->next,q是结构体queue类型的队列。
4.遍历打印p=p->next,直到NULL。
源代码
/********************************************************************** 实现一个queue 输入: 7 6 8 6 6 7 0 4 1(队列) 9(出队的个数) 输出:The queue is empty! **********************************************************************/ #include<stdio.h> #include<stdlib.h> typedef struct Node { int data; struct node *next; }node; /* 当链式队列的头尾节点指针定义成为一个单独的结构体,避免在新增节点时占用过多的空间 */ typedef struct list { struct Node *head; struct Node *tail; }queue; void queue_init(queue *q); void queue_in(queue *q,int elem); void queue_out(queue *q); void queue_print(queue *q); void queue_empty(queue *q); int main() { queue q; queue_init(&q); int elem; printf("input:"); while(scanf("%d",&elem)!=EOF) { getchar(); queue_in(&q,elem); } queue_print(&q); queue_out(&q); queue_print(&q); queue_empty(&q); return 0; } void queue_init(queue *q) { q->head=q->tail=(node*)malloc(sizeof(node)); //head,tail共同指向一个内存空间 q->tail->next=NULL; //队尾指针的next指针指向NULL,头结点head不变 return; } void queue_in(queue *q,int elem) { node *p; p=(node *)malloc(sizeof(node)); p->data=elem; p->next=NULL; q->tail->next=p; q->tail=p; return; } void queue_out(queue *q) { node *p; int i; //i==出队的数据个数 printf("The number of out queue:\n"); scanf("%d",&i); while(i) { p=q->head; q->head=q->head->next; free(p); p=NULL; //防止野指针 i--; } return; } void queue_print(queue *q) { node *p; p=q->head->next; while(p!=NULL) { printf("%d",p->data); p=p->next; } return; } void queue_empty(queue *q) { if(q->head->next==NULL) { printf("The queue is empty!\n"); } return; }