一、 什么是链表
链表是一种物理存储结构上非连续,非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。
二、实现链表操作
(一)结点结构体
struct Node{
int value; //存放数据
Node* next; //指向下一个结点的地址
};
(二)链表类
1、定义链表类
class LinkList{
private:
Node* head; //头节点
public:
LinkList(); //构造函数,在创建新对象的时候自动调用
void CreateLinklist(int n);
void PrintLinklist();
int Length();
void InsertList(int i,int v);
void DeleteList(int i);
bool FindValue(int t);
};
2、构造函数
LinkList::LinkList(){
head = new Node;
head->next = NULL;
}
3、创建列表函数
void LinkList::CreateLinklist(int n){
Node* temp;
Node* p=head;
cout<<"请依次输入"<<n<<"个结点的值:";
for(int i=0;i<n;i++){
temp=new Node;
cin>>temp->value;
p->next=temp;
p=temp; //p=p->next亦可;
}
p->next=NULL; //尾结点
cout<<"链表创建成功!"<<endl;
}
4、插入结点
在链表的 i 处插入一个新结点 v ,相当于将 i 与 i 的下一个结点之间的联系断开,然后重新给 i 分配需要指向的地址(即v的地址),最后将新结点 v 的next指针指向原来 i 的下一个结点,完成链表链接。
void LinkList::InsertList(int i,int v){
int len=Length(); //获取链表长度
if(i<=0||i>len+1){
cout<<"输入位置不在范围内!"<<endl;
}
else{
Node* p;
Node* temp;
p=head;
temp=new Node;
temp->value=v;
int j=1;
while(j<i){ //找到要添加结点的位置
p=p->next;
j++;
}
temp->next=p->next;
p->next=temp;
cout<<"在"<<i<<"处插入结点成功!"<<endl;
}
}
5、删除结点
删除链表的第 i 个结点相当于上述插入操作的逆过程,断开 i 结点与上一个结点、下一个结点之间的联系,然后由 i 结点的上一个结点与下一个结点相链,i 结点最后指向NULL。
void LinkList::DeleteList(int i){
int len=Length(); //获取链表长度
if(i<=0||i>len){
cout<<"输入位置不在范围内!"<<endl;
}
else{
Node* p;
Node* temp;
p=head;
temp=new Node;
int j=1;
while(j<i){//找到要删除结点的位置
p=p->next;
j++;
}
temp=p->next;
p->next=temp->next;
temp->next=NULL;
cout<<"第"<<i<<"处结点删除成功!"<<endl;
}
}
6、查找数据
bool LinkList::FindValue(int t){
Node* p;
int i=1;
p=head->next;
while(p){
if(p->value==t){
cout<<"链表中第一次出现该数据的结点位置为:"<<i<<endl;
return true;
}
p=p->next;
i++;
}
cout<<"链表中不存在该数据!"<<endl;
return false;
}
三、源代码
/*
实现链表操作
*/
#include<iostream>
using namespace std;
//定义结点的结构体
struct Node{
int value;
Node* next;
};
//链表类
class LinkList{
private:
Node* head;
public:
LinkList(); //构造函数,在创建新对象的时候自动调用
void CreateLinklist(int n);
void PrintLinklist();
int Length();
void InsertList(int i,int v);
void DeleteList(int i);
bool FindValue(int t);
};
//构造函数
LinkList::LinkList(){
head = new Node;
head->next = NULL;
}
//创建链表
void LinkList::CreateLinklist(int n){
Node* temp;
Node* p=head;
cout<<"请依次输入"<<n<<"个结点的值:";
for(int i=0;i<n;i++){
temp=new Node;
cin>>temp->value;
p->next=temp;
p=temp; //p=p->next;
}
p->next=NULL; //尾结点
cout<<"链表创建成功!"<<endl;
}
//打印链表
void LinkList::PrintLinklist(){
Node* p;
p=head->next;
if(p==NULL){
cout<<"链表为空!"<<endl;
}
else{
cout<<"打印链表:";
while(p){
cout<<p->value<<" ";
p=p->next;
}
cout<<endl;
}
}
//获取链表长度
int LinkList::Length(){
Node* p;
p=head->next;
int len=0;
while(p){
len++;
p=p->next;
}
return len;
}
//插入结点
void LinkList::InsertList(int i,int v){
int len=Length();
if(i<=0||i>len+1){
cout<<"输入位置不在范围内!"<<endl;
}
else{
Node* p;
Node* temp;
p=head;
temp=new Node;
temp->value=v;
int j=1;
while(j<i){
p=p->next;
j++;
}
temp->next=p->next;
p->next=temp;
cout<<"在"<<i<<"处插入结点成功!"<<endl;
}
}
//删除结点
void LinkList::DeleteList(int i){
int len=Length();
if(i<=0||i>len){
cout<<"输入位置不在范围内!"<<endl;
}
else{
Node* p;
Node* temp;
p=head;
temp=new Node;
int j=1;
while(j<i){
p=p->next;
j++;
}
temp=p->next;
p->next=temp->next;
temp->next=NULL;
cout<<"第"<<i<<"处结点删除成功!"<<endl;
}
}
//查找数据
bool LinkList::FindValue(int t){
Node* p;
int i=1;
p=head->next;
while(p){
if(p->value==t){
cout<<"链表中第一次出现该数据的结点位置为:"<<i<<endl;
return true;
}
p=p->next;
i++;
}
cout<<"链表中不存在该数据!"<<endl;
return false;
}
int main(){
LinkList list;
int num;
cout<<"请输入要创建的链表的结点数:";
cin>>num;
list.CreateLinklist(num);
cout<<endl;
cout<<"请按序号选择操作:"<<endl;
cout<<"1--添加结点\n2--删除结点\n3--查找数据\n"<<endl;
while(1){
int c;
cout<<"选择的操作序号为:";
cin>>c;
if(c==1){
int x,y;
cout<<"请输入要添加结点的位置和值:";
cin>>x>>y;
list.InsertList(x,y);
list.PrintLinklist();
cout<<endl;
}
else if(c==2){
int w;
cout<<"请输入要删除结点的位置:";
cin>>w;
list.DeleteList(w);
list.PrintLinklist();
cout<<endl;
}
else if(c==3){
int v;
cout<<"请输入要查找的数据:";
cin>>v;
list.FindValue(v);
cout<<endl;
}
}
return 0;
}