线性表(链表)的创建、查找、插入、删除

线性表的链式存储结构——链表及其操作(创建,查找,插入,输出,删除) 文章目录1.单链表的建立1.1头插法1.2尾插法2.链表基本操作 1.单链表的建立 1.1头插法 1)从一个空表开始,创建一个头结点。 2)依次读取数组a中的元素,生成新节点。 3)将新节点插入到当前链表的表头上,直到结束为止,插入过程如下图所示。 typedef struct LNode { int data; struct LNode *next;//存储后继节点位置的指针域,用next表示 }LinkNode; 头插法代码如下,由数组元素a创建单链表L void CreatListF(Lin 阅读详情
/************************************************************************
*
* 文件名:2.1.2.cpp
*
* 文件描述:线性表(链表)的查找、插入、删除
*
* 创建人:  fdk

* 时  间:  2018-07-28
*
* 版本号:1.0
*
* 修改记录:头结点的作用:
1、防止单链表是空的而设的.当链表为空的时候,带头结点的头指针就指向头结点.如果当链表为空的时候,单链表没有带头结点,那么它的头指针就为NULL.
2、是为了方便单链表的特殊操作,插入在表头或者删除第一个结点.这样就保持了单链表操作的统一性!
3、单链表加上头结点之后,无论单链表是否为空,头指针始终指向头结点,因此空表和非空表的处理也统一了,方便了单链表的操作,也减少了程序的复杂性和出现bug的机会。
4、对单链表的多数操作应明确对哪个结点以及该结点的前驱。不带头结点的链表对首元结点、中间结点分别处理等;而带头结点的链表因为有头结点,首元结点、中间结点的操作相同 ,从而减少分支,使算法变得简单 ,流程清晰。对单链表进行插入、删除操作时,如果在首元结点之前插入或删除的是首元结点,不带头结点的单链表需改变头指针的值,在C 算法的函数形参表中头指针一般使用指针的指针(在C+ +中使用引用 &);而带头结点的单链表不需改变头指针的值,函数参数表中头结点使用指针变量即可。
单链表的掌握还不够熟练,需要多加练习。特别是建表的方法不仅要看懂更要能写出来。
*
************************************************************************/
#include <iostream>
#include <cstdlib>
using namespace std;

/*定义结点*/
typedef struct Node
{
    int data;
    struct Node* next;
}lists;

/*初始化链表*/
lists *MakeEmpty();

/*尾插法建表*/
void CreatList(lists *ptrl, int a[]);

/*求表长*/
int Length(lists *ptrl);

/*按序号查找*/
lists *FindKth(int k, lists *ptrl);

/*按值查找*/
int Find(int x, lists *ptrl);

/*插入在第i-1个结点后插入一个值为x的新结点*/
void Insert(int x, int i, lists *ptrl);

/*删除i位置上的结点*/
void Delete(int i, lists *ptrl);

/*遍历链表*/
void TravelList(lists *ptrl);
int main()
{
    int a[] = {2, 4, 5, 1, -2, 4, 6, 10};

    /*初始化链表*/
    lists *l = MakeEmpty();

    CreatList(l, a);

    /*遍历链表*/
    TravelList(l);

    /*求链表的长度*/
    cout << "链表的长度为:" << Length(l) << endl;

    /*按序号查找第k个位置上的元素*/
    lists* p1 = FindKth(4, l);
    cout << "第4个位置上的元素为:" << p1->data << endl;

    /*按值查找值为1的元素所在的位置*/
    cout << "值为1的元素所在的位置为:" << Find(1, l) << endl;

    /*在第i个位置后插入一个值为7的结点*/
    Insert(7, 1, l);

    Insert(15, 2, l);

    /*删除第8个位置上的元素*/
    Delete(8, l);

    /*遍历链表*/
    TravelList(l);
    return 0;
}

/*初始化链表*/
lists *MakeEmpty()
{
    lists* Ptrl;

    /*申请一个当前的结构,malloc函数向系统申请分配指定内存的空间*/
    Ptrl = (lists*)malloc(sizeof (lists));
    if (Ptrl == NULL)
    {
        cout << "初始化失败" << endl;
        exit(-1);
    }
    /*表示当前表没有元素*/
    Ptrl->next = NULL;
    return Ptrl;
}

/*求表长*/
int Length(lists *ptrl)
{
    /*p指向的是表的第一个结点*/
    lists *p = ptrl->next;
    int num = 0;
    while (p)
    {
        /*当前p指向的是第j个结点*/
        p = p->next;
        num++;
    }
    return num;
}

/*按序号查找*/
lists *FindKth(int k, lists *ptrl)
{
    lists *p = ptrl->next;
    int num = 1;
    while (p != NULL && num < k)
    {
        p = p->next;
        num++;
    }
    if (num == k)
    {
        /*如果找到返回指针*/
        return p;
    }
    else
    {
        /*如果没有找到返回NULL*/
        return NULL;
    }
}

/*按值查找*/
int Find(int x, lists *ptrl)
{
    lists *p = ptrl->next;
    int num = 1;
    while (p->data != x && p != NULL)
    {
        p = p->next;
        num++;
    }
    /*找到了返回对应的指针没找到返回NULL*/
    return num;
}

/*插入在第i-1个结点后插入一个值为x的新结点*/
void Insert(int x, int i, lists *ptrl)
{
    /*s用来当插入结点的头结点*/
    lists *s;

    /*p用来找到第i-1个结点*/
    lists *p;

    if( i == 1)
    {
        /*新结点插在表头*/
        s = (lists *)malloc(sizeof(lists));
        /*申请、装填结点*/
        s->data = x;
        s->next = ptrl->next;
        ptrl->next = s;
        return;
    }
    /*查找第i-1个结点的位置*/
    p = FindKth(i-1, ptrl);

    if (p == NULL)
    {
        cout << "参数出错!" << endl;
        return;
    }
    else
    {
        s = (lists *)malloc(sizeof(lists));
        /*插入第i个结点*/
        s->data = x;
        s->next = p->next;
        p->next = s;
    }
}

/*删除i位置上的结点*/
void Delete(int i, lists *ptrl)
{
    /*用来找到第i-1个结点的位置*/
    lists *p;

    /*用来删除第一个结点*/
    lists *s;

    /*若要删除的是第一个结点*/
    if (i == 1)
    {
        /*s指向第一个结点*/
        s = ptrl;

       /*从链表中删除*/
       if (ptrl != NULL)
       {
           ptrl = ptrl->next;
       }
       else
       {
           return;
       }
       free(s);
    }

    /*查找第i个结点*/
    p = FindKth(i-1, ptrl);
    if (p == NULL)
    {
        cout << "第" << i -1 << "个结点不存在" << endl;
        return;
    }
    else if (p->next == NULL)
    {
        cout << "第" << i << "个结点不存在" << endl;
    }
    else
    {
        /*s指向第i个结点*/
        s = p->next;

        /*从链表中删除*/
        p->next = s->next;

        /*释放被删除结点*/
        free(s);
    }
}

/*遍历链表*/
void TravelList(lists *ptrl)
{
    lists* p = ptrl->next;
    cout << "链表中的元素依次为:";
    while (p)
    {
        cout << p->data << " ";
        p = p->next;
    }
    cout << endl;
}

/*尾插法建表*/
void CreatList(lists *ptrl, int a[])
{
    /*尾插法的建表顺序与输入一致,头插法则想反*/
    int i;

    /*新建结点*/
    lists *pnew;
    lists *p;
    p = ptrl;
    for (i = 1; i <= 8; i++)
    {
        /*申请装填结点*/
        pnew = (lists *)malloc(sizeof(lists));
        cout << a[i-1] << endl;
        pnew->data = a[i-1];

        /*新结点插入表尾*/
        p->next = pnew;
        p = pnew;
    }
    p->next = NULL;
}

 

day19-线性表(顺序表)&(链表I) return 0; 阅读详情

相关推荐

华中科技大学_基于链式存储结构实现线性表的基本运算

华中科技大学_实验报告_基于链式存储结构实现线性表的基本运算

数据结构复习之线性表的链式存储实现以及插入和删除,查找操作

数据结构复习之线性表的链式存储实现以及插入和删除,查找操作

wdandlzl的博客 2671

TensorRT-LLM环境配置避坑指南:从安装到实战

本文是一份详尽的TensorRT-LLM环境配置避坑指南。文章重点解析了从Python、CUDA、PyTorch版本选择,到解决mpi4py安装这一核心难题的完整流程,并提供了经过验证的稳定版本组合与实战排错方案,帮助开发者高效部署大语言模型推理优化环境。

a0b1c2d3的专栏 983

java实现链表作为存储结构,实现线性表的插入、删除、查找、排序、合并等操作

package list; public class LinkList { private Node head; //声明节点 public class Node{ private int data; private Node next; public Node(){ } public N...

CoderSan的博客 1116

如何用zemax导入solidworks装配体

在zemax使用中,常常需要导入各种零件。如果光机结构较为复杂,那么手工一个一个加载零件,还需要在zmx文件中调整object的位置,非常麻烦。如果能将solidworks的装配体模型直接导入,则可以大幅减小工作量。具体过程为(非序列模式下): 1、新建或打开一个zemax空文件 2、在元件编辑器中,找到一个空文件,双击或直接展开三角符,在类型中找到zemax里的solidworks装配体,如图。...

wojiaoyyy的博客 1万+

人形机器人触觉革命:压电式电子皮肤的多模态感知与自修复技术突破

本文深入探讨了压电式电子皮肤如何推动人形机器人的触觉革命。文章分析了其基于压电效应的多模态感知原理,能够灵敏检测压力、振动与温度,并重点介绍了赋予电子皮肤自修复能力的动态共价网络等前沿材料技术,从而极大提升了机器人与物理世界进行精细、安全交互的可靠性与智能化水平。

weixin_29251567的博客 194

线性表的链式存储结构 及其常用操作(单链表的创建、初始化、插入、删除、遍历、查找指向元素、单链表的销毁)c语言 数据结构 简单易懂 超详细~

#include<stdio.h> //链表结点 typedef struct node { int data; struct node* next; }node; node* creatlinknode(int n);//创建链式队列 void insertlinknode(node* head);//单链表的插入, //在数据域为num的结点之前插入一个结点 void deletelinknode(node* head, int num);//单链表的删除 //删除数据域尾num的结点 vo

weixin_54907221的博客 1322

Anki小白必看:手把手教你打造高颜值个性化笔记模板(附Leaflyer模板下载)

本文为Anki新手提供详细的个性化笔记模板设计指南,从基础配置到高级定制技巧,帮助用户打造高效记忆系统。特别推荐Leaflyer模板下载,通过视觉优化和功能强化,显著提升学习体验和记忆效率。

weixin_28717969的博客 433

【单链表】初始化、插入、删除、查找

单链表基本操作

qq_52639249的博客 2136

C++ 小游戏程序 (共七款)

C++编程小游戏_闪耀的天狼星的博客-优快云博客_游戏c++C++跑酷小游戏_闪耀的天狼星的博客-优快云博客。好玩的c++编程小游戏,共六款。代码】C++跑酷小游戏。

小天狼星_布莱克 的博客 3万+

什么是垂直同步?电脑快速消除屏幕撕裂与提升游戏性能的方法 垂直同步、游戏画面撕裂、游戏优化、VSync、FPS、FreeSync、G-Sync、显卡驱动更新、游戏画质、输入延迟

看这张动图,左边的画面出现了明显“切开”的断层现象,而右边画面非常流畅,没有撕裂。这正是「垂直同步」开关的区别。:每秒生成多少帧图像。比如 60FPS 表示一秒钟显示 60 张图片。刷新率(Refresh Rate):显示器每秒刷新几次画面,单位是赫兹(Hz)。60Hz 表示每秒刷新 60 次。参数说明FPS显卡渲染速度(逻辑帧率)刷新率显示器的显示频率(物理限制)当 FPS 高于刷新率时,显卡渲染的画面来不及被显示器显示,导致撕裂。屏幕撕裂(Screen Tearing)

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 1343

5639: 数据结构实验:顺序表操作

对以顺序存储结构存储的线性表,验证其建表、初始化、插入、删除、索引、查找、就地逆置、销毁等操作。 顺序表定义如下: typedef int Elemtype; typedef struct { Elemtype *data; int length; }SeqList; 部分代码已经给出,请补充完整,提交时请勿包含已经给出的代码。 C++ //打印 void PrintSeqList(SeqList &L) { int i; for(i=0;i<L.length;i++) { if(i) p

qq_44318931的博客 940

生物量预测:基于Swin-Unet模型的生物量模型预测

本文提出了一种基于Swin-Unet架构的多源遥感地上生物量(AGB)预测方法。该方法整合了光学影像、SAR雷达影像、气候环境参数以及地形数据(坡度和坡向)等多源信息,通过24个输入通道(13+2+7+1+1)构建预测模型。研究采用Min-Max归一化预处理数据,并使用80%训练集、16%验证集和20%测试集的划分策略。模型基于Swin-Unet 2D架构,设置64个初始滤波器、4层深度、4×4堆叠数和2×2补丁大小。该方法通过整合多源遥感数据和先进深度学习架构,为AGB反演提供了新的解决方案。

此星光明博客 61

实验报告 线性表的基本操作及应用(单链表的创建,插入、删除、查找和打印算法)

1.实验名称 线性表的基本操作及应用 2.实验目的 (1)掌握单链表的创建,插入、删除、查找和打印算法; (2)运用线性表解决线性结构问题。 3.实验内容 基本要求: (1)实现单链表的创建;(2)实现单链表的插入;(3)实现单链表的删除 (4)实现单链表的查找;(5)实现单链表的显示; 选作内容: 两个线性表合并算法的实现。已知顺序表LA和LB中的数据元素按值非递减有序排列,现要将LA和LB归并为一个新的顺序表LC,且LC中的数据元素仍按值非递减有序排序。例如:LA=(3,5,8,11) LB=(2,6

绿色水杯 5835

真格量化——GFTD策略

#!/usr/bin/env python # coding:utf-8 from PoboAPI import * import datetime import numpy as np import math #开始时间,用于初始化一些参数 def OnStart(context) : print "I\'m starting..." #设置全局变量 g.signalcount = 0 g.signal_list = [] g.buysignal = 0 .

qq_26742269的博客 1284

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

【数据结构】线性表(三)循环链表的各种操作(创建、插入、查找、删除、修改、遍历打印、释放内存空间)

本文介绍了循环链表的各种操作,主要包括:循环链表的创建,在表尾插入节点,查找、删除、修改指定节点的值,打印循环链表,释放循环链表内存空间

天地玄黄 魑魅魍魉 风花雪月 商角徵羽 2214

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

线性表的基本操作及应用(单链表的创建、插入、删除、查找、显示)

1.实现单链表的创建;2.实现单链表的插入;3.实现单链表的删除;4.实现单链表的查找;5。实现单链表的显示 #include <stdio.h> #include <stdlib.h> #define OK 1 #define ERROR 0 typedef int Status; typedef float ElemType; //线性表的单链表存储结构 type...

糖哲睿的博客 5338

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

线性表的链式存储格式基本操作:创建链表、插入、删除、查找、求表长、打印链表

#include<iostream> #include<stdlib.h> using namespace std;typedef struct LNode{ int data; struct LNode *next;//next为指针域,存放其后继结点的地址。 }LNode,*LinkList;//采用头插法建立单链表 LinkList CreatList1(LinkList &L

wangtiankuo的博客 4210

线性表(单链表)的存储结构和基本操作(初始化,创建,取值,查找,插入,删除)

在单链表中,对于数据元素来说,除了存储其本身的信息外,还需要存储有关于其直接后继的信息(直接后继的存储位置),这两部分信息组成数据元素的存储映像,称为结点,它包括两个域,存储数据元素信息的域称为数据域,存储直接后继存储位置的域称为指针域。

m0_74472474的博客 1108

【C++数据结构与算法基础篇 -1】C++实现线性表的插入、删除、查找等操作

实现线性表的插入、删除、求表长、查找给定值 e、查找第 i 个位置元素等基本操作,要求编写的程序以菜单方式工作;用链式存储结构实现一元多项式的相加运算;利用双向链表实现通讯录的建立、删除、检索和列表,并可保存至文件,可重新装入

2301_76761656的博客 1680

数据结构单链表线性表创建插入查找显示判断是否为空删除C语言描述算法

未命名数据结构单链表线性表创建插入查找显示判断是否为空删除C语言描述算法

c673929079的博客 1883

数据结构——顺序表和链表的代码实现及算法思路

线性结构顺序表和链表的实现及各种操作合集一级目录线性表顺序储存的实现结构体的定义顺序表的初始化插入操作删除操作按值查找应用举例删除自第i个元素开始的k个元素链表的实现不含头结点的链表的实现结构体定义线性表的创建线性表的长度计算按序号查找按值查找插入操作删除操作应用举例俩有序链表的合并 一级目录 线性表顺序储存的实现 结构体的定义 const int MAX_SIZE=10; struct Sepl...

qq_45768060的博客 2947

数据结构与算法---复习:线性表(链表形式)

数据结构与算法—复习:线性表(链表形式) 各种方法是可以巧妙利用的,例如,原来在链表中的删除操作,需要指定p,q两个指针,一个指向当前元素,一个指向之前元素,当 当前元素发现了要删除的元素时,之前元素即可执行地址调换的操作,删除结点,本程序中,将寻找前驱结点写成了一个方法,同时写了根据数据值,找到结点的方法,利用这两个方法,可以很直观的写出删除操作。 /** * 程序说明:线性表的链接实现 * 1.创建空链表 * 1.5 .增加链表长度,设置缺省值0 * 2.判断链表是否为空 * 3.求单链表中某

weixin_43990171的博客 200

数据结构——线性表的链式存储

如图中的listnode A 它的存储位置是在栈上,用A去访问结构体的data是A.data=value;用p则是还有一种是存放在推上的,如下。

2202_75840803的博客 688

C语言用线性表写链表的查找,求高手用C写一段线性表的顺序存储(包括创建,插入,删除和查找),不用很复杂,最简单的就可以了!...

满意答案phoenix92022014.05.17采纳率:49%等级:12已帮助:14246人#include /* malloc()等 */#include /* EOF(=^Z或F6),NULL */#include /* atoi() */#include /* eof() *//* 函数结果状态代码 */#define TRUE 1#define FALSE 0#define OK...

weixin_36145673的博客 116

数据结构—线性表(Java、C双语言实现)

线性表 由零个或多个组成的有限序列。首先他需要是序列,当元素有多个的时候,第一元素无前驱,最后一个元素无后继,其余每个元素都有唯一的前驱和后继。线性表中每个数据元素可以由若干个数据项组成。 线性表的顺序存储 用一段连续的存储单元,依次存储线性表中的数据元素。 线性表的链式存储 用一组任意的存储单元存储线性表的数据元素,这写存储单元可以是连续的也可以是不连续的,每个节点除了存储数据

匆匆那些年 795
上一篇: 线性表(顺序表)的查找、新增、和删除
下一篇: 栈的顺序存储实现-简单的进栈及出栈
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值