[原创]用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了,那边的广告太多了,还有就是那个恶心人的“阅读更多”按钮,惹不起我躲得起. 最近面试的过程中,发现有的公 ...
随机推荐
- Hover States - 有趣的用户界面及交互设计
Hover States 一组新潮的和有趣的用户界面和交互设计的集合.Hover States 的目标是要成为设计师和开发人员灵感来源,向人们展示目前人们正在做的各种网站中令人惊奇的效果.他们认为交互 ...
- 微信不支持Object.assign
微信不支持Object.assign,让我Vue怎么用QAQ... 解决方法: https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Refe ...
- 如何排查sharepoint2010用户配置文件同步服务启动问题
用户配置文件同步服务与 Microsoft Forefront Identity Manager (FIM) 交互,以与外部系统(如目录服务和业务系统)同步配置文件信息.启用用户配置文件同步服务时,将 ...
- 通过组策略实现Firefox自动以当前域账号登录MOSS站点---(原创)
忘忧草原创,转发请保留本人的大名,谢谢,如果需要文档的请找我索取 前言 通过组策略实现基于AD的windows验证的sharepoint站点在火狐下自动以当前域账号登录. 操作步骤-在服务器添加策略工 ...
- Java虚拟机JVM学习03 连接过程:验证、准备、解析
Java虚拟机JVM学习03 连接过程:验证.准备.解析 类被加载后,就进入连接阶段. 连接就是将已经读入到内存的类的二进制数据合并到虚拟机的运行时环境中去. 连接阶段三个步骤:验证.准备和解析. 类 ...
- 【代码笔记】iOS-单项选择框
一,效果图. 二,工程图. 三,代码. RootViewController.h #import <UIKit/UIKit.h> @interface RootViewController ...
- GIT和SVN之间的五个基本区别
GIT不仅仅是个版本控制系统,它也是个内容管理系统(CMS),工作管理系统等.如果你是一个具有使用SVN背景的人,你需要做一定的思想转换,来适应GIT提供的一些概念和特征.所以,这篇文章的主要目的就是 ...
- 谈谈用ASP.NET开发的大型网站有哪些架构方式(成本)
在上篇文章里(http://www.cnblogs.com/ms0017/archive/2011/07/26/2117676.html),列举了国内外用ASP.NET开发的大型网站有哪些.最后提到了 ...
- 网络编程4--毕向东java基础教程视频学习笔记
Day24 06 自定义浏览器-Tomcat服务端07 自定义图形界面浏览器-Tomcat服务端08 URL-URLConnection09 小知识点10 域名解析 06 自定义浏览器-Tomcat服 ...
- FreeMarker 日期转换
${parameters.fieldDate?date} //标准日期转日期字符串 ${parameters.fie ...