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

 更新时间:2017年01月09日 14:14:25   投稿:lqh  
这篇文章主要介绍了C++ 数据结构链表的实现代码的相关资料,需要的朋友可以参考下

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,是因为其是从零开始计数的

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


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

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

相关文章

  • 应用程序操作NorFlash示例代码分享(norflash接口使用方法)

    应用程序操作NorFlash示例代码分享(norflash接口使用方法)

    相对于操作NandFlash,操作NorFlash相对简单,因为基本不需要考虑坏块,NorFlash也没有OOB区域,也跟ECC没有关系。读写擦除相对容易,下面看个例子吧
    2013-12-12
  • 浅析C语言中的sizeof

    浅析C语言中的sizeof

    sizeof是C/C++中的一个操作符(operator),作用就是返回一个对象或者类型所占的内存字节数。返回值类型为size_t,在头文件stddef.h中定义
    2013-07-07
  • C语言深入分析数组指针和指针数组的应用

    C语言深入分析数组指针和指针数组的应用

    在C语言和C++等语言中,数组元素全为指针变量的数组称为指针数组,指针数组中的元素都必须具有相同的存储类型、指向相同数据类型的指针变量。指针数组比较适合用来指向若干个字符串,使字符串处理更加方便、灵活
    2022-04-04
  • C语言实现通讯录功能的流程与代码

    C语言实现通讯录功能的流程与代码

    通讯录是一个可以记录亲人、好友信息的工具,这篇文章主要为大家详细介绍了C语言实现通讯录管理,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06
  • C++实现一个简易版的事件(Event)的示例代码

    C++实现一个简易版的事件(Event)的示例代码

    之前在 windows系统中开发应用时, 遇到需要进行线程同步的时候几乎都是使用的事件内核对象 Event。本文为大家整理了C++实现一个简易版的事件(Event)的相关资料,需要的可以参考一下
    2022-11-11
  • C语言 递归解决青蛙跳台阶问题

    C语言 递归解决青蛙跳台阶问题

    递归做为一种算法在程序设计语言中广泛应用。基本含义&#8203;是指函数/过程/子程序在运行过程序中直接或间接调用自身而产生的重入现象。在计算机编程里,递归指的是一个过程:函数不断引用自身,直到引用的对象已知
    2021-11-11
  • Qt基础开发之Qt多线程类QThread与Qt定时器类QTimer的详细方法与实例

    Qt基础开发之Qt多线程类QThread与Qt定时器类QTimer的详细方法与实例

    这篇文章主要介绍了Qt基础开发之Qt多线程类QThread与Qt定时器类QTimer的详细方法与实例,需要的朋友可以参考下
    2020-03-03
  • C语言例题之输出1000以内的所有完数

    C语言例题之输出1000以内的所有完数

    完数是一些特殊的自然数,它所有的真因子(即除了自身以外的约数)的和(即因子函数),恰好等于它本身,如果一个数恰好等于它的因子之和,则称该数为“完数”,这篇文章主要给大家介绍了关于C语言例题之输出1000以内的所有完数的相关资料,需要的朋友可以参考下
    2022-11-11
  • C语言根据协议分割获取字符串单元的实现代码

    C语言根据协议分割获取字符串单元的实现代码

    今天小编就为大家分享一篇关于C语言根据协议分割获取字符串单元的实现代码,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • 浅谈使用C++多级指针存储海量qq号和密码

    浅谈使用C++多级指针存储海量qq号和密码

    这篇文章主要介绍了浅谈使用C++多级指针存储海量qq号和密码,分享了相关实例代码,具有一定借鉴价值,需要的朋友可以参考下
    2018-01-01

最新评论