シンプルな二重リンクリスト、スタック、キューの実装

これらのコードは、自分でラボのレポートを作成するときによく使用されます。ちなみに、吐き出した後は、ここでさまざまなマシンを直接チェックできますし、必要に応じて確認することもできます。 

リンクリストは構造体スタックやキューで使用しているクラスを使用していますが、実際には大きな違いはなくそのまま使用できます要素を変更する場合はリンクリストに格納されている要素の型を変更するだけで済みます他のタスクを分割する場合は、忘れずに関数テンプレートを変更して使用してください。

リンクリストコード

/* linknode.h */
typedef int linkelem;

typedef struct linknode{
    linkelem elem;
    /* 记得给一个合适的默认值 */
    linknode(linkelem e = 0,struct linknode* ne = 0,struct linknode* pr = 0);
    /* 前后指针 */
    struct linknode* next;
	struct linknode* prev;
    void add(linkelem e = 0);
}linknode,*link;


/* linknode.cpp */

#include <iostream>
#include "linknode.h"

using namespace std;

linknode::linknode(linkelem e,link ne,link pr){
	elem = e;
	next = ne;
	prev = pr;
}

void linknode::add(linkelem e){
    next = new linknode(e,0,this);
    if(!next){
        cout<<"error!"<<endl;
        return;
    }
}

このコードは驚くほど単純で、説明する必要はありません。複数のコンストラクターと追加関数です。主にリンク リストの追加と変更を便利にするためのものです。もちろん、ノードの削除は別途実装する必要があります。ここでは説明しません。ここにコードを提供します。実際、ノードの削除を検討する必要があります。たとえば、キュ​​ー内のノードの削除の問題を考慮する場合、キューの末尾ポインタの位置が正当であることを確認する必要があります。問題がある場合は、削除の場合は面倒ですが、実装は非常に簡単と言えば簡単ですが、もし削除したい場合は、削除操作を下位層ではなく上位層に実装することをお勧めします。誰を削除するかも問題ですが、削除したいノードの標識を見つけるか、特定のノードを直接指定する必要があります。これを削除するアドレス。


キューコード

/* quene.h */
#include"linknode.h"

class quene{
public:
	quene(void);
	link tail;
	link base;
	void push(linkelem);
	linkelem pop();
	int length();
	bool empty();
};

/* quene.cpp */

#include "quene.h"

quene::quene(){
	base = new linknode;
	tail = base;
}

void quene::push(linkelem e){
	tail->add(e);
	tail = tail->next;
	return ok;
}

linkelem quene::pop(){
	linkelem rtn;
	rtn = 0;
	if(!empty()){
		rtn = base->next->e;
		if(tail == base->next){
		tail = base;
	}
	link temp = base->next;
	base->next = temp->next;
	delete(temp);
	}
	return rtn;
}

bool quene::empty(){
	if(!base->next){
		return true;
	}
	return false;
}

int quene::length(){
	link temp = base;
	int rtn = 0;
	while(temp->next){
		temp = temp->next;
		rtn++;
	}
	return rtn;
}

 キューについては特に言うことはありませんが、呼び出されるたびに length 関数を一度トラバースする必要があるという問題があります。この関数がリソースの無駄だと思う場合は、クラスに length 変数を追加できます。ロジックは次のように動作します。

スタックコード

/* stack.h */

class stack{
public:
	stack(void);
	link base;
	link top;
	void push(linkelem);
	linkelem pop();
	bool empty();
	linkelem getop();
};

/* stack.cpp */

stack::stack(){
	base = new linknode;
	top = base;
}

void stack::push(linkelem e){
	top->add(e);
	top = top->next;
	return ok;
}

linkelem stack::pop(){
	linkelem rtn;
	rtn = top->e;
	if(!empty()){
		top = top->prev;
		delete(top->next);
		top->next = 0;
	}
	return rtn;
}

linkelem stack::getop(){
	linkelem rtn;
	rtn = top->e;
	return rtn;
}

bool stack::empty(){
	return base->next==0;
}

スタック、ここに gettop 関数があります。実際、フロント キューには過去に対応する gethead 関数があるはずです。結局のところ、スタックの一番上にあるものを確認するためにスタック要素をポップアップする必要がない場合もあります。キューも同様で、このコードは過去のものですが、実装ではスタックの先頭を読み取る必要があるため、スタックの先頭を保持し、必要のない関数は削除できます。

ここではデータ構造の 3 つの単純なモデルを提供するだけで十分であり、C++ を学んだばかりの人は理解できるはずですが、ポインタの操作はまだ少し複雑で、少し理解する必要があります。

おすすめ

転載: blog.csdn.net/nanaminanaki/article/details/128209722