静态链表和动态链表的创建使用 C语言与python实现

链表数据结构:核心概念、实现与应用全解析 链表作为基础数据结构中的重要成员,采用非连续的链式存储方式实现动态内存管理。其核心由数据域和指针域构成的节点组成,通过指针关联形成线性结构。相比数组,链表在插入删除操作上具有O(1)时间复杂度优势,但随机访问效率较低。这种特性使其特别适合频繁修改的场景,如操作系统任务调度、内存池管理等。在工程实践中,链表衍生出单链表、双链表和循环链表等多种变体,并广泛应用于Redis跳表、LRU缓存等系统设计。理解链表操作原理对掌握指针操作和内存管理至关重要,是算法面试和性能优化中的高频考点。 阅读详情

题目,以录入三个学生的成绩,学号为目的,创建链表

(1)C语言(静态链表)

// 静态链表
/*
    所以的节点都是在程序中定义的,不是临时开辟的,
    也不能在用完后释放空间,这种称为静态链表
*/

# include <stdio.h>

// 声明结构体
struct Student
{
    long int num;
    float score;
    struct Student * next;  // next 指针
};

int main()
{
    // 定义结构体变量3个
    struct Student s1, s2, s3, * head, *p;
    // 数据赋值
    s1.num = 10101; s1.score = 89.5;
    s2.num = 10102; s2.score = 90;
    s3.num = 10103; s3.score = 85;
    // 头指针
    head = &s1;
    // next 指针
    s1.next = &s2; s2.next = &s3; s3.next = NULL;
    // p 指针用于循环遍历, 指向链表首元素
    p = head;
    
    // 循环输出
    do 
    {
        printf("%ld %5.1f\n", p->num, p->score);
        p = p->next;
    }while(p != NULL);
    printf("已打印完链表所有信息!\n");
    return 0;
}

(2)C语言(动态链表)

// 动态链表
/* 
    是指在程序中,从无到有的建立一个链表,
    既一个一个地开辟节点和输入各节点的数据,并建立起前后相连的关系。
*/


# include <stdio.h>
# include <stdlib.h>

// 先定义出来开辟空间大小,既结构体大小
# define  LEN sizeof(struct Student)

struct Student 
{
    long num;
    float score;
    struct Student * next;
};

int n = 0;

// 定义函数,返回head指针, 既返回指向链表头的指针
struct Student * create(void)
{
    struct Student *p1, *p2, *head;  // p1 表示下一个元素,p2 表示当前元素
    // 定义输入第一个节点数据
    p1 = p2 = (struct Student * )malloc(LEN);
    printf("请输入学生信息:\n");
    scanf("%d, %f", &p1->num, &p1->score);
    // 空链表。头指针为NULL
    head = NULL;

    // 默认输入数据 为0,结束输入
    while(p1->num != 0)
    {
        n += 1;
        if (n==1) head=p1;
        else p2->next=p1;

        p2 = p1;
        p1 = (struct Student * )malloc(LEN);
        printf("请输入学生信息\n");
        scanf("%d, %f", &p1->num, &p1->score);
    }
    p2->next = NULL;
    return head;
}

int main()
{
    struct Student * h;
    h = create();
    printf("num == %ld\n, score == %5.1f\n", h->num, h->score);
    return 0;
}


python实现

  • 针对python的,我使用字典来实现
  • 很有意思,对数据字段进行了 限制,并且增加了迭代器循环输出
  • 也可以将 Node类进行改造为单例,这里我没有继续下去~
# 因为字典的键可以是任意类型的,但是我们希望 键是 数值型的,整形或者浮点型,所以定义数据描述器限制

# 因为可能多个字段需要定义 约束 我们先设计一个外键约束的 基类,简化后续
class BaseField():

    def __init__(self, attrname):
        self.attrname = attrname

    def __get__(self, instance, owner):
        return getattr(instance, self.attrname)

    def __set__(self, instance, value):
        setattr(instance, self.attrname, value)

    def __delete__(self, instance):
        raise Exception('can not delete email')


import re
class NumField(BaseField):
    NUM_MOD = re.compile('^\d{4,6}$')

    def __set__(self, instance, value):
        if not self.NUM_MOD.match(value):
            raise Exception('请输入有效格式学号!')
        setattr(instance, self.attrname, value)


class ScoreField(BaseField):

    def __set__(self, instance, value):
        if not (0 <= value and  value <= 100):
            raise Exception('{}错误!成绩为 0-100,请重新输入!'.format(value))
        setattr(instance, self.attrname, value)


# 以 字典作为节点, 定义相关节点的操作
class Node():
    num = NumField("_num")
    score = ScoreField("_score")
    def __init__(self, num, score):
        self.num = num
        self.score = score
        self.node = {
            'num': '00001',
            'score': 0,
            'next': None
        }

# 定义链表
class lianbiao():
    # 类属性是 节点类 Node
    node = Node

    def __init__(self):
        self.head = None
        self.p1 = self.p2 = None
        # n 可表示 链表长度, 设置为私有属性,不允许外部更改
        self.__n = 0
        # 用来实现迭代器
        self.i = 1


    # 定义相关操作函数
    # 增加节点
    def create(self, num='00001', score=0, next=None):        
        self.__n += 1
        # 实例方法 访问类属性
        a = self.node(num, score)
        a.node['num'] = a.num
        a.node['score'] = a.score

        # 下面的逻辑和 C语言的是相同的
        self.p1 = a.node

        if self.__n == 1:
            self.head = self.p1
        else:
            self.p2['next'] = self.p1

        self.p2 = self.p1

    # 实现迭代器方便遍历
    def __iter__(self):
        # 每次调用迭代器 都要将这两个变量 初始化,因为循环一次后, i 值可能为 8, 下次还会从8开始! 包括p1,同理
        self.p1 = self.head
        self.i = 1
        return self

    def __next__(self):
        # 必须重新定义变量,若直接使用头指针,遍历结束将改变 头指针的指向
        if self.i == 1:
            self.i += 1
            return self.p1
        else:
            self.p1 = self.p1['next']
            if self.p1 != None:
                self.i += 1
                return self.p1
            else: 
                raise StopIteration

    # 输出数组长度, 定义为属性
    @property
    def length(self):
        return self.__n

lian = lianbiao()
# python 3.6 不支持表达式赋值
i = 1
while (i < 3):
    i += 1
    print("请输入数据: 学号5位数字组成, 成绩0-100分")
    a = input()
    b = input()
    b = int(b)
    lian.create(a, b)


# head = lian.head
# for i in range(lian.length):
#     print(head)
#     head = head['next']
#     if head == None:
#         break


# 生成迭代器后这样遍历
for i in lian:
    print(i)


2、线性表 转载地址:线性表的一些基本知识点 线性表的一些基本知识点 线性表是一种典型的线性结构。头结点无前驱有一个后继,尾节点无后继有一个前驱。链表只能顺序查找,定位一个元素的时间为O(N),删除一个元素的时间为O(1)。 1、线性表的顺序存储结构 把线性表的结点按逻辑顺序依次存放在一组地址连续的存储单元里。用这种方法存储的线性表简称顺序表。是一种随机存取的存储结构。顺序存储指内存地址是一块的,随机... 阅读详情

相关推荐

Python实现结构体代码实例

主要介绍了Python实现结构体代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

C语言实现通讯录制作-链表学习案例(C/C++)

使用单链表完成的通讯录小项目制作,文章只是算法思想和如何做的的一种总结,完整的源码在我的资源中获取,最主要的目的是学习单链表的数据结构

EMCred的博客 4638

【遥感数字图像处理(朱文泉)】各章博文链接汇总及思维导图

遥感数字图像处理(北京师范大学朱文泉教授)课程各章博文笔记汇总,及各章节思维导图

甜子yu的博客 2621

【C语言】通讯录,用动态链表实现

C语言数据结构的学习,用动态链表实现的通讯录

jiangfengfeng222的博客 831

南大计算机2024保研笔试:编译原理等5门专业课考点分布与408复习避坑指南

本文详细解析了南京大学计算机2024保研笔试的考点分布与复习策略,重点突出编译原理(占比28%-32%)和离散数学的特色考核。提供跨课程复习方法、真题题型分析及高效备考建议,帮助考生突破传统408框架,应对南大独特的命题风格。

weixin_29304985的博客 342

PSCAD通过python调用自动化库的实现

带有python脚本的pscad自动化PSCAD通过python调用自动化库的实现前期准备实现 PSCAD通过python调用自动化库的实现 在网上搜了一圈没有找到,通过油管的一个视频学到了,这里分享一下。 前期准备 下载PSCAD 在官方文档中建议PSCADV4.6.1及以上版本 下载python python这里没注明哪些版本可用,博主下载了最新的3.8.2使用正常。 下载IDE py...

橙子的博客 5911

用c语言链表实现信息的存储,C/C++用动态链表实现对学生信息的存储

/************************************************************************//* 此程序是运用动态内存分配的手段来实现用链表的方式存储学生相关信息的。链表,是一种自定义数据类型。在使用结构体数组或结构体指针存储复杂数据类型时需要较大的连续的内存空间,若无需要长度的连续空间会致使操作失败,并且使用结构体数组或结构体指针时在删除或...

weixin_29762229的博客 1965

S32DS IDE调试技巧:如何用Attach功能高效定位汽车电子MCU的Bootloader问题

本文详细介绍了在汽车电子MCU开发中,如何利用S32DS IDE的Attach调试模式高效定位Bootloader与应用程序的协同问题。通过对比常规调试与Attach模式的本质差异,并深入讲解工程配置、镜像合并及实战调试流程,帮助开发者在不复位、不重新下载程序的前提下,实时分析系统状态,快速解决内存映射冲突、中断向量表重定向等疑难杂症。

weixin_29168393的博客 265

动态链表的操作

void creat(List *&amp;L, int n)//创建{ List *s, *r; L = new List; L-&gt;next = NULL; r = L; for (int i = 0; i &lt; n; i++) { s = new List; cin &gt;&gt; s-&gt;data; r-&gt;next = s; r = s; } r-&gt;nex...

umalaka的博客 269

医学影像处理实战:如何用Python+SimpleITK搞定DICOM/NIfTI重采样(附完整代码)

本文详细介绍了如何使用Python和SimpleITK库实现医学影像(DICOM/NIfTI格式)的智能重采样技术。通过实战代码演示,帮助读者掌握医学图像处理中的关键步骤,包括环境搭建、数据准备、核心算法实现和质量验证,解决医学AI领域中的影像标准化难题。

linux的博客 981

知道LPDDR和DDR什么关系吗?

话不多说,先上大白话,一个网友总结的很好:简单地说DRR4是标准电压版的PC和服务器内存,LPDDR4属于手机等嵌入式移动设备使用的低电压低功耗内存,LPDDR4X则是LPDDR4的升级版,下面详细看看老哥的博客。LPDDR4是与DDR4内存等效的移动设备。。LPDDR4具有两个16位通道,从而使每个DIMM的总线总长度为32位。相比之下,DDR4每个DIMM具有64位通道。

叫好与叫座虽然不是对立面,但想在同一个作品中达到双重效果很难。 2805

python自测100题

如果你在寻找python工作,那你的面试可能会涉及Python相关的问题。 通过对网络资料的收集整理,本文列出了100道python的面试题以及答案,你可以根据需求阅读测试。 python基础 Q1.什么是Python? Python是一种面向对象的,交互式的,解释型的计算机程序设计语言。Python的设计具有高可读性,它使用英语关键词而非标点符号,语法结构也比其他语言简单。 Q2.Py...

石山下 1万+

使用 MATLAB/Simulink 构建一个分布式光伏-储能联合系统在配电网中的协同控制模型

本文介绍了使用MATLAB/Simulink构建分布式光伏-储能联合系统协同控制模型的方法。该系统包含光伏发电、储能、负荷和控制器等模块,通过协同控制实现能量优化管理。建模过程详细说明了从创建项目、搭建组件到实现控制策略的步骤,包括光伏特性模拟、储能参数设置和负荷需求建模。重点设计了协同控制器算法,实时调节电力分配,并展示了系统运行指标和经济效益分析。该方法为多能互补系统在配电网中的应用提供了技术验证,未来可进一步优化控制算法和场景适应性。

MHD0815的博客 309

静态链表(链表的游标实现)

C语言有指针,可以存储下一个位置的地址,而不是所有语言都有指针。为了让这些语言也实现像链表一样的功能。就有人想出来了用数组来实现的链表。 主要理解这种思想,不一定要会写。 #define MAXSIZE 1000 typedef int ElementType; typedef struct { ElementType data; int cur; }Component, StaticLinkList[MAXSIZE]; 初始化 空表是这样的,space是数组名 bool InitL.

CCPigSnail 707

N32G430学习笔记11- systick使用函数-延时函数

N32学习笔记11- systick使用函数-延时回调函数-延时函数

Car12 1416

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

python 双向链表_双向链表及创建(C语言)详解

目前我们所学到的链表,无论是动态链表还是静态链表,表中各节点中都只包含一个指针(游标),且都统一指向直接后继节点,通常称这类链表为单向链表(或双向链表(简称双链表)。从名字上理解双向链表,即链表是 "双向" 的,如图 1 所示:图 1 双向链表结构示意图双向,指的是各节点之间的逻辑关系是双向的,但通常头指针只设置一个,除非实际情况需要。从图 1 中可以看到,双向链表中各节点包含以下 3 部分信息(...

weixin_39852491的博客 117

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

【数据结构】【C/C++】链表基础知识,链表的结点定义、初始化、求长度、按序号取元素、按值查询元素、插入、删除、构造的算法实现,各种结构形式的链表(如双循环链表)

简单介绍了链表的结点定义、初始化、求长度、按序号取元素、按值查询元素、插入、删除、构造的算法实现。此外,介绍了几种其他形式的链表,如双循环链表的实现。

2301_80785232的博客 3239

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

静态链表实战:用数组模拟链表的完整实现(附避坑指南)

本文详细介绍了静态链表的完整实现方法,通过数组模拟链表的核心数据结构。文章提供了从初始化、节点分配到插入删除的全套代码模板,并重点剖析了游标边界处理等常见陷阱,帮助开发者深入理解链式结构的底层逻辑,尤其适合在无指针语言中实现高效数据操作。

pepsi的博客 437

静态链表实现

1,有些高级语言中没有“指针”数据类型,只能用数组来模拟线性链表的结构,数组元素中的指针“域”存放的不是元素在内存中的真实地址,而是在数组中的位置。这样的链表 称为静态链表。 2,静态链表是用数组实现的,是顺序的存储结构,在物理地址上是连续的,而且需要预先分配大小。动态链表是用申请内存函数(C是malloc,C++是new)动态申请内存的,所以在链表的长度上没有限制。动态链表因为是动态

记录每一个小阶段的学习心得,持之以恒! 1298

链表基础(python实现)

内存分配:链表不需要连续内存空间,适合动态增长指针操作:指针的指向关系是链表操作的关键边界处理:特别注意空链表、头节点、尾节点的处理时间复杂度访问:O(n)插入/删除(已知位置):O(1)插入/删除(需要查找):O(n)应用选择频繁插入删除:选择链表频繁随机访问:选择数组需要双向遍历:选择双向链表。

weixin_43332559的博客 386

数据结构 C 语言实现:顺序表与链表 10 大操作时间复杂度对比与选择指南

本文深入对比了顺序表与链表在C语言实现中的10大核心操作时间复杂度,包括随机访问、插入删除等关键操作。通过详细分析两者的存储结构差异和性能特点,提供了基于实际应用场景的数据结构选型指南,帮助开发者优化代码效率。特别适合需要深入理解数据结构底层实现的程序员参考。

cuxiong8996的博客 451

数据结构与算法(转)

原 算法-合并两个排序的链表 题目: 输入两个递增排序的链表,合并着两个链表并使新链表中的结点仍然是按照递增顺序的。例如输入的链表1和链表2如下,合并后的为链表3。链表的结点定义如下: struct ListNode { int value; ListNode *next...

monk1992的博客 182

链表数据结构:原理、实现与工程实践

链表是计算机科学中的基础数据结构,采用节点通过指针链接的方式实现动态存储。相比数组的连续内存分配,链表通过指针域实现非连续存储,在插入删除操作上具有O(1)时间复杂度优势,特别适合内存碎片化场景。其核心实现涉及节点设计、内存管理和边界条件处理,在操作系统内核、算法竞赛和业务系统中都有广泛应用。通过快慢指针、哨兵节点等技巧可以优化链表操作,而Linux内核链表则展示了工业级实现方案。理解链表的工作原理对掌握动态内存管理和指针操作至关重要,是提升编程能力的必经之路。

weixin_30247781的博客 405

链表数据结构详解:从原理到Python实现,掌握高效增删操作

数据结构是计算机科学中组织与管理数据的核心基础,它决定了数据存储与操作的效率。链表作为一种基础且重要的线性数据结构,其核心原理在于通过指针(或引用)将离散的节点串联起来,每个节点包含数据域和指向下一个节点的指针域。相比于数组的连续内存存储,链表在内存中是非连续分布的,这一特性使其在频繁进行插入和删除操作的场景下具有显著优势,无需像数组那样移动大量元素,只需修改相邻节点的指针指向即可。这种动态、灵活的特性,使其在实现队列、管理历史数据版本(如数据仓库中的拉链表)、处理具有复杂依赖关系的配置(如项目依赖管理)以

weixin_34345753的博客 295

蓝桥杯链表题精解:从小王子链表看单向链表核心操作与解题框架

链表是数据结构中的基础线性结构,它通过节点和指针实现动态存储,与数组的连续存储有本质区别。其核心原理在于利用指针(或引用)连接离散的节点,形成逻辑上的顺序关系,这种特性使其在插入和删除操作上具有高效性。理解链表的遍历、插入、删除和反转等基本操作,是掌握更复杂数据结构与算法的关键。在工程实践和算法竞赛中,链表常被用于实现队列、栈、邻接表等,并频繁出现在如蓝桥杯等算法赛题中。本文以典型的“小王子链表”场景题为切入点,系统拆解了单向链表在算法竞赛中的高频考点,如节点操作顺序、边界处理,并提供了包含哑节点技巧的通用

weixin_30797199的博客 425

Python 新手刚学链表,做了一个“捣浆糊”版的单链表类

链表定义 链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。 单向链表,又叫单链表、单向表,是由一个个节点组成的,每个节点是一种信息集合,包含元素本身以及下一个节点的地址。节点在内存中是非连续分布的,在程序运行期间,根据需要可以动态的创建节点,这就使得链表的长度没有逻辑上的限制,有限制的是堆的大小。 在单向链表中,每个节点中存储着下一个节点的地址。基于单向链表,在每个节点内增加一个前驱节点的地址,这就是所谓的双向链表,又叫双链表、双向表。

汉阳Hann's Home 1128
上一篇: 汉诺塔问题(Hanoi) C语言与Python实现
下一篇: 判断 矩阵对角线元素相等
我是py呀
博客等级 码龄8年 205粉丝 130原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值