[原创]用C++类实现单向链表的增删查和反转操作
数据结构这东西,理解起来不算难,但是实现难度就不小了,虽然思路很清晰,但不知道从何下手还有语言的细节问题一直是阻碍初学者的主要障碍(比如我)。今天用了一下午时间终于独立完成了链表操作。
找网上的代码,大多用了结构体,还有些并不适合刚学c++或者数据结构的人看,于是我是用类写的,代码比较符合学生的习惯和水平。
先看类定义
class node
{
public:
int data;
node *next;
};
class linklist
{
node *h;
……//一些函数
}
两个类,node用来表示结点,node *next,表示next是指向node型的指针(一些同学看不懂这句,会和构造函数弄混),linklist类是存放头指针和定义操作函数用的。
一、整表的创建
整表创建有两种方法,头插(倒叙)和尾插(顺序),这里只说头插。
void head(linklist &l,int n)
{
node *p;
p=new node;
l.h=p;//定义头结点和投指针
p->data=n;//头指针的数据域是结点个数
p->next=NULL;//最末结点的后继必须为空
for(int i=;i<n;i++)//创建n个新结点
{
node *q=new node;
cin>>q->data;
q->next=p->next;
p->next=q;//每个新结点都放在头结点后面
}
}
二、单结点插入
void insert(linklist &l,int n,int num)
{
node *p=l.h;
for(int i=;i<n;i++)
{
p=p->next;
}//找到插入的位置
node *q=new node;
q->next=p->next;
p->next=q;
q->data=num;
}
三、单结点删除
void del(linklist &l,int n)
{
node *p=l.h;
for(int i=;i<n-;i++)
{
p=p->next;
}//找到删除的位置
node *q=p;
q=q->next;
p->next=q->next;
delete q;//释放空间
}
四、查找结点
void search(linklist &l,int n)
{
node *p=l.h;
for(int i=;i<n;i++)
{
p=p->next;
}
cout<<p->data<<endl;
}
五、倒置
由于头插是倒叙输出,就想倒置,网上好多代码都是新建一个链表,或者用到尾指针双向链表之类,我觉得不会这么麻烦于是就想了这么个算法
void reverse(linklist l)
{
node *p=l.h;
node *q;
p=p->next;
while(p->next)
{
q=p->next;
p->next=q->next;
// q->next=p; //如果把下面两句换成这句,就会悲剧。
q->next=l.h->next;
l.h->next=q;
}
}
一下午时间主要就耽误在这里了,我一开始写的就是注释那句话,后来总是输出头结点的数据,仔细观察发现原来是头指针跟着头结点换到了最后面,然后这个问题通过下面两句解决,保证头指针永远在表头。
六、结语
写到这里,终于明白为什么网上包括书上很多代码都是看懂容易写起来难,因为书或者博客作者就不会把他犯过的错误贴出来,一些简单的代码也没有很多注释,自己写的时候也理解他们了,想详细写出每一步的理由还是太难了,无法表达的东西太多,所以想掌握一个东西还是亲手实践,多犯错误才能进步,因为书上或网上很难找到细节之处易犯的错误,以为自己会了的时候就用纸写出来,到头来会发现还是不会……循环几次,就差不多了。
[原创]用C++类实现单向链表的增删查和反转操作的更多相关文章
- C语言 链表的使用(链表的增删查改,链表逆转,链表排序)
//链表的使用 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include< ...
- c++链表-双向链表+增删查改
基于双向链表的增删改查和排序(C++实现) 双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱.所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前 ...
- Java实现单链表的增删查改及逆置打印
//所提供的接口 LinkList.java package Struct; public interface LinkList {//判断链表为空public boolean linkListIsE ...
- C#学习单向链表和接口 IList<T>
C#学习单向链表和接口 IList<T> 作者:乌龙哈里 时间:2015-11-04 平台:Window7 64bit,Visual Studio Community 2015 参考: M ...
- Java实现单向链表基本功能
一.前言 最近在回顾数据结构与算法,有部分的算法题用到了栈的思想,说起栈又不得不说链表了.数组和链表都是线性存储结构的基础,栈和队列都是线性存储结构的应用- 本文主要讲解单链表的基础知识点,做一个简单 ...
- JavaScript实现单向链表结构
参考资料 一.什么是链表结构? 1.1.简介 链表和数组一样, 可以用于存储一系列的元素, 但是链表和数组的实现机制完全不同,链表中的元素在内存不是连续的空间,链表的每个元素由一个存储元素本身(数据) ...
- 复习下C 链表操作(单向链表)
Object-C 作为C 的包装语言(运行时.消息机制).如果不熟悉C 的话实在玩得太肤浅. 随便深入oc 内部都会接触到C. runtime .GCD.Block.消息机制... 所有强大的功能无不 ...
- java实现单向链表的增、删、改、查
单向链表 作者:vashon package com.ywx.link; /** * 单向链表 * @author vashon * */ public class LinkTest { public ...
- 单向链表的简单Java实现-sunziren
写在前面,csdn的那篇同名博客就是我写的,我把它现在在这边重新发布,因为我实在不想用csdn了,那边的广告太多了,还有就是那个恶心人的“阅读更多”按钮,惹不起我躲得起. 最近面试的过程中,发现有的公 ...
随机推荐
- 调用没有在AndroidManifest.xml注册过的Activity,报出的错误提示
- 苹果浏览器和uc浏览器在移动端的坑(日常积累,随时更新)
先mark 1 . 移动端uc浏览器不兼容css3 calc() 2 . ie8下a标签没有内容给宽高也不能触发点击跳转 3 . safari输入框加上readOnly="ture&qu ...
- [DeviceOne开发]-轮播图和多模板的简单示例
一.简介 这个例子是利用Slideview组件实现循环轮播的效果,同时这个slideview作为一个listview的最上面的一行数, 1. listview有2个模板,一个是以slideview为核 ...
- ArcGIS JS 学习笔记1 用ArcGIS JS 实现仿百度地图的距离量测和面积量测
一.开篇 在博客注册了三年,今天才决定写第一篇博客,警告自己不要懒!!! 二.关于ArcGIS JS 版本选择 在写这篇博客时ArcGIS JS 4.0正式版已经发布.它和3.x版本的不同是,Map不 ...
- SharePoint 2013 日历视图兼容性问题
在IE11上访问SharePoint 2013 calendar视图,发现加入兼容性视图以后访问,正常,如下图: 不加入兼容性视图IE11访问,出现兼容性问题,如下图: 因为有些环境有问题,有些环境没 ...
- [SharePoint] SharePoint 错误集 3
阅读目录 1. workflow 流程走不下去,报 workflow fails to run 的错误 2. 安装sharepoint prerequisit总是在web server (iis)这步 ...
- C/C++构建系统 -工具汇总
关于构建系统可以先参考百科 http://en.wikipedia.org/wiki/List_of_build_automation_software http://www.drdobbs.com/ ...
- Sharepoint学习笔记—习题系列--70-576习题解析 -(Q9-Q12)
Question 9 You are designing an external binary large object (BLOB) store provider by implementing t ...
- IDA在内存中dump出android的Dex文件
转载自http://drops.wooyun.org/tips/6840 在现在的移动安全环境中,程序加壳已经成为家常便饭了,如果不会脱壳简直没法在破解界混的节奏.ZJDroid作为一种万能脱壳器是非 ...
- iOS文件解压&&数据加密
一文件压缩.这里我们需要一个第三方SSZipArchive(需要添加libz.td) #import "ViewController.h" #import "SSZipA ...