有的时候,处于内存中的数据并非连续的。那么这时候。我们就须要在数据结构中加入一个属性。这个属性会记录以下一个数据的地址。有了这个地址之后。全部的数据就像一条链子一样串起来了,那么这个地址属性就起到了穿线连结的作用。

链表有:单链表。双链表,单循环链表。双循环链表。

理解单链表,其它几种也就大同小异。

    相比較普通的线性结构,链表结构的优势是什么呢?我们能够总结一下:
    (1)单个节点创建很方便。普通的线性内存通常在创建的时候就须要设定数据的大小
    (2)节点的删除很方便,不须要像线性结构那样移动剩下的数据
    (3)节点的訪问方便,能够通过循环或者递归的方法訪问到随意数据,可是平均的訪问效率低于线性表

    那么在实际应用中,链表是怎么设计的呢?我们能够以int数据类型作为基础,设计一个简单的int链表:

#include <iostream>
#include <cstdlib> using namespace std; struct list_node{
int data;
list_node *next; }; class list{
public:
list():head(NULL){};
~list();
void print();
void insert(int value);
/*you had better insert from the front list,that costs O(1),
*here i just insert into the taile, costing O(n)
*/
void insert_back(int pos, int value);//inisert a node with value equals to value after the node with value equals to pos
void delete_back(int pos);//delete the node after the node with value equals to pos
protected:
list_node* find(int pos); //find the node with the value equals to pos private:
list_node* head; //point to the first node }; list::~list()
{ } list_node* list::find(int pos)
{
if(NULL==head)
return NULL;
list_node* tmp=head;
while((NULL!=tmp)&&(tmp->data!=pos))
tmp=tmp->next;
return tmp; } void list::insert(int value)
{
if(head==NULL)
{
head = new list_node();
head->data=value;
head->next=NULL; }
else
{
list_node *tmp= head;
while(tmp->next!=NULL)
tmp=tmp->next;
list_node *node = new list_node();
node->data=value;
node->next=NULL;
tmp->next=node;
}
} void list::insert_back(int pos, int value)
{
list_node *tmp = find(pos);
if(NULL==tmp)
return;
else
{
list_node *node = new list_node();
node->data=value;
node->next=tmp->next;
tmp->next=node;
} } void list::delete_back(int pos)
{
list_node *tmp = find(pos);
if(NULL==tmp)
{
cout<<"the value of pos isnot exist"<<endl;
return;
}
else
{
if(tmp->next==NULL)
{
cout<<"pos is the last node"<<endl;
return;
}
else
{
tmp->next=tmp->next->next;
}
}
} void list::print()
{
list_node *tmp = head;
while(tmp!=NULL)
{
cout<<tmp->data<<" ";
tmp=tmp->next;
}
cout<<endl;
} int main()
{
list myList;
for(int i=1;i<10;++i)
{
myList.insert(i);
}
myList.print();
myList.insert(11);
myList.print();
myList.insert_back(5, 555);
myList.print();
myList.delete_back(6);
myList.print();
}

执行结果:

链表的C++实现的更多相关文章

  1. Redis链表实现

    链表在 Redis 中的应用非常广泛, 比如列表键的底层实现之一就是链表: 当一个列表键包含了数量比较多的元素, 又或者列表中包含的元素都是比较长的字符串时, Redis 就会使用链表作为列表键的底层 ...

  2. [数据结构]——链表(list)、队列(queue)和栈(stack)

    在前面几篇博文中曾经提到链表(list).队列(queue)和(stack),为了更加系统化,这里统一介绍着三种数据结构及相应实现. 1)链表 首先回想一下基本的数据类型,当需要存储多个相同类型的数据 ...

  3. 排序算法----基数排序(RadixSort(L))单链表智能版本

    转载http://blog.csdn.net/Shayabean_/article/details/44885917博客 先说说基数排序的思想: 基数排序是非比较型的排序算法,其原理是将整数按位数切割 ...

  4. 防御性编程习惯:求出链表中倒数第 m 个结点的值及其思想的总结

    防御性编程习惯 程序员在编写代码的时候,预料有可能出现问题的地方或者点,然后为这些隐患提前制定预防方案或者措施,比如数据库发生异常之后的回滚,打开某些资源之前,判断图片是否存在,网络断开之后的重连次数 ...

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

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

  6. C语言之链表list

    #include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include <string.h& ...

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

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

  8. 学习javascript数据结构(二)——链表

    前言 人生总是直向前行走,从不留下什么. 原文地址:学习javascript数据结构(二)--链表 博主博客地址:Damonare的个人博客 正文 链表简介 上一篇博客-学习javascript数据结 ...

  9. 用JavaScript来实现链表LinkedList

    本文版权归博客园和作者本人共同所有,转载和爬虫请注明原文地址. 写在前面 好多做web开发的朋友,在学习数据结构和算法时可能比较讨厌C和C++,上学的时候写过的也忘得差不多了,更别提没写过的了.但幸运 ...

  10. 数据结构:队列 链表,顺序表和循环顺序表实现(python版)

    链表实现队列: 尾部 添加数据,效率为0(1) 头部 元素的删除和查看,效率也为0(1) 顺序表实现队列: 头部 添加数据,效率为0(n) 尾部 元素的删除和查看,效率也为0(1) 循环顺序表实现队列 ...

随机推荐

  1. 【spring boot】配置文件 application.properties 属性解析

    1.JPA  hibernate命名策略 完整命名策略 ,查看:http://www.cnblogs.com/sxdcgaq8080/p/7910474.html 2.hibernate的DDL执行策 ...

  2. C#面试基础知识2

    1.C#三层架构 C#三层架构急表示层(UI,User Interface),业务逻辑层(BLL BusinessLogicLayer),数据访问层(DAL Data Access Layer).三层 ...

  3. 【前端GUI】—— 网站美工必须掌握的PS知识点&思维导图

    前言:前端离不开与设计的沟通,有时候还需要自己上手改动甚至设计网页,所以这里简单梳理一下近期学习的“网站美工”相关知识及练习.(工作用不上的时候,自己玩儿着也蛮有意思的,哈哈(*゚∀゚*)~) 一.P ...

  4. nginx的优点

    Linux.MySQL.PHP这些框架的优点之前已经介绍过,LNMP和LAMP不同的一点就是Web服务器Nginx,那么Nginx相比Apache有什么优点呢? Nginx是一个小巧而高效的Linux ...

  5. UBUNTU : Destination Host Unreachable

    介绍我的系统的搭建的方式: WIN7 64 + VMWARE STATION,方式是进行桥接的方式.最近突然出现了问题,Ubuntu ping 外网或者 PING WIN 7 的时候,出现 Desti ...

  6. (六)jQuery选择器

    jQuery 的选择器可谓之强大无比,这里简单地总结一下常用的元素查找方法: $("#myELement") 选择id值等于myElement的元素,id值不能重复在文档中只能有一 ...

  7. [ 转]C++ 虚函数表解析

    http://blog.csdn.net/haoel/article/details/1948051 前言 C++中的虚函数的作用主要是实现了多态的机制.关于多态,简而言之就是用父类型别的指针指向其子 ...

  8. css3动画学习资料整理

    现在主流浏览器(先不管IE8,IE9吧),尤其是移动端浏览器基本都支持css3了,为了增强页面的表现力,css3动画必不可少了.这篇文章主要整理一下我在学习css3动画所查阅的一些好的资料,并附上两个 ...

  9. wpf SplitButton

     SplitButton该控件除了本身Button 的功能外,还具有下拉菜单的功能,能够在按键右側加入下拉菜单控件: <SplitButton Content="..." ...

  10. ubuntu下matlab的无界面启动---命令行操作

    命令行下运行 Matlab 及 函数 首先参考命令行下matlab的运行参数的定义与作用:http://www.cnblogs.com/beanocean/p/3677404.html 创建示例程序: ...