C++  数据结构链表的实现代码

发布时间 - 2026-01-10 22:24:07    点击率:

C++ 链表

之前一直没怎么在意C++中的链表,但是突然一下子让自己写,就老是出错。没办法,决定好好恶补一下该方面的知识,也为今后的数据结构大下个良好的基础,于是我总结出以下几点,有些地方可能不正确,还望大家不吝赐教,旨在共同进步。

总结:

1、链表List的基本单元是节点Node,因此想要操作方便,就必须为每一步打好基础,Node的基本结构如下:

class Node{
public:
  int data;
  Node *next;
  Node(int da=0,Node *p=NULL){
    this->data=da;
    this->next=p;
  }
};

我们可以看出,Node的成员变量一共有两个,都是public,因为我们要对这两个变量进行操作,所以不能是private类型的。然后是一个构造函数,第二个参数默认值为NULL,也就是说如果我们创建新节点时只指定第一个参数,而不写第二个参数,那么它默认的就是NULL,以这种方式可以更灵活的使用Node,个人建议这么使用哦。

2、第二步就是创建我们的链表了,同样我们这里先给出链表的代码,在进行一一的解释。

class List{
private:
  Node *head,*tail;
  int position;
public:
  List(){head=tail=NULL;};
  ~List(){delete head;delete tail;};
  void print();
  void Insert(int da=0);
  void Delete(int da=0);
  void Search(int da=0);
};

我们这里面有两个数据类型,一个是Node。另一个是指代节点位置的成员变量(起不到什么作用,且不去管它吧)。使用head和tail来命名便是为了见名知意,使操作更加准确。然后是重要的六个函数,各自的功能不言而喻咯,其实最重要的是在每一个函数中我们都默认能操作head和tail两个成员变量,这样能简化我们的参数列表,使得函数更加优雅。

下面是我的一个单链表的实现,包含创建链表,插入值,删除特定的值,查找特定值得在链表中的位置。

#include<iostream>
using namespace std;

class Node{
public:
  int data;
  Node *next;
  Node(int da=0,Node *p=NULL){
    this->data=da;
    this->next=p;
  }
};

class List{
private:
  Node *head,*tail;
  int position;
public:
  List(){head=tail=NULL;};
  ~List(){delete head;delete tail;};
  void print();
  void Insert(int da=0);
  void Delete(int da=0);
  void Search(int da=0);
  int getValueAt(int position);
  void setValueAt(int position,int da);
};

int List::getValueAt(int position){
  Node *p=head;
  if(p==NULL){
    cout<<"The List is Empty!"<<endl;
  }else{
    int posi=0;
    while(p!=NULL&&posi!=position){
      posi++;
      p=p->next;
    }
    if(p==NULL){
      cout<<"There is no value of this position in this List!"<<endl;
    }else{
      cout<<"In this Position,the value is"<<p->data<<endl;
    }
  }
  return p->data;
}

void List::setValueAt(int position,int da){
  Node *p=head;
  if(p==NULL){
    cout<<"The List is Empty!"<<endl;
  }else{
    int posi=0;
    while(p!=NULL&&posi!=position){
      posi++;
      p=p->next;
    }
    if(p==NULL){
      cout<<"There is No Position in this List!"<<endl;
    }else{
      p->data=da;
      cout<<"The Value in this position has been Updated!"<<endl;
    }
  }
}

void List::Search(int da){

Node *p=head;
  if(p==NULL){
    cout<<"Sorry, The List is Empty!"<<endl;
    return;
  }
  int count=0;
  while(p!=NULL&&p->data!=da){
    p=p->next;
    count++;
  }
  cout<<"the value you want to search is at position %d"<<count<<endl;
}

void List::Delete(int da){
  Node *p=head,*q=head;
  if(p==NULL){
    cout<<"Sorry, The List is Empty!"<<endl;
    return;
  }
  while(p!=NULL&&p->data!=da){
    q=p;
    p=p->next;
  }
  q->next=p->next;
  cout<<"The Deletion Operation had been finished!"<<endl;
}

void List::Insert(int da){
  if(head==NULL){
    head=tail=new Node(da);
    head->next=NULL;
    tail->next=NULL;
  }else{
    Node *p=new Node(da);
    tail->next=p;
    tail=p;
    tail->next=NULL;
  }

}

void List::print(){
  Node *p=head;
  while(p!=NULL){
    cout<<p->data<<" \a";
    p=p->next;
  }
  cout<<endl;
}

int main(){
  cout<<"Hello World!"<<endl;
  List l1;
  l1.Insert(1);
  l1.Insert(2);
  l1.Insert(3);
  l1.Insert(4);
  l1.Insert(5);
  l1.Insert(6);
  l1.Insert(7);
  l1.print();
  l1.Search(4);
  l1.Delete(6);
  l1.print();
  l1.getValueAt(3);
  l1.setValueAt(3,9);
  l1.print();
  cout<<"The End!"<<endl;
  return 0;
}

//在此我想解释的是,之所以数字4在链表中的位置为3,是因为其是从零开始计数的

下面是代码运行后的结果:


好了,单链表的基本操作大致就是这样了,希望我们都能从中有所收获。如果您发现代码中有什么错误,还望不吝赐教,让我们共同进步吧。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


# C++  # 链表  # 链表实例详解  # 链表如何实现  # C++数据结构之链表的创建  # C++数据结构与算法之反转链表的方法详解  # C++数据结构与算法之判断一个链表是否为回文结构的方法  # C++ 数据结构之kmp算法中的求Next()函数的算法  # C++数据结构之链表详解  # 不吝赐教  # 第二个  # 还望  # 共同进步  # 的是  # 都是  # 是一个  # 我想  # 如果您  # 是因为  # 好了  # 第一个  # 让我们  # 在此  # 都能  # 中有  # 不去  # 没办法  # 这两个 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 韩国代理服务器如何选?解析IP设置技巧与跨境访问优化指南  北京专业网站制作设计师招聘,北京白云观官方网站?  Laravel如何使用模型观察者?(Observer代码示例)  详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)  EditPlus中的正则表达式 实战(4)  夸克浏览器网页跳转延迟怎么办 夸克浏览器跳转优化  Laravel怎么实现观察者模式Observer_Laravel模型事件监听与解耦开发【指南】  Android自定义控件实现温度旋转按钮效果  如何续费美橙建站之星域名及服务?  Python制作简易注册登录系统  Laravel怎么配置自定义表前缀_Laravel数据库迁移与Eloquent表名映射【步骤】  浏览器如何快速切换搜索引擎_在地址栏使用不同搜索引擎【搜索】  JavaScript 输出显示内容(document.write、alert、innerHTML、console.log)  Laravel如何处理异常和错误?(Handler示例)  东莞市网站制作公司有哪些,东莞找工作用什么网站好?  百度输入法ai组件怎么删除 百度输入法ai组件移除工具  如何解决hover在ie6中的兼容性问题  昵图网官网入口 昵图网素材平台官方入口  中山网站推广排名,中山信息港登录入口?  如何确保FTP站点访问权限与数据传输安全?  制作无缝贴图网站有哪些,3dmax无缝贴图怎么调?  如何在阿里云虚拟服务器快速搭建网站?  Linux系统命令中screen命令详解  如何用PHP快速搭建高效网站?分步指南  Win11怎么修改DNS服务器 Win11设置DNS加速网络【指南】  Laravel如何生成URL和重定向?(路由助手函数)  HTML5打空格有哪些误区_新手常犯的空格使用错误【技巧】  实现点击下箭头变上箭头来回切换的两种方法【推荐】  javascript基本数据类型及类型检测常用方法小结  Laravel怎么实现软删除SoftDeletes_Laravel模型回收站功能与数据恢复【步骤】  php读取心率传感器数据怎么弄_php获取max30100的心率值【指南】  高防服务器租用指南:配置选择与快速部署攻略  详解Oracle修改字段类型方法总结  Laravel如何实现RSS订阅源功能_Laravel动态生成网站XML格式订阅内容【教程】  javascript中的数组方法有哪些_如何利用数组方法简化数据处理  Python自动化办公教程_ExcelWordPDF批量处理案例  Laravel如何使用Passport实现OAuth2?(完整配置步骤)  Laravel如何使用查询构建器?(Query Builder高级用法)  太平洋网站制作公司,网络用语太平洋是什么意思?  如何选择PHP开源工具快速搭建网站?  EditPlus中的正则表达式 实战(2)  如何利用DOS批处理实现定时关机操作详解  Laravel怎么调用外部API_Laravel Http Client客户端使用  Windows家庭版如何开启组策略(gpedit.msc)?(安装方法)  成都品牌网站制作公司,成都营业执照年报网上怎么办理?  Laravel Debugbar怎么安装_Laravel调试工具栏配置指南  Win11搜索栏无法输入_解决Win11开始菜单搜索没反应问题【技巧】  Laravel如何设置自定义的日志文件名_Laravel根据日期或用户ID生成动态日志【技巧】  利用 Google AI 进行 YouTube 视频 SEO 描述优化  laravel怎么在请求结束后执行任务(Terminable Middleware)_laravel Terminable Middleware请求结束任务执行方法