C++进阶学习——单向链表的实现

示例代码如下:

#include <iostream>
using namespace std;

class Node //节点类
{
public:
	//普通构造函数:无参数,带1个参数,带2个参数
	Node(){}
	Node(int n){ num = n; next = NULL; }
	Node(int n, Node *p){ num = n; next = p; }
	
	void setNum(int n = 0) { num = n; }
	int getNum() const { return num; }
	
	void setNext(Node *p = NULL){ next = p; } //设置指针域
	Node *getNext() const { return next; }//获取指针域
	
private:
	int num;    //数据域
	Node *next; //指针域
};

class Linklist //链表类
{
public:
	//构造函数和析构函数
	Linklist(){ head = NULL; }
	Linklist(int n){ head = new Node(n); }
	~Linklist() { clear(); }
	
	void addAtEnd(int n);//往链表尾添加节点
	void addAtHead(int n);//往链表头添加节点
	void addByNum(int n);//升序插入节点
	
	void visitAllNode() const;//遍历所有的节点
	Node *searchByNum(int n) const; //查找值为num的节点
	
	void deleteByNum(int n);//删除值为n的节点
	void clear();//删除链表所有节点
	
private:
	Node *head;
};

//往链表尾添加节点
void Linklist::addAtEnd(int n)  
{
	if(NULL == head)
	{ 
		head = new Node(n);
	}
	else
	{
		Node *temp=head;
		while( temp->getNext() != NULL)
		{ 
			temp = temp->getNext(); //用temp来指向下一个节点
		}
		//执行到这时,说明temp是最后一个节点,temp的下一个节点为NULL
		
		temp->setNext( new Node(n) );//插入节点
	}
 
}

//往链表头添加节点
void Linklist::addAtHead(int n) 
{
	if(NULL == head)
	{ 
		head = new Node(n);
	}
	else
	{
		Node *temp = new Node(n);//待插入的节点
		temp->setNext(head);//temp的下一个节点执行头
		head = temp; //新节点当做头结点
	}
 
}

//升序插入节点
void Linklist::addByNum(int n)
{
	if(NULL == head)//头结点为NULL
	{
		head = new Node(n);
	}
	else
	{
		Node *pf, *pb; //pf前一个结点, pb为后一个节点
		pf = pb = head;
		while(NULL != pb)
		{
			if(pb->getNum() >= n)//>=升序,<降序
			{
				break;
			}
			pf = pb; //pf保存当前节点
			pb = pb->getNext(); //pb指向下一个节点
		}
		
		if(NULL == pb)//尾结点
		{
			pf->setNext( new Node(n) );//插入节点
		}
		else
		{
			Node *temp = new Node(n);//待插入的节点
			
			if(pb == head) //头节点
			{
				temp->setNext(head);//temp的下一个节点执行头
				head = temp; //新节点当做头结点
			}
			else //中间
			{
				pf->setNext(temp);
				temp->setNext(pb);
			}
			
		}
			
	}
}

//遍历所有的节点
void Linklist::visitAllNode() const
{
	if(NULL == head)
	{
		cout<<"空链表!"<<endl;
	}
	else
	{
		Node *temp=head;
		
		while( temp != NULL)
		{
			cout<< temp->getNum()<<" --> ";
			temp=temp->getNext();
		}
		cout << "NULL" << endl;
	}
}

//查找值为num的节点
Node * Linklist::searchByNum(int n) const
{
	Node *temp = head;
	while(temp != NULL)
	{
		if(temp->getNum() == n)
		{
			return temp;
		}
		
		temp = temp->getNext();
	}
	
	return NULL;
}

//删除节点
void Linklist::deleteByNum(int n) 
{
	Node *pf, *pb;
	pf = pb = head;
	
	while(NULL != pb)
	{
		if(pb->getNum() == n)
		{
			break;
		}
		pf = pb;
		pb = pb->getNext();
	}
	
	if(NULL == pb)
	{
		cout << n << ":此值不存在" << endl;
	}
	else
	{
		//头结点
		if(pb == head)
		{
			pf = head->getNext();
			delete head;
			head = pf;
		}
		else
		{
			pf->setNext( pb->getNext() );
			delete pb;
		}
	}	
}

//删除链表所有节点
void Linklist::clear()
{
	Node *temp = NULL;
	temp = head; //用一个临时节点保存头结点

    //遍历链表,每次先保存头结点的next结点,然后删除头结点
    while (NULL != temp)
    {
        temp = head->getNext();//先保存头结点的next结点
        delete head;//删除头结点
		head = temp;//之前头结点的next节点重新作为head
    }
	
	cout << "链表已经清空\n";
}

int main()
{
	Linklist myList(1); //创建链表对象
	
	myList.visitAllNode(); //遍历所有的节点
	
	cout << endl;
	
	myList.addAtEnd(2); //尾部插入
	myList.addAtHead(0);//头部插入
	myList.visitAllNode(); //遍历所有的节点
	
	cout << endl;
	
	for(int i = 3; i < 10; i++)
	{
		myList.addByNum(i); //升序插入节点
	}
	myList.visitAllNode(); //遍历所有的节点
	
	cout << endl;
	
	Node *temp = myList.searchByNum(5); //查找值为5的节点
	if(NULL != temp)
	{
		cout << "此节点的值为:" << temp->getNum() << endl;
	}
	else
	{
		cout << "值为5的节点不存在" << endl;
	}
	
	temp = myList.searchByNum(100); //查找值为100的节点
	if(NULL != temp)
	{
		cout << "此节点的值为:" << temp->getNum() << endl;
	}
	else
	{
		cout << "值为100的节点不存在" << endl;
	}
	
	cout << endl;
	
	myList.deleteByNum(5);//删除值为5的节点
	cout << "删除值为5的节点:";
	myList.visitAllNode(); //遍历所有的节点
	
	cout << endl;
	myList.deleteByNum(100);//删除值为100的节点
	
	cout << endl;
	
	return 0;
}

编译运行结果如下:



本教程示例代码下载请点此链接:http://download.csdn.net/detail/tennysonsky

  • 7
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值