文档章节

单链表的基本操作(初始化,建表,遍历,增加,删除,查找,逆序)等操作

种地瓜
 种地瓜
发布于 2015/10/21 23:29
字数 907
阅读 781
收藏 5
点赞 0
评论 0

    单链表是学习数据结构的基础,一些简单的操作还是要熟练掌握

    头文件list.h

//list.h
#include "stdio.h"
#include "stdlib.h"
#include "malloc.h"
#include <iostream>
using namespace std;

//定义节点结构体
typedef struct LNode
{
    int data;
    struct LNode * next;
}LNode,*LinkList;

//函数声明
LinkList LinkListInit();
void showmeu();
void CreateList(LNode *);
void printList(LNode *);
void addNode(LNode *);
void deleteNode(LNode *);
void searchNode(LNode *);
void reverList(LNode *);
void select(LNode *);

    源文件

//list.cpp
#include "list.h"
//list practice

//main函数
int main()
{
    LinkList head=LinkListInit();
    select(head);

    return 0;
}

//链表初始化
LinkList LinkListInit()
{
    LinkList pHead;
    pHead=(LinkList)malloc(sizeof(LNode));

    if(pHead==NULL)
    {
        cout<<"初始化失败!";
        exit(-1);
    }
    //初始化成功
    cout<<"初始化链表成功!"<<endl;
    pHead->next=NULL;
    
    return pHead;
}

void showmeu()
{
    cout<<endl<<"***************菜单,选择操作**********************"<<endl;
    cout<<"1.新建链表"<<endl;
    cout<<"2.遍历链表"<<endl;
    cout<<"3.添加节点"<<endl;
    cout<<"4.删除节点"<<endl;
    cout<<"5.查找节点"<<endl;
    cout<<"6.逆序链表"<<endl;
    cout<<"7.退出"<<endl;
    cout<<"******************************************************"<<endl;
}

void select(LNode *head)
{
    int selection;
    while(1)
    {
//        system("cls");//清屏
        showmeu();
        cout<<endl<<"请选择你的操作:";
        cin>>selection;
        switch(selection)
        {
            case 1:
                CreateList(head);break;
            case 2:
                printList(head);break;
            case 3:
                addNode(head);break;
            case 4:
                deleteNode(head);break;
            case 5:
                searchNode(head);break;
            case 6:
                reverList(head);break;
            case 7:
                exit(-1);
                
        }

    }

}

//创建链表
void CreateList(LNode * head)
{
    int n;
    int x;
    LinkList p=head;
    cout<<"请输入节点个数:";
    cin>>n;
    if(n<=0)
        exit(-1);
    for(int i=1;i<=n;i++)
    {
        LinkList q=(LinkList )malloc(sizeof(LNode));
        
        cout<<"请输入第"<<i<<"个节点值:";
        cin>>x;
        q->data=x;
        q->next=NULL;
        //关键的两句,用尾插法
        p->next=q;
        p=q;
    }
    cout<<"创建链表成功!"<<endl;
}

//遍历链表
void printList(LNode * head)
{
    LinkList p=head->next;
    if(p==NULL)
        cout<<"该链表还没有节点元素"<<endl;
    cout<<"遍历的结果是:"<<endl;
    while(p!=NULL)
    {
        cout<<p->data<<"  ";
        p=p->next;
    }
}
int getlistlong(LNode * head)
{
    LinkList p=head->next;
    int n=0;
    if(p==NULL)
        return 0;
    while(p!=NULL)
    {
        n++;
        p=p->next;
    }
    return n;
}

//插入节点
void addNode(LNode * head)
{
    int n;
    int x;
    int length=getlistlong(head);
    if(head==NULL)
        cout<<"请先创建头节点"<<endl;
    else
    {
        cout<<"请输入要插入的位置:";
        cin>>n;
        if(n>length)
        {    cout<<"因为要插入的位置比最后的位置还要大,已经为你插入到最后的位置"<<endl;
            n=length+1;
        }

        if(n<=0)
            cout<<"请输入大于0的位置"<<endl;

        cout<<"请输入要插入的值:";
        cin>>x;
        LinkList p=(LinkList)malloc(sizeof(LNode));
        p->data=x;

        LinkList q=head;

        for(int i=1;i<n;i++)
        {
            q=q->next;
        }
        p->next=q->next;
        q->next=p;

        cout<<"插入成功!"<<endl;
    }
    
}

//删除节点
void deleteNode(LNode * head)
{
    LinkList p;    //要删除的元素
    int n;
    if(head==NULL || head->next==NULL)
        cout<<"链表为空或长度为0,不能删除链表"<<endl;
    else
    {
        cout<<"请输入要删除的位置:";
        cin>>n;
        if(n<=0)
            cout<<"链表为空或长度为0,不能删除链表"<<endl;
        else
        {
            LinkList q=head;
            for(int i=1;i<n;i++)
            {
                q=q->next;
            }
            p=q->next;
            q->next=q->next->next;
            cout<<"删除的元素是:"<<p->data<<endl;
        }        
    }
}

//查找节点
void searchNode(LNode * head)
{
    LinkList p=head;
    int n=0;
    int x;
    cout<<"输入你要寻找的节点:";
    cin>>x;
    if(head==NULL || head->next==NULL) //若头节点为空,或后面也指向一个空的节点
        cout<<"链表为空,没有你要找的节点:"<<endl;
    else
    {
        while(p->next!=NULL)
        {
            if(p->data==x)
            {
                cout<<"找到你要找的节点的位置了,它在"<<n<<"个位置"<<endl;
                break;
            }
            else
            {
                p=p->next;
                n++;
            }
            if(p==NULL)
                cout<<"没有找到你要的这个节点!"<<endl;
        }
    }
}

//链表逆序
void reverList(LNode * head)
{
    LinkList p=NULL;
    LinkList q=NULL;
    if(head == NULL)
    {
        cout<<"链表为空,不需逆序!"<<endl;
    }
    p=head->next;
    while(p->next != NULL)
    {
        q=p->next;
        p->next=q->next;
        q->next=head->next;
        head->next=q;
    }
    cout<<"逆序成功,现在的链表的顺序是:"<<endl;
    printList(head);
    
}

运行结果:


© 著作权归作者所有

共有 人打赏支持
种地瓜
粉丝 9
博文 170
码字总数 44807
作品 0
深圳
程序员
数据结构第4-2讲双向链表

链表是线性表的链式存储方式,逻辑上相邻的数据在计算机内的存储位置不一定相邻,那么怎么表示逻辑上的相邻关系呢? 可以给每个元素附加一个指针域,指向下一个元素的存储位置。这种链表称为...

rainchxy ⋅ 2017/11/21 ⋅ 0

对线性表理解以及C语言实现链表的插入删除等操作。

我们首先用一个结构体定义链表的储存结构,代码如下。 在链表L中第i个元素之前插入一个新的元素:我们需要找到第i-1个结点,然后修改其指向后继的指针。假设新插入的元素e,新生成的结点为s...

奔跑的码农 ⋅ 2016/03/23 ⋅ 0

数据结构 第4讲 单链表

链表是线性表的链式存储方式,逻辑上相邻的数据在计算机内的存储位置不一定相邻,那么怎么表示逻辑上的相邻关系呢?可以给每个元素附加一个指针域,指向下一个元素的存储位置。如图所示: 从...

rainchxy ⋅ 2017/12/22 ⋅ 0

数据结构(一)——线性表、栈和队列

数据结构是编程的起点,理解数据结构可以从三方面入手: 逻辑结构。逻辑结构是指数据元素之间的逻辑关系,可分为线性结构和非线性结构,线性表是典型的线性结构,非线性结构包括集合、树和图...

yhthu ⋅ 2017/09/22 ⋅ 0

JAVA容器-自问自答学HashMap

前言 这次我和大家一起学习,我们在工作中经常会使用,而且面试中也很频繁会问到,因为它里面蕴含着很多知识点,可以很好的考察个人基础。但一个这么重要的东西,我为什么没有在一开始就去学...

liangzzz ⋅ 2017/10/19 ⋅ 0

JAVA容器-自问自答学HashMap

前言 这次我和大家一起学习,我们在工作中经常会使用,而且面试中也很频繁会问到,因为它里面蕴含着很多知识点,可以很好的考察个人基础。但一个这么重要的东西,我为什么没有在一开始就去学...

liangzzz ⋅ 2017/10/19 ⋅ 0

数据结构与算法--链表(单向链表)

为什么需要链表 顺序表的构建需要预先知道数据大小来申请连续的存储空间,而在进行扩充时又需要进行数据的搬迁,所以使用起来并不是很灵活。 链表结构可以充分利用计算机内存空间,实现灵活的...

墨痕hz ⋅ 05/28 ⋅ 0

Java关于数据结构的实现:表、栈与队列

关于作者 郭孝星,程序员,吉他手,主要从事Android平台基础架构方面的工作,欢迎交流技术方面的问题,可以去我的Github提issue或者发邮件至guoxiaoxingse@163.com与我交流。 文章目录 一 表...

郭孝星 ⋅ 2017/09/28 ⋅ 0

链表的设计--单链表逆序开始

这个问题仅仅可以考察人们对c语言特别是指针的熟悉程度,在实际编程中没有任何的意义,单链表逆序无论如何都要花费大量的时间,如果非要这么做为何不用空间来换时间,比如用双链表,然而如果...

晨曦之光 ⋅ 2012/04/10 ⋅ 0

skiplist 跳跃表详解及其编程实现

skiplist介绍 跳表(skip List)是一种随机化的数据结构,基于并联的链表,实现简单,插入、删除、查找的复杂度均为O(logN)。跳表的具体定义, 请参考参考维基百科 点我,中文版。跳表是由Wil...

gfsfg8545 ⋅ 2014/03/01 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Thrift RPC实战(二) Thrift 网络服务模型

TServer类层次体系 TSimpleServer/TThreadPoolServer是阻塞服务模型 TNonblockingServer/THsHaServer/TThreadedSelectotServer是非阻塞服务模型(NIO) 1 TServer抽象类的定义 内部静态类Args的...

lemonLove ⋅ 12分钟前 ⋅ 0

vim命令用法

第五章 vim命令 vim和vi几乎是一样的,唯一的区别就是当编辑一个文本时,使用vi不会显示颜色,而使用vim会显示颜色。 vim有三个模式:一般模式,编辑模式,命令模式。 系统最小化安装时没有安...

弓正 ⋅ 13分钟前 ⋅ 0

MyBatis源码解读之配置

1. 目的 本文主要介绍MyBatis配置文件解析,通过源码解读mybatis-config.xml(官方默认命名)、Mapper.xml 与Java对象的映射。 2. MyBatis结构 查看大图 MyBatis结构图,原图实在太模糊了,所以...

无忌 ⋅ 17分钟前 ⋅ 0

Ignite的jdbc与网格的连接方式的查询性能对比

环境: 数据量100万 Ignite2.5 Windows10 8g jdbc方式连接 import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; i......

仔仔1993 ⋅ 31分钟前 ⋅ 0

收集自网络的wordpress 分页导航的代码教程(全网最全版)

wordpress 分页导航是用来切换文章的一个功能,添加了 wordpress 分页导航后,用户即可自由到达指定的页面数浏览分类文章,而这样的一个很简单功能却有很多朋友在用插件:WP-PageNavi,插件的...

Rhymo-Wu ⋅ 47分钟前 ⋅ 0

微服务 WildFly Swarm 入门

Hello World 就像前面章节中的其他框架一样,我们希望添加一些基本的 Hello-world 功能,然后在其上逐步添加更多的功能。让我们从在我们的项目中创建一个 HolaResources 开始。您可以使用您的...

woshixin ⋅ 54分钟前 ⋅ 0

Maven的安装和Eclipse的配置

1. 下载Maven 下载地址 2. 解压压缩包,放到自己习惯的硬盘中 此处我将其放到了 D:\Tools 目录下。 3. 配置环境变量 右键此电脑 -> 属性 -> 高级系统设置 -> 环境变量。 在系统变量中新建,变...

影狼 ⋅ 今天 ⋅ 0

python pip使用国内镜像的方法

国内源 清华:https://pypi.tuna.tsinghua.edu.cn/simple 阿里云:http://mirrors.aliyun.com/pypi/simple/ 中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/ 华中理工大学:http://......

良言 ⋅ 今天 ⋅ 0

对于url变化的spa应该如何使用微信jssdk

使用vue单页面碰上微信jssdk config验证失败的坑。第一次成功 之后切换页面全部失败,找到了解决方法,第一次验证成功后保存验证信息 切换页面时验证信息直接拿来用,加一个wx.error() 失败时...

孙冠峰 ⋅ 今天 ⋅ 0

Spring Cloud Gateway 一般集成

SCF发布,带来很多新东西,不过少了点教程,打开方式又和以前的不一样,比如这个SCG,压根就没有入门指导,所以这里写一个,以备后用。 一、集成 pom.xml <dependency> <groupI...

kut ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部