链表的定义

//链表的定义 头文件
template<class T>
class ChainNode{
friend Chain<T>
private:
T Data;		//数据域
ChainNode<T> *link;//指针域
}
template <class T>
class Chain{
public:
Chain(){first=0;}
~Chain();
bool IsEmpty()const{return first==0;}
int Length()const;
bool Find(int k,T& x)const;
int Search(const T& x)const;
Chain<T>& Delete(int k,T& x);
Chain<T>& Insert(int k,const T& x);
void Output(ostream& out)const;
private:
ChainNode<T> *first;
}
template<class T>
Chain::~Chain()
{	
	ChainNode *next;
	while(first){
	next=first->link;
	delete next;
	first=next;
	}
}
template<class T>
int Chain<T>::Length()const;
{
	ChainNode<T> *current=first;
	int len=0;
	while(current){
	len++;
	current=first->link;
	}
	return len;
}
template<class T>
bool Chain<T>::Find(int k,T& x)const
{//寻找第k个元素将其传送到x;
	if(k<1)return false;
	ChainNode<T> *current=first;
	int index=1;
	while(index<k&¤t){
	current=current->link;
	index++;
	}
	if (current){x=current->Data;return true;}
	return false;
}
template<class T>
int Chain<T>::Search(const T& x)const;
{
	ChainNode<T> *current=first;
	int index=1;
	while(current&¤t->Data!=x){
	current=current->link;
	index++;
	}
	if(current){return index;}
	return 0;
}
template<class T>
Chain<T>& Chain<T>::Delete(int k,T& x)//返回一个引用表示返回*this本身
{//把第k个元素取至x然后从链表中删除第k 个元素
//如果不存在第k 元素则找不到引发异常
	if(k<1||!first)		//如果不存在first  
	cerr<<"wrong to find the number:"<<endl;//找不到第K个元素 输出错误
	ChainNode<T> *p=first;	//P最终指向第k个节点
	if(k==1)		//p已经指向第k个元素 因为p的初始化是first
	{first=first->link;//删除 第一个节点
	else		//用q指向第k-1个元素 
	ChainNode *q=first;}
	for(int index=1;index<k-1&&q;index++)
	q=q->link;	//找到p 即是k-1 个元素
	if(!q||q->link)
	cerr<<"can not find the number"<<endl;//不存在第k个元素  
	p=q->link;//存在第k个元素  q的指针域指向p  
	q->link=p->link;//删除第k个元素   
	x=p->Data;	
	//保存第k个元素并释放节点p
	delete p;
	return *this
}
template<class T>
Chain<T>& Chain<T>::Insert(int k,const T& x)
{	//第k个元素之后插入x
	if(k<0)//不存在k;
	cerr<<"can not find\n";
	ChainNode<T> *p=first;	//p最终指向第k个节点 
	for(int index=1;index<k&&p;index++)
	p=p->link;	//将p移动到第k个节点
	if(k<0&&!P)cerr<<"x is not exit\n";//不存在第k个元素
	ChainNode<T> *y=new ChainNode<T>;	
	y->Data=x;
	if(k){		//在p之后插入 ;
	y->link=p->link;
	p->link=y;}
	else{		//作为第一个元素插入 
	y->link=first;
	first=y;}
	return *this;
}
template<class T>
void Chain<T>::Output(ostream& out)const;
{
	ChainNode<T> *current;
	for(current=first;current;current=current->link)
	out<<current->Data<<" ";
}
//重载<<
template<class T>
ostream& operator<<(ostream& out,const Chain<T>& x)
{x.Output;return out;}

### C++ 中链表定义方式 在 C++ 编程语言中,链表是一种动态数据结构,通常由一系列节点组成。每个节点包含两部分:一部分用于存储实际的数据,另一部分是一个指向下一个节点的指针(对于单向链表而言)。以下是基于提供的参考资料和专业知识构建的内容。 #### 单向链表定义 单向链表是最简单的链表形式,其中每个节点仅有一个指向前一节点或下一节点的指针。以下是如何在 C++ 中定义单向链表: ```cpp struct Node { int data; // 存储数据的部分 Node* next; // 指向下一个节点的指针 }; ``` 上述代码片段展示了如何定义一个单向链表的基本单元 `Node`[^1]。该结构体包含了两个成员变量:一个是整型变量 `data` 用来保存节点的实际值;另一个是指针类型的变量 `next`,表示当前节点与其后续节点之间的连接关系。 #### 双向链表定义 双向链表允许从任意方向遍历整个链条,因此除了普通的前驱指针外还增加了一个后继指针字段。下面给出的是带有前后双指针设计模式下的实现方法: ```cpp struct Node { int data; Node* forward; // 前向指针 Node* backward; // 后向指针 }; ``` 此版本增加了额外的一个属性叫做 `backward` 来追踪上一层级的信息以便支持反向迭代功能[^2]。 #### 使用标准库初始化列表创建链表实例 现代 C++ 提供了一种更简洁的方式来初始化容器类对象——即利用 std::initializer_list 类型参数化构造函数来简化语法表达并提高可读性和效率: ```cpp class List { public: List(std::initializer_list<int> ilist); private: struct Node { int value; Node* next; }; Node* head; }; // 构造器内部逻辑省略... List list = {1, 2, 3, 4}; // 初始化链表为四个元素组成的序列 ``` 上面的例子演示了怎样借助 c++11 新特性快速建立含有预设数值集合的自定义链表类型[^3]。注意这里的 class 定义隐藏了一些细节比如具体分配内存空间给新加入项的过程等。 ### 总结 综上所述,在 C++ 当中可以通过多种途径去描述和操纵链表这种重要的抽象数据类型。无论是传统的手动管理还是依托 STL 的高级工具都可以达到目的只是复杂度有所不同罢了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值