所谓链接队列就是用一个线性链表来表示一个队列,队列中每个元素对应链表中一个链接点,队头指针front指向线性链表的第1个链接点,队尾指针rear指向链表的最后一个链接点,与顺序存储结构的队列不同的是,队头指针和队尾指针都是指向实际队头元素和队尾元素所在的链接点。测试链接队列为空的条件是front为NULL,链接队列的类型定义如下:
/* 定义一个链接队列的类型 */ typedef struct node { QElemType data; struct node *link; }QNode, *QLink;
链接队列的基本算法描述及测试代码描述如下:
#include<stdlib.h> #include<stdio.h> /* 定义一个链接队列的类型 */ typedef struct node { int data; struct node *link; }QNode, *QLink; /* 初始化链接队列 */ void initialQ( QLink *front, QLink *rear ){ *front = *rear = NULL; } /* 测试链接队列是否为空 */ int isEmpty( QLink front ){ return front == NULL; } /* 取当前对头元素 */ int getQ( QLink front, int *item ){ if( isEmpty( front ) ) /* front指向队头元素所在的链接点 */ return 0; *item = front->data; /* 保存对头元素的数据信息 */ return 1; } /* 链接队列的插入 */ int insertQ( QLink *front, QLink *rear, int item ){ /* *front, *rear 分别指向对头元素和队尾元素所在的链接点 */ QLink p; p = ( QLink )malloc( sizeof( QNode ) ); /* 申请一个链接点,注意需要检查是否申请成功 */ if( p == NULL ) return 0; /* 插入失败,返回0 */ p->data = item; /* 将item送入新结点的数据域 */ p->link = NULL; if( *front == NULL ) /* 将item插入空队列的情况,需要注意这种情况 */ *front = p; else (*rear)->link = p; /* 将新的链接点连接到队列的尾部 */ *rear = p; /* 更新队列的队尾指针 */ return 1; /* 插入成功,返回1 */ } /* 链接队列的删除 */ int deleteQ( QLink *front, int *item ){ QLink p; if( *front == NULL ) /* 队列为空,删除元素失败,返回0 */ return 0; p = *front; *front = p->link; /* 将front指向下一个元素 */ *item = p->data; /* 保存队头元素的数据信息 */ free( p ); /* 释放被删除头结点空间 */ return 1; } /* 链接队列的销毁 */ void destroyQ( QLink *front, QLink *rear ){ while( *front != NULL ){ *rear = (*front)->link; free( *front ); *front = *rear; } } void printQ( QLink front ){ while( front != NULL ){ printf( "%d\n", front->data ); front = front->link; } } int main(){ QLink front, rear; initialQ( &front, &rear ); printf( "the queue is empty: %d\n", isEmpty( front ) ); insertQ( &front, &rear, 5 ); insertQ( &front, &rear, 12 ); insertQ( &front, &rear, 91 ); printQ( front ); int item; deleteQ( &front, &item ); printf( "the deleted elem is %d\n", item ); getQ( front, &item ); printf( "current the front elem is %d\n", item ); return 0; }