キューの操作の基本シーケンス
先に述べたようにチームとチームとの間の差は非常に前方に前方ポインタが移動つの位置ことは、完全に空の状態であるように、2つのポインタとキューの状態を表しています。
シーケンス構造体の定義:
typedef strct
{
datatype data[QUEUE_SIZE];
int front, rear;
}SeqQueue;
1.ブランクのスタック
空の初期化条件チームの前面=リア= QUEUE_SIZE-1ヘッドとテールポインタを提供しました。
プログラム:
/*======================================
函数功能:顺序队列置队空
函数输入:队列起始地址
函数输出:无
========================================*/
void initialize_SqQueue(SeqQueue *sq)
{
sq->front = QUEUE_SIZE-1;
sq->rear = QUEUE_SIZE-1;
}
判断2.空チーム
空後部=前方の状況に応じては、キューが空であるか否かを判断する:空のチームは、非ヌル復帰力を返し、0。
プログラム:
/*======================================
函数功能:顺序队列判队空
函数输入:队列起始地址
函数输出:1——队空;0——队非空
========================================*/
int Empty_SqQueue(SeqQueue *sq)
{ if ( sq->rear == sq->front ) return TRUE;
else return FALSE;
}
3.ヘッド素子を取る
キューが空でない場合、ヘッド素子が添字位置への復帰を、そうでなければ-1。
プログラム:
/*======================================
函数功能:顺序队列取队头元素
函数输入:队列起始地址
函数输出:-1——队空标志;其他值——队头元素位置
========================================*/
int get_SqQueue(SeqQueue *sq )
{
if ( ! Empty_SqQueue(sq) )//队非空
return (sq->front+1) % QUEUE_SIZE;
return -1;//队空
}
4.エンキュー
チームが一杯になった場合、戻りFALSEは、そうでなければ、テール・ポインタは、後後退要素値に後部ポインティングのチーム内に挿入されます。
/*======================================
函数功能:顺序队列元素入队
函数输入:队列起始地址,入队元素值
函数输出:0——队满,操作不成功;1——队非满,操作成功
========================================*/
int Insert_SqQueue(SeqQueue*sq, datatype x)
{
if(sq->front==(sq->rear+1)%QUEUE_SIZE)//判队满
return FALSE;
else
{
sq->rear=(sq->rear+1)%QUEUE_SIZE;//队尾指针向后移一位
sq->data[sq->rear]=x; //元素x入队
return TRUE;
}
}
5.デキュー
チームが空でない場合は、ヘッドポインタの前に移動するには、バック、フロント、そうでない場合は空のタッグを返さ-1。
操作力の差は、ヘッド素子を取ることに注意してください。
/*======================================
函数功能:顺序队列出队
函数输入:队列起始地址
函数输出:-1——队空标志;其他值——队头元素位置
========================================*/
int Delete_SqQueue(SeqQueue *sq)
{
if(!Empty_SqQueue(sq))//队非空
{
sq->front=(sq->front+1)%QUEUE_SIZE;
return sq->front;
}
return -1;//队空
}
チェーンキュー-問題が導入され
、円形のキューがトライアングルを達成したときには、制限の完全な何チームが存在しない場合、スケールの結果はそれに応じて制限されます配列のオーバーフローの問題を、直面するだろう。
チェーンキュー定義:
キュー(待ち行列チェーン記憶構造)がリストで表される、単一のリンクリストヘッダにテーブルの挿入端を削除するためにのみ限定されます
ストレージ構造キュー
設計鎖キューデータ構造の
リストは、単一列のリストで構成され、第1ノード正面を指すヘッドポインタは、テール・ポインタにリアテールポインタのポインティングは、頭部と尾ポインタは、一つの構造は、この構造にLQキュー指し示すポインタを合わせました。
データ型ヒンジ点の1)の説明
typedef struct node
{
datatype data;
struct node *next;
} LinkListNode;
2)チェーンデータ型説明で頭と尾のポインタ
typedef struct
{
LinkListNode *front,*rear;
}LinkQueue;
3)鎖型データキューポインタLQ
LinkQueue *lq;
LQキューポインタチェーンセットの目的:
ディスカッション:そう簡単に設定LQキューヘッドとテールポインタのポインタ鎖構造に、完全な配信キュー情報。
キュー・チェーンの基本的な操作
1.初期空白チーム
唯一のヘッドノードの最初のリンクキューの確立:
ノードを適用し、
ノードをブランキングポインタフィールド;
キューのヘッドとテールポインタは、このノードを指します。
LinkListNodeスペースのバイト、及びポインタ変数のlq->前方のスタートアドレスサイズを割り当てるためのmalloc()関数。
/*======================================
函数功能:链队列初始化
函数输入:队列起始地址
函数输出:无
========================================*/
void initialize_LkQueue(LinkQueue *lq)
{
lq->front=(LinkListNode *) malloc(sizeof(LinkListNode));
lq->front->next=NULL;
lq->rear=lq->front;
}
2.空軍文
ヘッドとテールポインタは同じチームであればTRUE、空のマークを返し、そうでない場合は、空でないタグFALSEを返します。
/*======================================
函数功能:链队列判队空
函数输入:队列起始地址
函数输出:1——队空;0——队非空
========================================*/
int Empty_LkQueue( LinkQueue *lq )
{
if ( lq->front == lq->rear) return TRUE;
else return FALSE;
}
ヘッドノードのチームを取る3。
成功ロゴ、ノード値かどうかを返します。
キューが空でない場合、キューの先頭ポインタは、ノードの値を取るために、
TRUE操作成功フラグを返す。
そうでない場合はFALSEを返します。
プログラム:
/*======================================
函数功能:链队列取队头结点
函数输入:队列起始地址,(队列结点值)
函数输出:0——队空;1——队非空
========================================*/
int Get_LkQueue(LinkQueue *lq, datatype *x)
{
if ( Empty_LkQueue(lq)) return FALSE; //队空
x = &(lq->front->next->data); //取队头结点值
return TRUE;
}
チームに4
アプリケーションキューのテール・チェーンへの新しいノード;修正キューのテール・ポインタ、新しいノードの割り当てX。
プログラム:
/*======================================
函数功能:链队列入队
函数输入:队列起始地址,入队列结点值
函数输出:无
========================================*/
void Insert_LkQueue(LinkQueue *lq, datatype x)
{
lq->rear->next=(LinkListNode *)malloc(sizeof( LinkListNode ));
//新结点链入队尾
lq->rear=lq->rear->next; //修改队列尾指针
lq->rear->data=x; //新结点赋值
lq->rear->next=NULL; //尾结点指针域置结束标志NULL
}
5.デキュー
擬似コード記述:
キューが空でない場合、HOLの検索ノードs、
一つのノードのみキュー、キューが空集合であれば、
オフのチームの最初のノード、ターゲットドメインを変更するための最初のノードと、
リターンアドレスの;
戻りNULL;
/*======================================
函数功能:链队列出队
函数输入:队列起始地址
函数输出:队头结点地址
========================================*/
LinkListNode *Delete_LkQueue(LinkQueue *lq) {
LinkListNode *s;
if(!Empty_LkQueue(lq)) { //队非空
s=lq->front->next;//s指向队头结点
if(s->next==NULL) //队中只有一个结点
lq->rear=lq->front;//队列置空
else lq->front->next=s->next;//摘下队头结点
return(s); //返回摘下的队头结点地址
}
return NULL; //队空时,返回NULL
}
質問:メモリリーク。
6.破壊チェーン・キュー
メモリリークを防ぐために、破壊キューを行います。
/*======================================
函数功能:链队列的销毁
函数输入:队列起始地址
函数输出:无
========================================*/
void Destory_LkQueue(LinkQueue *lq)
{
LinkListNode *s;
while(!Empty_LkQueue(lq))
{
s=Delete_LkQueue(lq);
free(s;)
}
free(lq->front);
lq->front=NULL;
lq->rear=NULL;
}