`

一个单向链表,并实现栈和队列

    博客分类:
  • C++
阅读更多
以下是本人学习中写的一个简单的链表和棧以及队列的实现,由于时间问题没有注释,但命名都很直观.

#include <iostream>
using namespace std;
#include <string>

typedef double T;
/*
单向链表类
*/

class List
{

	struct Node
	{
		T data;
		Node* next;
		Node(const T& t=T()):data(t),next(NULL){}
	};
	Node* head;

	public :
		List():head(NULL){}
		void clear()
		{
			while(head!=NULL)
			{
				Node* q=head->next;
				delete head;
				head=q;
			}
		}
		~List()
		{
			clear();
		}
		void insert_front(const T& t)
		{
			Node* p=new Node(t);
			p->next=head;
			head=p;
		}
		void insert_back(const T& t)
		{
			Node* p=new Node(t);
			Node* q=head;
			if(head==NULL)
				head=p;
			else{
				while(q->next!=NULL)
					q=q->next;
				q->next=p;
			}
		}
		void travel()
		{
			Node* p=head;
			while(p!=NULL)
			{
				cout<<p->data<<' ';
				p=p->next;
			}
			cout<<endl;

		}
		int size()
		{
			int cnt=0;
			Node* p=head;
			while(p!=NULL)
			{
				cnt++;
				p=p->next;
			}
			return cnt;
		}
		T getHead()
		{
			if(head==NULL)
				throw "no head !";
			return head->data;
		}
		T getTail()
		{
			if(head==NULL) throw "no tail !";
			Node* p=head;
			while(p->next!=NULL)
			{
				p=p->next;
			}
			return p->data;
		}
		bool empty()
		{
			return head==NULL;
		}

		int find(const T& t)
		{
			Node* p=head;
			int pos=0;
			while(p!=NULL)
			{
				if(p->data==t)
					return pos;
				p=p->next;
				pos++;
			}
			return -1;
		}

		bool update(const T& o,const T& n)
		{
			int pos=find(0);
			if(pos==-1)
				return false;
			Node* p=getPointer(pos);
			p->data=n;
			return true;
		}
	private :
		Node* getPointer(int pos)
		{
			Node* p=head;
			for(int i=0;i<pos;i++)
			{
				p=p->next;
			}
			return p;
		}
	public :
		bool erase(const T& t)
		{
			int pos=find(t);
			if(pos==-1)
				return false;
			if(pos==0)
			{
				Node* q=head->next;
				delete head;
				head=q;
			}else{
				Node* pre=getPointer(pos-1);
				Node* cur=pre->next;
				pre->next=cur->next;
				delete cur;
			}
			return true;
		}

};

/*
栈类
  */
class Stack
{
	List l;
public :
	void push(const T& t)
	{
		l.insert_front(t);
	}
	void pop()
	{
		l.erase(l.getHead());
	}
	T top()
	{
		return l.getHead();
	}
	bool empty()
	{
		return l.empty();
	}
	int size()
	{
		return l.size();
	}
	void clear()
	{
		l.clear();
	}
};

/*
队列类
*/
class Queue
{
	List l;
public :
	void push(const T& t)
	{
		l.insert_back(t);
	}
	void pop()
	{
		l.erase(l.getHead());
	}
	T front()
	{
		return l.getHead();
	}
	T back()
	{
		return l.getTail();
	}
	bool empty()
	{
		return l.empty();
	}
	int size()
	{
		return l.size();
	}
	void clear()
	{
		l.clear();
	}
};

void main()
{
//自己的测试代码
}


很多不足之处正在慢慢探索学习中。
4
1
分享到:
评论

相关推荐

    数据结构中链表,栈和队列,串的算法实现代码

    链表分为单向链表、双向链表和循环链表等类型。在List.cpp文件中,可能包含了链表的创建、插入、删除、遍历等操作的实现。例如,你可以找到关于头插法、尾插法、查找特定节点以及反转链表的C++代码。 栈是一种后进...

    数据结构(表,链表,栈,队列)的源代码

    这里我们将探讨标题和描述中提到的四种数据结构:表、链表、栈和队列,并结合源代码的学习来理解它们。 1. **表**(Array):表是最基础的数据结构,它是一个固定大小的数组,用于存储同类型的数据。在C语言中,...

    用链表实现队列栈 包括虚函数、指针

    链表分为单向链表、双向链表和循环链表等类型,本程序可能使用的是单向链表,因为队列和栈通常只需要头尾操作,不需要双向访问。 队列是一种先进先出(FIFO,First In First Out)的数据结构,类似于现实生活中的...

    数据结构之链表栈与队列

    在某些场景下,链表栈和链表队列相比数组实现的栈和队列,能更好地处理动态变化的大小需求。 在实际编程中,我们可能需要对这些数据结构进行优化,例如,循环链表可以避免空指针问题,提高效率;链表栈和链表队列...

    链表,顺序表,队列,栈的实现

    在单向链表中,节点只能向前指向下一个节点;而在双向链表中,节点可以向前也可以向后指。此外,循环链表是链表的一种变体,最后一个节点指向第一个节点,形成一个环。 栈是一种“后进先出”(LIFO)的数据结构,常...

    基本数据结构(链表,栈,队列,各种树)代码大全

    每个元素称为节点,包含数据和指向下一个节点的引用。链表分为单向链表、双向链表和环形链表等类型。在CIR_LK_LIST目录中,可能包含了这些链表的实现,例如插入、删除、查找等操作。 2. **栈**: 栈是一种后进先出...

    假定一个单向循环链表来表示队列

    假定一个单向循环链表来表示队列

    数据结构的链表,队列,栈(c)

    在单向链表中,每个节点只能向前指向一个节点;双向链表则允许节点同时向前和向后指;循环链表的最后一个节点会指向列表的第一个节点,形成一个环。链表的主要操作包括插入、删除和遍历。在C语言中,实现链表通常...

    链表,队列,二叉树的应用实现

    每个元素称为节点,包含数据和指向下一个节点的引用。链表主要有单向链表和双向链表两种类型。单向链表只能向前遍历,而双向链表则可以向前或向后遍历。链表的主要操作包括插入、删除和查找。在C语言中,通过指针...

    单向链表实现

    单向链表在各种数据结构(如栈、队列、哈希表)以及算法(如LRU缓存淘汰策略)中都有应用。例如,链表可以用来实现动态分配内存的内存池,或者作为操作系统中的进程控制块链表。 总结,单向链表是数据结构的基础,...

    算法大全-面试题-链表-栈-二叉树-数据结构

    链表分为单向链表、双向链表和循环链表等类型,它们各有优缺点,如单向链表插入和删除操作相对简便,但访问元素不如数组直接。 栈是一种后进先出(LIFO)的数据结构,常被比喻为一个堆叠的盘子。栈的操作主要包括压...

    c#单向链表的实现

    在实际应用中,单向链表常用于实现各种数据结构,如栈、队列和图。其优势在于插入和删除操作只需要O(1)的时间复杂度,因为它们不涉及元素的移动。然而,查找操作(特别是按索引查找)效率较低,因为链表无法提供随机...

    数据结构链表,队列,栈源代码

    链表由一系列节点组成,每个节点包含数据和指向下一个节点的指针。链表分为单向链表和双向链表。在单向链表中,节点只能向前遍历;而在双向链表中,节点可以向前也可以向后遍历。C语言中,链表通常通过定义结构体来...

    C#单向链表C#单向链表C#单向链表

    单向链表常用于实现数据结构如栈和队列,缓存管理,以及当频繁的插入和删除操作远多于查找操作时的情况。 总结,C#中的单向链表通过`LinkedList&lt;T&gt;`类提供了丰富的操作,同时也可以通过自定义节点和链表类理解其...

    单向链表实现的叫号程序

    在这个名为"单向链表实现的叫号程序"的案例中,我们可以通过分析`CallNum.java`文件来理解如何利用单向链表来实现一个简单的财务叫号系统。 首先,单向链表不像数组那样有一个连续的内存空间,它的每个元素(节点)...

    数据结构代码 栈 链表 队列

    链表分为单向链表、双向链表和循环链表等类型。链表的主要操作有插入、删除和遍历。链表在处理动态数据集合时特别有用,因为它们不需要预先确定大小,且插入和删除操作通常比数组快。 然后是队列(Queue),它是...

    LinkedBlockingQueue + 单向链表基本结构

    该队列的主要特点是其内部数据结构采用了一个单向链表,并且实现了 BlockingQueue 接口,提供了线程安全的插入、删除和获取元素的操作。 单向链表是一种简单的数据结构,由一系列节点组成,每个节点包含数据以及...

    单向链表(一) 结构体、创建链表、遍历链表

    在实际编程中,链表还可以用于实现各种高级数据结构,如栈、队列和图等。同时,链表的操作如删除节点、查找节点、反转链表等也是面试和编程竞赛中常见的问题。理解和熟练掌握链表的这些基本操作对于提升编程技能至关...

    人工智能-项目实践-python-顺序表、链表、栈、队列、树、Hashmap等数据结构;排序、二分法查找、树遍历等常见算法实现

    顺序表、链表、栈、队列、树、Hashmap等数据结构;排序、二分法查找、树遍历等常见算法实现...单向链表 双向链表 单向循环链表 栈 队列 FIFO队列 LIFO队列 优先队列(Priority Queue) 双端队列(double-ended queue)

    链表类(单向)

    在本案例中,我们讨论的是一个单向链表的实现,这是一个基础且实用的数据结构。单向链表与双向链表不同,每个节点仅包含指向下一个节点的指针,而没有指向前一个节点的指针。 首先,让我们理解链表的基本概念。链表...

Global site tag (gtag.js) - Google Analytics