データ構造 - スタックとキュー03

キューの操作の基本シーケンス

先に述べたようにチームとチームとの間の差は非常に前方に前方ポインタが移動つの位置ことは、完全に空の状態であるように、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;
 } 
公開された26元の記事 ウォンの賞賛3 ビュー1476

おすすめ

転載: blog.csdn.net/herui7322/article/details/104083427