データ構造実験5、チェーンキューの基本動作

(1) 実験の目的

この実験を通じて、学生はチェーン キューの構造的特徴を理解し、それを柔軟に適用することができ、チェーン キューの基本操作のプログラミング実装を習得し、スタックが一方の端で挿入、他方の端で削除される線形構造であることを理解します。キューの「先着順」の「Out」操作特性を習得し、キューが空か満杯かを判断する条件を知り、C 言語でのポインタ操作にさらに慣れます。

(2) 実験内容

チェーンストレージ構造を使用して、教科書で定義されているキューの基本的な動作を実現します。

(3) リファレンスインターフェース

メニューには次の機能が含まれています。

1. キューを初期化する、2. キューを破棄する、3. キューを空にする、4. キューを空にする、5. キューの長さを調べる、6. キューの先頭要素を取得する、7. 要素を挿入する、8 . 要素を削除します。 9 すべての要素を出力します。

要件: プロンプトと出力ステートメントはカスタム関数では許可されません。

(4) 受入・テストケース

メニューから各操作を呼び出し、ポイントをテストします。

  1. 初期化の前に他の操作が実行されるかどうか、プログラムがそれを制御できるかどうか。
  2. キューを初期化します。
  3. キューが空であると判断すると、画面にはキューが空であることが表示されます。
  4. チームには 3 つの数字、3、5、7。
  5. キューヘッドの長さ、画面出力 3。
  6. キューのヘッド要素を取得し、キューが空かどうかを判断し、キューの長さを判断します (キューのヘッド要素を取得してもキューの内容は変更されず、キューのヘッド ポインタも変更されないことを生徒に理解してもらいます)。
  7. キューを終了し、キューの長さを判断し、キュー内の残りの要素を表示します (キューを複数回終了し、キューが空になった後で終了操作を実行します。キューが空であることを示すプロンプトを表示するかどうか)。
  8. 要素 2 をエンキューし、デキューして、キューが空かどうかを判断します (主に、デキュー操作の特殊な場合の 2 行のコードが書き込まれているかどうかをテストします)。
  9. チームを破壊し、他の操作を行ってプログラムを制御できるかどうかを確認します。

 

以下は私が書いたソースコードです。 

#include<iostream>
using namespace std;
 
#define MAXQSIZE 100
#define OK 1
#define error -1
#define false 0
#define overflow -2
#define maxsize 20
#define STACKINCREMENT 10

typedef int Status;
typedef int QElemType;

typedef struct QNode {
	QElemType  data;
	struct QNode* next;
}QNode, * QueuePtr;

typedef struct {
	QueuePtr front;
	QueuePtr rear;
}LinkQueue;


Status InitQueue(LinkQueue& Q) {
	Q.front = Q.rear = new QNode;
	if (!Q.front)
		exit(OVERFLOW);
	Q.front->next = NULL;
	return OK;
}

Status QueueEmpty(LinkQueue& Q) {
	if (Q.front == Q.rear)
		return OK;
	else
		return error;
}

Status DestoryQueue(LinkQueue& Q) {
	if (Q.front == Q.rear)return error;
	while (Q.front)
	{
		Q.rear = Q.front->next;
		free(Q.front);
		Q.front = Q.rear;
	}
	return OK;
}

Status EnQueue(LinkQueue& Q, QElemType e) {
	
	QueuePtr p;
	p = new QNode;
	if (!p)
	exit(OVERFLOW);
	p->data = e;
	p->next = NULL;
	Q.rear->next = p;
	Q.rear = p;
	if (Q.front == Q.rear)return error;
	return OK;
}

Status GetHead(LinkQueue Q,QElemType &e) {
	if (Q.front == Q.rear)return error;
	return Q.front->next->data;
}
Status Length(LinkQueue& Q,QElemType &e) {
	if (Q.front == Q.rear)return error;
 e = 0;
	QueuePtr  p = Q.front;
	while (p != Q.rear) {
		e++;
		p = p->next;
	}
	return e;
}

Status DeQueue(LinkQueue& Q,QElemType &e) {
	if (Q.front == Q.rear)return error;
	QNode* p;
	p = Q.front->next;
	e = p->data;
	Q.front->next = p->next;
	if (Q.rear == p)Q.rear = Q.front;
	delete p;
	return OK;
}

int main() {
	int m, e, i, j, n;
	LinkQueue Q;
	cout << "1.初始化链队列" << endl;
	cout << "2.判断链队列是否为空" << endl;
	cout << "3.销毁链队列" << endl;
	cout << "4.入队" << endl;
	cout << "5.求队头元素" << endl;
	cout << "6.求队长" << endl;
	cout << "7.出队" << endl;

	do {
		cout << "请输入你的选择:" << endl;
		cin >> n;
		switch (n)
		{
		case 1:
			m = InitQueue(Q);
			if (m == overflow)
			{
				cout << "队列初始化失败!" << endl;
			}
			if (m == OK)
			{
				cout << "队列初始化成功!" << endl;
			}
			break;
		case 2:
			m = QueueEmpty(Q);
			
			 if (m == error)
			{
				cout << "队列不为空!" << endl;
			}
			else if (m == OK)
			{
				cout << "队列为空!" << endl;
			}
			break;
		case 3:
			m = DestoryQueue(Q);
			if (m == error)
			{
				cout << "请先初始化队列!" << endl;
			}
			else if (m == OK)
			{
				cout << "队列销毁成功" << endl;
			}
			break;
		case 4:
			cout << "请输入你要入队的元素:" << endl;
			cin >> e;
			m = EnQueue(Q,e);
			if (m == error)
			{
				cout << "请先初始化队列!" << endl;
			}
			else {
				cout << "入队成功!" << endl;
			}
			break;
		case  5:
			m = GetHead(Q, e);
			if (m == error) {
				cout << "请先初始化栈!" << endl;
			}
			else {
				cout << "队头元素是:" << e << endl;
			}
			break;
		case 6:
			m = Length(Q,e);
			if (m == error) {
				cout << "请先初始化队列!" << endl;
			}
			else {
				cout << "队长为:" << e<<endl;
			}
			break;
		case 7:
			m = DeQueue(Q, e);
			if (m == error) {
				cout << "请先初始化栈!" << endl;
			}
			else {
				cout << "出队成功" << endl;
			}
			break;
		}
	} while (n > 0);

}

 

データ構造を学習している初心者なので、書かれたコードは十分に完璧ではないかもしれません。軽くスプレーしていただければ幸いです。(ボールボール) 

おすすめ

転載: blog.csdn.net/weixin_52357218/article/details/121366371