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

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

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

时间: 2024-10-03 12:06:38

C++实现单链表的相关文章

数据结构模版----单链表实现方式总结

数据结构模版----单链表实现方式总结 前面我们提供了四种方式实现的单链表,有带头结点的不带头结点的,而单链表的结构体定义也有两种方式,那么这些实现方式,到底有什么区别呢,为什么会出现这么多种实现方式呢,下面我们就来细细体会 一 单链表结构体的实现区别 首先我们对比一下,单链表结构体 不同方式的单链表实现时,链表结点的实现是相同的,不同之处在于单链表结构体的实现上 单链表结构体的实现 [cpp] view plain copy print? typedef int ElemType;      

单链表的实现

在单链表中,我们需要在内部有一个头节点,我们可以通过这个头节点找到其他的节点,相当于一个线索. 纵观顺序结构的线性表和单链表的实现,难点基本上都在于添加和删除操作.基于数组的线性表中,数组的索引就相当于是线性表的序号,但在单链表中,我们没有序号这个东西,所以在添加和删除操作中,我们需要先找到指定的元素,然后才能继续进行操作.在插入操作中,我们需要同时保存有当前节点的前一个节点和当前的节点,因为当前要插入的节点要放在前一个节点的Next引用域,而当前节点要放在要插入节点的next域.删除节点与此相

单链表的顺序-c++正序与逆序创建单链表有什么区别

问题描述 c++正序与逆序创建单链表有什么区别 c++正序与逆序创建单链表有什么本质的区别,逆序比顺序的优点体现在哪? 解决方案 逆序没什么特别的好处,给你学编程的时候练练手玩的,在实际的项目中会用到标准库,那是双向链表,没有逆序创建一说. 要说逆序的好处:当要加入新的数据时,不需要遍历链表,可以直接在头结点之后插入即可,减少时间复杂度 解决方案二: 没有太大价值吧......不过双向的链表应用很广泛 解决方案三: 逆序创建单链表

java单链表常用操作

总结提高,与君共勉 概述. 数据结构与算法亘古不变的主题,链表也是面试常考的问题,特别是手写代码常常出现,将从以下方面做个小结 [链表个数] [反转链表-循环] [反转链表-递归] [查找链表倒数第K个节点] [查找链表中间节点] [判断链表是否有环] [从尾到头打印单链表-递归] [从尾到头打印单链表-栈] [由小到大合并有序单链表-循环] [由小到大合并有序单链表-递归] 通常在Java中这样定义单链表结构 [java] view plain copy <span style="fon

用java学习数据结构--单链表

数据|数据结构 /* * Created on 2004-9-10 * * 单链表中的结点类型声明. */package org.arliang;/** * @author 李梁 * * 单链表中的结点. */public class node{ private int data; //存放数据 private node link; //链接的下一个接点. public static void main(String[]args) { } /** * @return Returns the da

数据结构(C#):单链表

与顺序表相比,链表有自己的特点:插入.删除操作无需移动元素:能够高效实现动态内存分配:但 不能按节点索引快速定位到节点:由于需要记录指针域,系统开销较大. 本篇介绍单链表的实现,使用上一篇定义的接口. 代码: /* * File : SingleLinkedList.cs * Author : Zhenxing Zhou * Date : 2008-12-06 * Blog : http://www.xianfen.net/ */ using System; using System.Colle

大话数据结构二:线性表的链式存储结构(单链表)

1. 线性表的链式存储结构:指的是用一组任意的存储单元存储线性表的数据元素,这组存储单元可以是连续的,也可以是不连续的,这就意味着这些数据元素可以存在内存未被占用的任意位置. 2. 结点:结点由存放数据元素的数据域和存放后继结点地址的指针域组成. 1.)顺序存储结构中,每个数据元素只需要存数据元素的信息就可以了. 2.)链式存储结构中,除了要存储数据元素信息外,还要存储它的后继元素的存储地址. 3.)链表中第一个结点叫头结点,它的存储位置叫做头指针,它的数据域可以不存储任何信息,链表的最后一个结

单链表相关算法

[1]打印单链表,void PrintList(List list); 使用一个指针遍历所有链表节点. [2]两个升序链表,打印tarList中的相应元素,这些元素的序号由SeqList指 定,void PrintLots(List tarList, List seqList); 使用两个指针分别遍历两个链表,每次取出序列链表的一个序号后,根据该 序号,到达目标链表指定节点. [3]两个升序链表交集 ,List Intersect(List l1, List l2); [4]两个升序链表并集 ,

数据结构学习(C++)之单链表

节点类 #ifndef Node_H#define Node_Htemplate <class Type> class Node //单链节点类{ public: Type data; Node<Type> *link; Node() : data(Type()), link(NULL) {} Node(const Type &item) : data(item), link(NULL) {} Node(const Type &item, Node<Type&

数据结构的C++实现之线性表之链式存储结构以及单链表反转

为了表示每个数据元素ai与其直接后继元素ai+1之间的逻辑关系,对数据ai,除了存储其自身的信息之外,还需存储一 个指示其直接后继的信息(即直接后继的存储位置).这两部分信息组成数据元素ai的存储映像,称为结点(Node).N个 结点链结成一个链表,即为线性表(a1,a2,...,an)的链式存储结构,因为此链表的每个节点中只包含一个指针域,所以叫 做单链表. 我们把链表中的第一个结点的存储位置叫做头指针,,为了更方便地对链表进行操作,如删除第一个结 点的特殊情况(第一个结点没有前驱,而要摘除一