线性表之链式存储-----单向循环链表

本文介绍了单向循环链表的结构与实现,包括结点的定义、基本操作如插入、删除、查找等,并提供了完整的C++代码示例。此外还讲解了如何实现链表的去重、合并、排序等功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

单向循环线性表:也是通过结点的形式在存储器中进行存储,结点包括数据域和指针域,逻辑上相邻的两个结点在物理上不一定相邻,单向循环链式存储的线性表,定义了一个唯一的头结点,头结点的数据域是存储数据的,指针域next指针指向下一个结点,也就是开始结点,定义了一个尾结点,尾结点的next指向头结点,数据域是存储数据的。

#include <iostream>
#include <string>

using namespace std;

typedef int DataType;

struct LinkNode{
    DataType _data;
    LinkNode* _next;
};

class SList{
public:
    SList();
    SList(const SList &s);//拷贝构造函数
    ~SList();//析构函数
public:
    //单链表的具体操心
    void Uniqe();//去重
    void Merge(SList &s);//合并
    void Sort();//冒泡
    void Reverse();//翻转
    void Swap(SList &s);//交换
    void PrintSList();//打印链表
    void PushBack(const DataType& x);//在尾部插入一个结点
    void Clear();//链表置空
    void PopBack();//删除尾结点
    void PushFront(DataType x);//头插
    void PopFront();//删除首节点
    void Insert(LinkNode *pos,DataType x);//固定位置插入一个结点
    void Erase(LinkNode *pos);//删除某个结点
    LinkNode *Find(DataType x);//查找结点并返回这个结点的地址
    int Amount();//计算链表结点的数目
    void Remove(DataType x);//查找某个结点并删除
    void RemoveAll(DataType x);//删除链表中的所有x
private:  
    LinkNode* _head;//指向头结点
    LinkNode* _tail;//指向尾结点
};

源文件实现部分;

#include "SingleLinkNode.h"
#include <assert.h>
#include <iostream>

using namespace std;

//结构体的构造函数
LinkNode::LinkNode(const DataType x)
	:_data(x),_next(NULL)
{

};

SList::SList():_head(NULL),_tail(NULL){

}

SList::SList(const SList &s)//拷贝函数
	:_head(NULL),_tail(NULL)
{
	
}


SList::~SList(){
	Clear();
}

void SList::Uniqe(){//针对有序链表进行去重处理
	assert(_head&&_head!=_tail);
	LinkNode *left=_head;
	LinkNode *right=_head->_next;
	while(left!=_tail){
	    if (left->_data==right->_data)
	    {
			LinkNode *pTemp=right;
			left->_next=right->_next;
			right=right->_next;
			delete pTemp;
	    }
		left=left->_next;
		right=right->_next;
	}
}

void SList::Merge(SList &s){
	//如果_head为空
	if (_head==NULL)
	{
		_head=s._head;
		_tail=s._tail;
	}
	//如果s为空
	if (s._head==NULL)
	{
		return;
	}
	//当两个链表都不为空时
	LinkNode *pHead=_head;
	if (pHead->_data<=s._head->_data)
	{
		pHead=pHead->_next;
	}else
	{

		_head=s._head;
		s._head=s._head->_next;
	}
	LinkNode *cur=_head;
	while(1)
	{
		if (pHead->_data<=s._head->_data)
		{
			_head->_next=pHead;
			_head=pHead->_next;
			if (pHead==_tail)
			{
				_head->_next=s._head;
				_tail=s._tail;
				_tail->_next=cur;
				break;;
				
			}
			pHead=pHead->_next;
		}else
		{
			_head->_next=s._head;
			_head=_head->_next;
			if (s._head==s._tail)
			{
				_head->_next=pHead;
				_tail->_next=cur;
				break;
			}
		}
	}
	_head=cur;
}

void SList::Sort(){

}
int SList::Amount(){//计算节点的数目
	int i=0;
	if (_head==NULL)
	{
	   return 0;
	}
	else
	{
       
	   while(_head!=_tail){
		   i++;
		   _head=_head->_next;
	   }
    }
	return i;
}

void SList::PushBack(const DataType& x){
	if (_head==NULL)
	{
		_head=new LinkNode(x);
		_tail=_head;
		_tail->_next=_head;
	}else{
		_tail=new LinkNode(x);
		_tail=_tail->_next;
		_tail->_next=_head;
	}
}

void SList::Clear(){
	LinkNode *begin=_head;
	if (begin!=_tail)
	{
		_head=_head->_next;
		delete begin;
		begin=_head;
	}
	_head=NULL;
	_tail=NULL;
}


void SList::PopBack()//尾删法
{
	if(_head==NULL)
	{

		cout<<"The SList is empty!";
	}
     else if (_head==_tail)
	{
		delete _tail;
		_head=NULL;
		_tail=NULL;
	}else
	{
       LinkNode *cur=_head;
	   while(cur!=_tail)
	      cur=cur->_next;
	   cur->_next=_head;
	   delete _tail;
	   _tail=cur;
	}

}

void SList::PopFront(){
	if (_head==NULL)
	{
		cout<<"The SList is the empty!"<<endl;
	}
	else
	{
		LinkNode *pHead=_head;
		_tail->_next=pHead->_next;
		_head=pHead->_next
		delete pHead;
		pHead=NULL;
	}
}

//在pos节点后面插入新节点
void SList::Insert(LinkNode *pos,DataType x){
	assert(pos);//如果为0(false)输出错误信息,并终止程序
	if (pos==_tail)
	{
		PushBack(x);
	}
	else{
		LinkNode *temp=new LinkNode(x);
		temp->_next=pos->_next
		pos->_next=temp;
	}

}

void SList::Erase(LinkNode *pos){
	assert(pos);
	if(pos==_head)
	{
		PopFront();
	}
    else if (pos==_tail)
	{
		PopBack();
	}else
	{
       LinkNode* prev=_head;
	   while(prev->_next!=pos){
		   prev=prev->_next;
	   }
	   prev->_next=pos->_next;
	   delete pos;
	   pos=NULL;
	}
}

LinkNode *SList::Find(DataType x){
	if (_head==NULL)
	{
		cout<<"The SList is empty";
		return nullptr;
	}
	else {
	    LinkNode *temp=_head;
		while(temp!=_head){
			if (temp->_data==x)
			{
				return temp;
			}
			temp=temp->_next;
		}
		return NULL;
	}
}

void SList::Remove(DataType x){
	if (_head==NULL)
	{
		cout<<"This SList is the empty!";
	}
	else
	{
		LinkNode *pTemp=Find(x);
		if(pTemp!=NULL){
			Erase(pTemp);
		}
	}
}

void SList::RemoveAll(DataType x){
	if (_head == NULL)
	{
		cout << "This SList is empty !" << endl;
		return;
	}
	//如果链表不为空,设置left和right前后指针,从头至尾遍历一遍,delete节点的data为x的节点

	LinkNode* left = _tail;
	LinkNode* right = _head;
	int count = Amount();
	while (count--)
	{
		//当要删掉的节点是头节点时,需要注意头节点要指向它的下一个节点
		//当要删掉的节点是尾节点时,需要注意尾节点要指向它的上一个节点
		//当left和right指向同一块要删掉的节点时,将链表置空

		if (right->_data == x)
		{
			if (_head == right)  
			{
				_head = _head->_next;
			}
			if (_tail == right)  
			{
				_tail =left;
			}
			if (right == left)   
			{
				_head = NULL;
				_tail = NULL;
				return;
			}
			LinkNode* tmp = right;
			right = right->_next;
			delete tmp;
			left->_next = right;
		}
		else
		{
			left = right;
			right = right->_next;
		}
	} 
}

 

在探索智慧旅游的新纪元中,一个集科技、创新与服务于一体的整体解决方案正悄然改变着我们的旅行方式。智慧旅游,作为智慧城市的重要分支,旨在通过新一代信息技术,如云计算、大数据、物联网等,为游客、旅游企业及政府部门提供无缝对接、高效互动的旅游体验与管理模式。这一方案不仅重新定义了旅游行业的服务标准,更开启了旅游业数字化转型的新篇章。 智慧旅游的核心在于“以人为本”,它不仅仅关注技术的革新,更注重游客体验的提升。从游前的行程规划、信息查询,到游中的智能导航、个性化导览,再到游后的心情分享、服务评价,智慧旅游通过构建“一云多屏”的服务平台,让游客在旅游的全过程中都能享受到便捷、个性化的服务。例如,游客可以通过手机APP轻松定制专属行程,利用智能语音导览深入了解景点背后的故事,甚至通过三维GIS地图实现虚拟漫游,提前感受目的地的魅力。这些创新服务不仅增强了游客的参与感和满意度,也让旅游变得更加智能化、趣味化。 此外,智慧旅游还为旅游企业和政府部门带来了前所未有的管理变革。通过大数据分析,旅游企业能够精准把握市场动态,实现旅游产品的精准营销和个性化推荐,从而提升市场竞争力。而政府部门则能利用智慧旅游平台实现对旅游资源的科学规划和精细管理,提高监管效率和质量。例如,通过实时监控和数据分析,政府可以迅速应对旅游高峰期的客流压力,有效预防景区超载,保障游客安全。同时,智慧旅游还促进了跨行业、跨部门的数据共享与协同合作,为旅游业的可持续发展奠定了坚实基础。总之,智慧旅游以其独特的魅力和无限潜力,正引领着旅游业迈向一个更加智慧、便捷、高效的新时代。
内容概要:本文详细介绍了大模型的发展现状与未来趋势,尤其聚焦于DeepSeek这一创新应用。文章首先回顾了人工智能的定义、分类及其发展历程,指出从摩尔定律到知识密度提升的转变,强调了大模型知识密度的重要性。随后,文章深入探讨了DeepSeek的发展路径及其核心价值,包括其推理模型、思维链技术的应用及局限性。此外,文章展示了DeepSeek在多个行业的应用场景,如智能客服、医疗、金融等,并分析了DeepSeek如何赋能个人发展,具体体现在公文写作、文档处理、知识搜索、论文写作等方面。最后,文章展望了大模型的发展趋势,如通用大模型与垂域大模型的协同发展,以及本地部署小模型成为主流应用渠道的趋势。 适合人群:对人工智能和大模型技术感兴趣的从业者、研究人员及希望利用DeepSeek提升工作效率的个人用户。 使用场景及目标:①了解大模型技术的最新进展和发展趋势;②掌握DeepSeek在不同领域的具体应用场景和操作方法;③学习如何通过DeepSeek提升个人在公文写作、文档处理、知识搜索、论文写作等方面的工作效率;④探索大模型在特定行业的应用潜力,如医疗、金融等领域。 其他说明:本文不仅提供了理论知识,还结合实际案例,详细介绍了DeepSeek在各个场景下的应用方式,帮助读者更好地理解和应用大模型技术。同时,文章也指出了当前大模型技术面临的挑战,如模型的局限性和数据安全问题,鼓励读者关注技术的持续改进和发展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值