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;
}