[原创]用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了,那边的广告太多了,还有就是那个恶心人的“阅读更多”按钮,惹不起我躲得起. 最近面试的过程中,发现有的公 ...
随机推荐
- C# yield
C#中的yield可以应用在一个可迭代的方法中,我们必须真正理解此关键词,才能将它正确的应用到实际生产中.为了说明yield会出现让我们迷惑的结果,下面先定义一个MyObject类: class My ...
- [deviceone开发]-仿微信主界面示例
一.简介 模仿微信主界面的4个页面,作为一个很常规应用的框架模板,值得参考.另外包括简单的菜单,其中搜索还支持语音录入,不过你需要增加飞讯的语音组件重新打包,才能看到效果 二.效果图 三.相关下载 h ...
- Refusing to install webpack as a dependency of itself
用npm安装webpack的时候报了这个错: Refusing to install webpack as a dependency of itself 翻译过来大概是:'拒绝安装webpack其本身 ...
- arcmap Command
The information in this document is useful if you are trying to programmatically find a built-in com ...
- spring+ibatis+多数据源
环境:spring3.1+ibatis2.3.4+oracle+hbase要求:需要在工程中操作两个不同的数据源,一个是mssql,另一个是hbase.实现: <bean id=" ...
- ICSharpCode.SharpZipLib简单使用
胡乱做了个小例子,记录下来,以便后面复习. using System; using System.Collections.Generic; using System.Linq; using Syste ...
- yii2整合百度编辑器umeditor
作者:白狼 出处:www.manks.top/article/yii2_umeditor 本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责 ...
- openstack security group and rules python api use
nova和neutron都可以,但是感觉还是用neutron好. import neutronclient.v2_0.client as neclient neutron = neclient.Cli ...
- Asp.net MVC的Model Binder工作流程以及扩展方法(3) - DefaultModelBinder
Default Binder是MVC中的清道夫,把守着Model Binder中的最后一道防线.如果我们没有使用Custom Model Binder等特殊处理,那么Model的绑定都是有Defaul ...
- 用SQL语句建库建表建约束(用SQl语句在指定盘符创建文件夹)
一 :创建数据库 创建一个数据文件和一个日志文件(MySchool) create database MySchoolon primary --默认属于primary主文件组,可省略(--数 ...