单链表(c++带头结点,)

<pre name="code" class="cpp">#ifndef _SEQLIST_
#define _SEQLIST_
#include<iostream>
using namespace std;
#include<assert.h>

template<class Type> class Slist;

//节点类
template<class Type>
class Node
{
public:
	Node() :data(Type()), next(NULL){}
	Node(Type d, Node<Type> *n = NULL) :data(d), next(n){}
	void SetData(Type d)
	{
		data = d;
	}
	Type GetData()const
	{
		return data;
	}
	~Node(){}
private:
	Type data;
	Node <Type> *next;
	friend class Slist< Type>;
};
//
template<class Type>
class Slist
{
public:
	Slist( )
	{
		Node<Type> *s= _Buynode(0);
		 first = last = s;
		size = 0;
	}
	~Slist()
	{
	}
	Node<Type>* _Buynode(const Type &x)
	{
		 Node<Type>* s = new  Node<Type>(x);
		assert(s!=NULL);
		return s;
	}
private:
	Node<Type> *first;
	Node <Type>*last;
	int size;

public:
	bool push_back(const Type &x)
	{
		Node<Type>* s = _Buynode(x);
		last->next = s;
		last = s;
		size++;
		return true;
	}
	bool push_front(const Type &x)
	{
		Node<Type>* s = _Buynode(x);
		s->next = first->next;
		first->next = s;
		if (size ==0)//  0
		{
			last = s;
		}
		size++;
		return true;
	}
	bool pop_back()
	{
		if ( size==0 )//为什么写成(0==size),下面调用出错;
			return false;
		{
				Node<Type>* p = first ;
			Node<Type>* q = p->next;
				while (q->next != NULL)
				{
					q = q->next;
					p = p->next;
				}
				delete last;
				last = p;
				last->next = NULL;//程序崩溃;
				size--;

		}
		return true;
	}
	bool pop_front()
	{
		if (size == 0)
			return false;
		if (size == 1)

			pop_back();

		else
		{
			Node<Type>* s = first->next;
			first->next = s->next;
			delete s;
			size--;

		}
		return true;
	}
	/*bool insert_val2(const Type &x)
	{
		Node<Type>* p = first;
		while (p->next->data < x && p->next != NULL)

			p =p->next;

		if (p->next == NULL)
		{
			push_back(x); 

		}
		else
		{
	    	Node<Type>* s = _Buynode(x);
			s->next = p->next;
			p->next = s;
			size++;

		}
		 return true;
	}
	*/
	bool insert_val(const Type &x)
	{
		if (size == 0)
			push_back(x);
		 Node<Type> *p = first;
		while (p->next != NULL && p->next->data < x)
			p = p->next;
		if (p->next == NULL)
		{
			push_back(x);
		}
		else
		{
			 Node<Type> *s = _Buynode(x);
			s->next = p->next;
			p->next = s;
			size++;
		}
		return true;
	}

	Type length()
	{
		return size;
	}

 Node<Type>* find(const Type &key)
	{
		if (size == 0)
			return NULL;
		 Node<Type> *p = first->next;
		while (p != NULL && p->data != key)
			p = p->next;
		return p;
	}
 bool delete_val(const Type &x)
 {
	 if (size == 0)
		 return false;
	 Node<Type>*p = find(x);
	 if (p == NULL)
		 return false;
	 if (p == last)
	 {
		 pop_back();
	 }
	 else
	 {
		 Node<Type>*q = p->next;
		 p->data = q->data;
		 p->next = q->next;
		 delete q;
		 size--;
	 }
	 return true;
 }
void sort()
 {
	 if (size == 0 || size == 1)
		 return  ;
	 Node<Type>* s= first->next;
	 Node<Type>* q =s->next;
	 last = s;
	 s->next = NULL;
	 while (q != NULL)
	 {
		 s = q;
		 q = q->next;
		 Node<Type>*p = first;
		 while ( p->next != NULL && p->next->data < s->data )
			 p = p->next;
		 if (p->next == NULL)
		 {
			 s->next = NULL;
			 last->next = s;
			 last = s;
		 }
		 else
		 {
			 s->next = p->next;
			 p->next = s;
		 }

	 }

 }
void resver()
{
	if (size == 0 || size == 1)
		return;
	Node<Type>* s = first->next;
	Node<Type>* q = s->next;
	last = s;
	s->next = NULL;
	while (q != NULL)
	{
		s = q;
		q = q->next;
		push_front(s->data);
	}
}

bool next(const Type &x)
{

	Node<Type>*p=find(x);
	if (p == NULL)
	{
		cout << "未能找到" << x << endl;
		return false;
	}
	Node<Type>*q = first;

	while (q->next!= NULL&&q->data!=x)
	{
		q = q->next;
	}
	if (q->next == NULL)
	{
		cout << x << "没有后继" << endl;
		return false;
	}
	if (q->data = x)

		cout << x << "的后继是" << q->next->data << endl;
		return  true;

}
bool prio(const Type&x)
{

	Node<Type>*p = find(x);
	if (p == NULL)
	{
		cout << "未能找到" << x << endl;
		return false;
	}
	Node<Type>*q = first;

	while ( q->data != x)
	{
		q = q->next;
	}
	if (q  == first->next)
	{
		cout << x << "没有前驱" << endl;
		return false;
	}
	if (q->data = x)
	{
		Node<Type>*s = first;
		while (s->next != q)
		{
			s = s->next;
		}
		cout << x << "的前驱是" << s->data << endl;
	}
	return  true;

}
void  clear()
{
	Node<Type>*p = first->next;
	while (p != NULL)
	{
		first->next= p->next;
		delete p;
		p = first->next;
	}
	first->next = NULL;
	last = first;
	size = 0;

}
 void show_list()
	{
	 if (size == 0)
		 return;
		Node<Type> * p =  first->next;
		while (p != NULL )
		{
			cout << p->data << "-->";
				p=p->next;
		}
		cout << "ok" << endl;
	}
};

#endif

#include"SeqList.h"void main(){Slist<int> mylist;int Item;int select = 1;Node<int>* p;while (select){cout << "************************************" << endl;cout << "* [1] push_back [2] push_front *" << endl;cout << "* [3] show_list [4] pop_back *" << endl;cout
<< "* [5] pop_fornt [6] insert_val *" << endl;cout << "* [7] length [8] find *" << endl;cout << "* [9] merge [10] delete_val*" << endl;cout << "* [11] sort [12] resver *" << endl;cout << "* [13] next [14] prio *" << endl;cout << "* [15] clear [0] quit_system*"
<< endl;cout << "************************************" << endl;cout << "请选择服务项目:>";cin >> select;switch (select){case 1:cout << "请输入要插入的数据(-1结束):>";while (cin >> Item, Item!= -1){mylist.push_back(Item);}break;case 2:cout << "请输入要插入的数据(-1结束):>";while (cin >>
Item, Item != -1){mylist.push_front(Item);}break;case 3: mylist.show_list(); break;case 4:mylist.pop_back();break;case 5:mylist.pop_front();break;case 6:cout << "请输入要插入的值:>";cin >> Item;mylist.insert_val(Item);break;case 7:cout << "顺序表的长度为:>" << mylist.length()
<< endl;break;case 8:cout << "请输入要查找的值:>";cin >> Item; p = mylist.find(Item); if (p == NULL){cout << "要查找的数据不存在." << endl;}break;case 9:break;case 10:cout << "请输入要删除的值:>";cin >> Item;mylist.delete_val(Item);break;case 11:mylist.sort();break;case 12:mylist.resver();break;case
13:cout << "请输入要查后继的数";cin >> Item;mylist.next(Item);break;case 14:cout << "请输入要查前驱的数";cin >> Item;mylist.prio(Item);break;case 15:mylist.clear();break;default:break;} }system("pause");}


版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-29 02:43:23

单链表(c++带头结点,)的相关文章

C语言实现单链表(带头结点)的基本操作

我在之前一篇博客<C语言实现单链表(不带头结点)的基本操作>中具体实现了不带头结点的单链表的11种操作:如计算链表长度.初始化.创建链表.清空链表等等.但是在实际使用中,带头结点的单链表往往比不带头结点的单链表用的更多,使用也更为方便.因为不用单独考虑第一个节点的情况了,第一个节点和其他后续节点的处理全都一样了,简化操作.这篇博客将会来实现带头结点的单链表的11种操作.代码上传至: https://github.com/chenyufeng1991/LinkedList_HeadNode  .

单链表 使用哑结点避免特殊情况 利大于弊?

哑结点,就是链表的根节点.   一般的, 单链表的插入要考虑空链表的处理, 但如果有哑结点, 就无需这样考虑. 那这样好吗? 如果这样,你需要保证进入插入函数前, 单链表有哑结点,  所以你需要创建,  而且每次操作单链表需要跳过哑结点.   也就是说,  增加哑结点并没有减少特殊情况的处理,  相反, 这些处理分散到其他函数里.     我认为, 为了提高模块的独立性,   应该把空链表处理补上.

链表不带头结点的实现

首先要强调的是,ADT没有变化,只是实现上的变化. 不带头结点的实现比带头结点的实现稍微复杂一些,尤其体现在插入(第58-60行)和删除(第88-91行),要单独处理表头改变的情况.而带头结点的链表表头不会变化,总是指向头结点. 其他操作的不同之处同学们自行比较. 下面的问题会帮助你的理解: 第83行 while(p && j < i - 1) {   而教材上带头结点的实现为while(p->next && j < i - 1) { 为什么会有这种区别?

在不同的数据结构中链表是否带头结点的分析

一.链表 学习数据结构链表的时候,就有区分 带头结点的链表和不带头结点的链表 当时写完带头结点的链表的基本操作算法后,又写了一遍不带头结点的链表的基本操作. 发现是否带头结点的区别主要体现在2个操作的算法上:插入和删除 不带头结点的链表的插入和删除操作因为涉及对第一个结点插入删除,会改变头指针的值,需要对第一个结点单独分析,链表头指针形参上也因此上加入引用或者指针. 所以相对带头结点的链表操作上不带头结点的链表会更加麻烦. 插入算法上的差异: 1 //带头结点的链表 2 int insert(L

单链表一[带头节点链表]

单链表实现分带头节点链表和不带头节点链表: 使用头文件如下: struct LinkNode {     void *x;      struct LinkNode *next; }; 一,带头节点的链表: 1,链表创建 程序说明: 1)函数调用形式:szyu_link_create0("AA", "BB", NULL);其中NULL结尾是在for循环的判断结束条件为x == NULL.使用NULL可以是for循环正常退出 2)程序先创建头节点head,并初始化he

浅谈单链表有头结点和无头节点

有头结点的链表统一了算法的实现,无头节点减少了节点个数,但是只有根据实际情况选用真正的有无头节点链表 待续://代码实现 待续://代码实现 待续://代码实现

单链表(带头节点)

/////////////////////////////////定义节点结构体 struct node{ int data; struct node *pnext;}; ////////////////////////////////////main函数 int main(){ struct node *pHeader = creatList(0); /*insert_tail(creatList(1),pHeader); insert_tail(creatList(2),pHeader);

单链表的创建算法

单链表的创建算法 当一个序列中只含有指向它的后继结点的链接时,就称该链表为单链表. 单链表的示意图如下: Head指针为单链表的头指针,单链表L:L既是单链表的名字,也是其头指针.链表中的最后一个结点的指针域定义为空指针(NULL). 单链表的定义: struct Node { ElemType data; struct Node *next; }; typedef struct Node LNode; typedef struct Node *LinkedList; 单链表有带头结点和不带头结

单链表的基本实现

单链表是方向单一的链表,即就是只能从前向后访问,不能从后向前访问.这篇文章,我 将整理出单链表的一些基本功能. 1.尾插 2.尾删 3.头插 4.头删5.打印 6.插入7.删除指定元素 8.删除指定元素的全部9.删除指 定位置的元素10.排序(此文先给出基本的冒泡排序,其他排序算法之后再给出) 下边,我就这些功能一个一个进行说明,尽量配图~~(这里的单链表不带头结点) 为了方便大家读以下的代码,我给出结构体的定义. typedef struct LinkNode { DataType data;

单链表的反转非递归算法

定义单链表的结点 typedef struct ListNode{ int value; ListNode *next; }ListNode; 我们采用的单链表是带头结点的. 需要遍历一遍链表,在遍历过程中,把遍历的节点一次插入到头部.在这个过程之后,第一个节点成了最后节点,因此要特殊处理,改其后继为NULL. void Inversion(ListNode* head) { if(head->next == NULL) return; //带头结点的单链表,当单链表为空时 if(head->