之前一直没怎么在意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++实现单链表的更多相关文章

  1. 时间复杂度分别为 O(n)和 O(1)的删除单链表结点的方法

    有一个单链表,提供了头指针和一个结点指针,设计一个函数,在 O(1)时间内删除该结点指针指向的结点. 众所周知,链表无法随机存储,只能从头到尾去遍历整个链表,遇到目标节点之后删除之,这是最常规的思路和 ...

  2. 单链表的C++实现(采用模板类)

    采用模板类实现的好处是,不用拘泥于特定的数据类型.就像活字印刷术,制定好模板,就可以批量印刷,比手抄要强多少倍! 此处不具体介绍泛型编程,还是着重叙述链表的定义和相关操作.  链表结构定义 定义单链表 ...

  3. Java实现单链表的各种操作

    Java实现单链表的各种操作 主要内容:1.单链表的基本操作 2.删除重复数据 3.找到倒数第k个元素   4.实现链表的反转   5.从尾到头输出链表 6.找到中间节点 7.检测链表是否有环 8.在 ...

  4. [LeetCode] Linked List Cycle II 单链表中的环之二

    Given a linked list, return the node where the cycle begins. If there is no cycle, return null. Foll ...

  5. c++单链表基本功能

    head_LinkNode.h /*单链表类的头文件*/#include<assert.h>#include"compare.h"typedef int status; ...

  6. 单链表、循环链表的JS实现

    数据结构系列前言: 数据结构作为程序员的基本知识,需要我们每个人牢牢掌握.近期我也展开了对数据结构的二次学习,来弥补当年挖的坑......   当时上课的时候也就是跟着听课,没有亲自实现任何一种数据结 ...

  7. C代码实现非循环单链表

    C代码实现非循环单链表, 直接上代码. # include <stdio.h> # include <stdlib.h> # include <malloc.h> ...

  8. 分离的思想结合单链表实现级联组件:CascadeView

    本文介绍自己最近做省市级联的类似的级联功能的实现思路,为了尽可能地做到职责分离跟表现与行为分离,这个功能拆分成了2个组件并用到了单链表来实现关键的级联逻辑,下一段有演示效果的gif图.虽然这是个很常见 ...

  9. 数据结构:单链表结构字符串(python版)添加了三个新功能

    #!/urs/bin/env python # -*- coding:utf-8 -*- #异常类 class stringTypeError(TypeError): pass #节点类 class ...

  10. 数据结构:单链表结构字符串(python版)改进

    此篇文章的replace实现了字符串类的多次匹配,但依然有些不足. 因为python字符串对象为不变对象,所以replace方法并不修改原先的字符串,而是返回修改后的字符串. 而此字符串对象时用单链表 ...

随机推荐

  1. 什么样的简历受HR青睐?

    简历是我们在求职过程中的名片,那么如何写出更容易受到HR青睐的简历呢? HR可能一天要看上百份的简历,他们都希望能够尽快筛选出合适的人,然后用更多的时间去跟候选人沟通.所以招聘人员一般看一份简历只会花 ...

  2. ionic安装教程

    首先是安装node.js,通过nodejs官网下载,网址https://nodejs.org/en/.如果下载许要教程推荐这个https://www.cnblogs.com/zhouyu2017/p/ ...

  3. Redis之(三)管理命令

    4.1键管理 通过学习五种数据类型的操作命令,可以发现,Redis对每种数据的处理之前,都要先指定该数据的key,然后再指定对该数据进行何种操作. Redis中的key有点类似于Java中的变量名,起 ...

  4. Redis之(二)数据类型及存储结构

    Redis支持五中数据类型:String(字符串),Hash(哈希),List(列表),Set(集合)及zset(sortedset:有序集合). Redis定义了丰富的原语命令,可以直接与Redis ...

  5. TCP发送源码学习(3)--tcp_transmit_skb

    一.tcp_transmit_skb static int tcp_transmit_skb(struct sock *sk, struct sk_buff *skb, int clone_it, g ...

  6. 这是最好的时光 这是最坏的时光 v0.1.1.1

    这是最好的时光 这是最坏的时光 v0.1.1.1 1.2 学校的生活二三事之大学 话说上一回,扯了一下我青涩的少年往事,大家反响不一,有叫好的,有吐槽的,有字字码过的,也有一目十行的.我的心情也是随着 ...

  7. 【SSH系列】Hibernate映射 -- 一对多关联映射

        映射原理       一对多关联映射和多对一关联映射的映射原理是一样一样的,所以说嘛,知识都是相通的,一通百通,为什么说一对多关联映射和多对一关联映射是一样的呢?因为她们都是在多的一端加入一个 ...

  8. J2EE进阶(十八)基于留言板分析SSH工作流程

    J2EE进阶(十八)基于留言板分析SSH工作流程   留言板采用SSH(Struts1.2 + Spring3.0 + Hibernate3.0)架构.   工作流程(以用户登录为例):   首先是用 ...

  9. springMVC+Hibernate4+spring整合实例二(实例代码部分)

    UserController.java 代码: package com.edw.controller; import java.io.IOException; import java.io.Print ...

  10. JavaScript与jQuery获取相邻控件

    原始代码如下,需求是onclick中的OpenIframe方法捕捉到input中的value值,由于某些限制无法使用正常的操作dom根据name值来取,所以决定通过相邻空间的方式获取 <div& ...