C++实现单链表

C++实现单链表

1. 尾插法创建链表
2. 头插法创建链表
3. 从头至尾打印链表
4. 查找指定位置数据
5. 查找指定数据是否存在
6. 在指定位置插入指定值
7. 删除链表指定位置的节点
8. 获得链表当前长度

整体代码:


```cpp
#include<iostream>

using namespace std;

struct Node{//节点类 
	int data;//数据域 
	Node *next;//指针域,指针类型也是结构体的类型 
}; 

class LinkList{
	private:
		Node *head;//指向头结点的指针 
		int length;
	public:
		LinkList(){
			head = new Node;//头结点指向新创建的节点(目前的第一个) 
			head->data = 0;//头结点数据域为0 
			head->next = NULL;//头结点指针域为空,表示构造函数只生成一个头结点 
			this->length = 0;//链表实际长度初始化为0 
		}
		~LinkList(){}//析构函数 ,对象消亡时,自动被调用,用来释放对象占用的空间 
		bool initLinkList_tool(int size);//尾插法初始化链表 
		bool initLinkList_head(int size);//头插法初始化链表
		bool printLinkList();//打印链表
		bool searchLinkList_place(int place);//查找链表指定位置数据
		bool searchLinkList_value(int value);//查找指定数据是否存在
		bool insertLinkList(int place,int value);//在指定位置place插入数据域为指定值value的节点 
		bool deleteLinkList(int place);//删除链表指定位置的节点
		int getLength();//获得链表长度 
}; 

bool LinkList::initLinkList_tool(int n){//传入所需链表的长度,尾插法创建链表 
	if (n<0) {//如果长度小于0,创建失败 
		cout<<"初始化长度不小于0"<<endl; 
		return false;
	}
	Node *ptemp = NULL;//辅助指针变量 
	Node *pnew = NULL;//辅助指针变量 
	
	this->length = n;//设置链表长度为n 
	ptemp = this->head;//取得链表头结点 
	for(int i=0;i<n;i++){//循环创建 
		pnew = new Node;//创建新节点 
		pnew->next = NULL;//新节点的后继应该为空 
		cout << "请输入第" << i+1 << "个节点值:" << endl;
		cin >> pnew->data;//给新节点的数据域赋值 
		ptemp->next = pnew;//最开始ptemp是头结点,ptemp的下一个节点指向新节点 
		ptemp = pnew;//将ptemp设置为新节点,尾插法 
	}
	cout << "创建完成" << endl;
	return true;
}

bool LinkList::initLinkList_head(int n){//传入所需链表长度,头插法创建链表 
	if(n<0){
		cout<<"初始化长度不小于0"<<endl; 
		return false;
	}
	Node *ptemp=NULL;
	Node *pnew=NULL;
	
	this->length=n;//设置链表长度
	for(int i=0;i<n;++i){//循环创建
		pnew=new Node;//创建新节点 
		this->head->next=pnew;//头结点的指针指向新节点
		cout<<"请输入第"<<i+1<<"个节点值:"<<endl;
		cin>>pnew->data;//给新节点的数据域赋值 
		pnew->next=ptemp;// 新节点指向ptemp,最开始ptemp为空 
		ptemp=pnew;//将ptemp设置为新节点,一直是当前链表的第一个节点 
	}
	cout << "创建完成" << endl;
	return true;
} 

bool LinkList::printLinkList(){//从头至尾打印链表 
	Node *ptemp=this->head;//取得链表头结点 
	int length=this->length;//取得链表长度 
	for(int i=0;i<length;++i){//循环输出 
		ptemp=ptemp->next;//赋值为下一个 
		cout<<ptemp->data<<" "; 
	}
	cout<<endl;
}
 
bool LinkList::searchLinkList_place(int n){//查找指定位置数据
	int length=this->length;//取得链表长度 
	if(n<=0||n>length){//判断参数是否合法 
		return false;
	}
	Node *ptemp=this->head;//取得节点
	for(int i=0;i<n;++i){//循环后移至第n个位置 
		ptemp=ptemp->next;
	}
	cout<<ptemp->data<<endl;//输出第n个位置的数据 
	return true;
}

bool LinkList::searchLinkList_value(int x){//查找指定数据是否存在
	bool flag=false;
	Node *ptemp=this->head;
	for(int i=0;i<this->length;++i){
		ptemp=ptemp->next;
		if(ptemp->data==x){
			flag=true;
		}
	}
	return flag;
} 

bool LinkList::insertLinkList(int n,int x){//在指定位置插入指定值 
	int length=this->length;//取得链表长度 
	if(n<=0||n>length){//判断位置参数是否合法 
		cout<<"插入位置不合法"<<endl; 
		return false;
	}
	Node *ptemp=this->head;//取得头结点
	for(int i=0;i<n-1;++i){//遍历到目标节点的前一个 
		ptemp=ptemp->next;
	}
	Node *pnew=new Node;//创建新节点
	pnew->data=x;//新节点的数据域为x 
	pnew->next=ptemp->next;//设置新节点的后继为目标位置节点(也就是ptemp节点的后继) 
	ptemp->next=pnew; //设置新节点的前驱为目标节点的前驱(也就是ptemp)
	this->length++;//链表长度加一 
}

bool LinkList::deleteLinkList(int n){//删除链表指定位置的节点

	int length=this->length;//取得链表长度 
	if(n<=0||n>length){//判断位置参数是否合法 
		cout<<"删除位置不合法"<<endl; 
		return false;
	}
	Node *ptemp=this->head;//取得头结点
	for(int i=0;i<n-1;++i){//遍历到指定位置的前驱节点
		ptemp=ptemp->next; 
	}
	ptemp->next=ptemp->next->next;//目标节点的前驱节点指向目标节点的后继,把目标节点删除 
	this->length--;//链表长度减一 
} 

int LinkList::getLength(){//获得链表当前长度 
	return this->length;
} 

int main(){
	LinkList list1,list2;
	list1.initLinkList_tool(5); 
	list1.printLinkList();
	
	list1.deleteLinkList(5);
	list1.deleteLinkList(2); 
	list1.printLinkList();
	cout<<list1.getLength()<<endl; 
	return 0;
} 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

byg_qlh

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值