简单双向链表,栈和队列的实现

自己写实验报告经常要用到这些代码。顺便丢上来以后不同机子可以直接在这查,需要的也可以看两眼,希望有所建议。 

链表用struct 栈和队列使用的class 这个其实没啥大区别的 都能用,需要改元素的时候只要改链表存的元素类型就行,如果分其他任务记得自己改一个函数模板出来用

链表代码

/* 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 
#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!"<

这个代码简单的离谱感觉没什么需要解释的,就是多个构造函数和一个add函数,主要还是为了增改链表方便,当然删节点还是需要自己另外实现,我这里不提供代码,其实删节点要考虑的东西比方说你队列去考虑删节点的问题,你要保证你队列的tail指针的位置是合法的,删出问题了那挺麻烦,但是硬要说实现还是蛮简单的,但是我这里建议你如果要删还是在上层去做删除的操作的实现而不是在底层,因你删除你要删谁也是个问题,你要去找你要删的这个节点的标志啥的,或者你就直接指定某个地址去删这样。


队列代码

/* 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的函数对应过去的,毕竟有时候并不需要我们弹出栈元素来看栈顶是啥玩意,队列也是这样,这个代码是以前实现的有读栈顶的需求所以留着了,不是必要的函数可以删改。

这里就提供三种数据结构的简单模型就行,刚学c++不久的应该也能看懂,不过指针操作可能还是有点多的需要稍微理解一下。

你可能感兴趣的:(数据结构,链表,数据结构)