【データ構造】C言語キューの実装

キューの定義

キュー:これは、一方の端でのみデータを挿入し、もう一方の端でデータを削除できる特別な線形テーブルです。キューには先入れ先出し法があります。

キューの基本操作

エンキュー:挿入操作の終了は、キューの終了と呼ばれます
デキュー:削除操作の終了は、チームのヘッドと呼ばれます

キューはシーケンシャルテーブル(配列)とリンクリストの構造で実現することもできます。これは、キューがサポートしているためです。挿入とヘッダーの削除を終了します、したがって、リンクリストはキューを実装するのにより適しています
ここに画像の説明を挿入します

キューの実装

C言語のヘッドポインタとテールポインタを含む単一リンクリストは、キューを実装します。

キューの定義

typedef int Data;
typedef struct queuenode{
    
    
	Data data;
	struct queue* _next;
}queuenode;

typedef struct queue{
    
    
	queuenode* _start;
	queuenode* _end;
}queue;

キューの初期化

void init(queue* qe){
    
    
	qe->_end = qe->_start = NULL;
}

キューの拡張

queuenode* createqe(Data data){
    
    
	queuenode* node = (queuenode*)malloc(sizeof(queuenode));
	node->data = data;
	node->_next = NULL;
}

エンキューとデキュー

//入队(尾插)
void push(queue* qe, Data data){
    
    
	queuenode* newqueue=createqe(data);
	if (qe->_end == qe->_start == NULL){
    
    
		qe->_end = qe->_start = newqueue;
	}
	else{
    
    
		qe->_end->_next = newqueue;
		qe->_end = newqueue;
	}
}

//出队(头删)
void pop(queue* qe){
    
    
	if (qe->_end == NULL){
    
    
		return;
	}
	queuenode* next = qe->_start->_next;
	free(qe->_start);
	qe->_start = next;
	//删除之后是否为空表
	if (qe->_end == NULL){
    
    
		qe->_end = NULL;
		//避免end变为野指针
	}
}

チームの頭または尾を取得します

//获取队头元素
int top(queue* qe){
    
    
	return qe->_start->data;
}

int last(queue* qe){
    
    
	return qe->_end->data;
}

要素の数を取得します

/获取数量
int size(queue* qe){
    
    
	if (qe->_end == NULL){
    
    
		return 0;
	}
	int i = 0;
	queuenode* cur = qe->_start;
	while (cur){
    
    
		i++;
		cur = cur->_next;
	}
	return i;
}

キューを破棄します

void destory(queue* qe)
{
    
    
	assert(qe);
	queuenode* cur = qe->_start;
	while (cur)
	{
    
    
		queuenode* next = cur->_next;
		free(cur);
		cur = next;
	}
	qe->_start = qe->_end = NULL;
}

おすすめ

転載: blog.csdn.net/zhaocx111222333/article/details/114581366