单链表的实现

用PHP实现的单链表 单链表顾名思义就是一个链式数据结构,它有一个表头,并且除了最后一个节点外,所有节点都有其后继节点。如下图。 首先,我们写出链表节点的类。单链表中的每一个节点,都保存其数据域和后驱指针 //链表节点 class node { public $id; //节点id public $name; //节点名称 public $next; //下一节点 阅读详情

1、链表的相关概念
链表作为一种十分常见的数据结构,其应用范围也是极其广泛的,书上,网上我们能看到许多的链表程序,但是自己用着是不习惯的,并且很多地方可能不完善,所以通过自己来实现这个程序,链表是一种线性表,但是并不会按线性的链表是一种物理存储单元上非连续、非顺序表的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的,。链表由一系列结点(链表中的每个元素称为结点)组成,结点可以在运行时动态生成,每个节点包括两部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域,相比于线性顺序表结构,操作复杂。由于不必须按顺序存储,链表在插入的时候可以达到O(1)的复杂度,比另一种线性表顺序表快得多,但是查找一个节点或者访问特定编号节点则需要O(n)的时间,而线性表顺序表相应的时间复杂度是O(logn)和O(1)
链表总共有八种:我们根据是否有头结点、有环无环,单链表、双链表排列组合之后重点内容就得到了8种,我们今天就来实现下这种单向的不带环不带头的单链表。
test.h的相关代码如下

#define _CRT_SECURE_NO_WARNINGS
#pragma once
//单向的不带环不带头链表
#include <stdio.h>
#include <stdlib.h>

//单向链表
//1、next=NULL
//2、next=
typedef char LinkNodeType;

typedef  struct LinkNode{
    LinkNodeType data;
    struct LinkNode* next;//只有一个指针指向下一个元素,单向链表
}LinkNode;
typedef LinkNode* PLinkNode;
void LinkListInit(LinkNode* node);
//void LinkListDestroy(LinkNode** phead);
void LinkListPushBack(LinkNode** phead, LinkNodeType value);//尾插
void LinkListPrintChar(LinkNode* head,const char* msg);//打印链表函数
void LinkListPopBack(LinkNode** head);//尾删
void LinkListPushFront(LinkNode** phead, LinkNodeType value);//头插
void LinkListPopFront(LinkNode** phead);//头删
LinkNode* LinkListFind(LinkNode* head, LinkNodeType to_find);//查找元素在链表中的位置,
                                          //to_find要查找的值,return这个值对应的节点的地址
void LinkListInsert(LinkNode** head, LinkNode* pos,LinkNodeType value);//在pos之前插入元素
void LinkListInsertAfter(LinkNode** head, LinkNode* pos, LinkNodeType value);//在pos之后插入元素
//void LinkListErase(LinkNode** head, LinkNode* pos);//删除指定位置的元素
//void LinkListErase2(LinkNode** head, LinkNode** pos);//删除指定位置的元素
void LinkListRemove(LinkNode** head, LinkNodeType to_delete);//删除指定值的元素
//void LinkListRemoveAll(LinkNode** head, LinkNodeType to_delete);//删除指定值的所有元素都删掉
int LinkListEmpty(LinkNode* head);//判断链表是否为空,链表为空返回1,否则返回0
size_t LinkListSize(LinkNode* head);//求链表中元素的个数

test.c 的代码如下:

#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include "test.h"

void  LinkListInit(LinkNode** node){
    *node = NULL;
}
void LinkListPrintChar(LinkNode* head, const char* msg){
    //打印链表函数
    printf("[%s]\n", msg);
    LinkNode* cur = head;
    for (; cur != NULL; cur = cur->next){
        printf("[%c|%p] ", cur->data, cur);
    }
    printf("\n");

}
LinkNode*  CreateNode(LinkNodeType value){
    LinkNode* new_node = (LinkNode*)malloc(sizeof(LinkNode));
        new_node ->data = value;
        new_node->next = NULL;
        return new_node;

}
void LinkListPushBack(LinkNode  **phead, LinkNodeType value){
    if (phead == NULL){
        //非法输入
        return;
    }
    if (*phead == NULL){
        //空链表
        *phead = CreateNode(value);
        return;
    }
    //链表非空时候代码如下:
    LinkNode* cur = *phead;
    while (cur->next != NULL){
        cur = cur->next;//便利之后,取下一个元素的地址
    }
    LinkNode* new_node = CreateNode(value);
    cur->next = new_node;
    return;
}
void Destroynode(LinkNode *node){
    free(node);
}
void LinkListPopBack(LinkNode** phead){//因为在删除的时候要考虑只有一个元素时,头指针的指向会改变的
    if (phead == NULL){
        //非法输入
        return;
    }
    if (*phead == NULL){
        //空链表,不能删除
        return;
    }
    if ((*phead ==NULL)){
        //只有一个元素
        Destroynode(*phead);//销毁函数,可提高代码的维护性
        *phead = NULL;//必须要进行释放,不然会造成内存泄漏,所以必须用free释放
        //在这里为了代码的美观,所以必须要调用Destroynode函数
    }
    //先定义一个指针cur,要知道删哪个,还得知道前一个,让它的next指向空,再定义一个pre指针,指向cur的前一个元素。
    //很多节点时,初始状态先让pre指向空指针,cur指向第一个元素,判断cur是不是最后一个结点,不是的话,让pre指向cur
    //,cur立即指向下一个元素,最后cur指向最后一个元素,pre指向倒数第二个元素,然后cur释放,pre的next指向NULL
    LinkNode* cur = *phead;
    LinkNode* pre = NULL;
    while (cur->next != NULL){
        pre = cur;
        cur = cur->next;
    }
    //当循环结束pre指向倒数第二个结点,cur指向最后一个结点
    pre->next = NULL;
    Destroynode(cur);//为了代码的扩展性,万一在写代码的过程中,万一结点保存的不是int,char....,
    //而是由malloc开辟出来的,在Destroy中就必须free(node->data);
    return;
}
void LinkListPushFront(LinkNode** phead, LinkNodeType value){
    //头插
    if (phead == NULL){
        //非法输入
        return;
    }
       LinkNode* new_node = CreateNode(value);
        new_node->next = *phead;
        *phead = new_node;
}
void LinkListPopFront(LinkNode** phead){
    //头删
    if (phead == NULL){
        return;
    }
    if (*phead == NULL){
        return;
    }
    LinkNode* to_earse = *phead;
    *phead = (*phead)->next;
    Destroynode(to_earse);
    return;
}
LinkNode*  LinkListFind(LinkNode* head,LinkNodeType to_find)//查找元素在链表中的位置,
    //to_find)要查找的值,return这个值对应的节点的地址
{
    if (head == NULL)    //空链表  
    {
        return;
    }
else
    {
        LinkNode* cur = head;
        while (cur)  //遍历链表  
        {
            if (cur->data == to_find)
            {
                return cur; //当cur结点的元素等于我们要寻找的元素时,返回cur结点的地址  
            }
            cur = cur->next;
        }
        return;
    }

    }
void LinkListInsert(LinkNode** head, LinkNode* pos, LinkNodeType value)//在pos之前插入元素
//pos 指的是节点指针,pos为空表明的是没有这个节点
{
        if (head == NULL||pos==NULL){
            return;
        }
        if (*head == pos){//出现一个元素
            LinkListPushFront(head,value);
            return;
       }
        LinkNode* cur = *head;
        while (cur!=NULL)
        {
            if (cur ->next== pos)
            {
                LinkNode* new_node = CreateNode(value);
                cur->next = new_node;
                new_node->next = pos;
                return;
            }
            cur = cur->next;
        }
}
//在这里还有一种版本的实现那就是创造一个新的节点,将pos里的值给他,调用 LinkListInsert(pos,pos->data)
//pos->data = value;

void LinkListInsertAfter(LinkNode** head, LinkNode* pos, LinkNodeType value)//在pos之后插入元素
{
    if (head == NULL || pos == NULL){
            return;
        }
    LinkNode* new_node = CreateNode(value);//LinkNode* new_node = CreateNode(pos->data);
    new_node->next = pos->next;            // new_node->next = pos->next;
pos->next = new_node;                        //pos->next=new_node ;
                                             //pos->data=value
//在这里还有一种版本的实现那就是创造一个新的节点,将pos里的值给他,调用 LinkListInsert(pos,pos->data)
//pos->data = value;在pos之前插入元素

}
void LinkListErase(LinkNode** head, LinkNode* pos)//删除指定位置的元素
{
    if (head == NULL || pos== NULL){//非法输入
        return;
    }
    if (*head == NULL)
    { //空链表不能删除
        return;
    }
    LinkNode* cur = *head;
    for (; cur != NULL; cur = cur->next)
    {
        if (cur->next == pos){
            break;
        }
     }
    //循环结束之后,要取判定到底是找到了退出的,换是没找到退出的
    cur->next = pos->next;
    Destroynode(pos);
        return;
}

void LinkListErase2(LinkNode** head, LinkNode* pos)//删除指定位置的元素
{
//删除后面的元素,将后面的值给指定pos处,再将后面的值删除,
    if (head == NULL || pos == NULL){//非法输入
        return;
    }
    if (*head == NULL)
    { //空链表不能删除
        return;
    }
    if (pos->next == NULL){//要删除的是最后一个元素
        LinkListPopBack(head);
        return;
    }
    pos->data = pos->next->data;
    LinkNode* to_erase = pos->next;
    pos->next = to_erase->next;
    Destroynode(to_erase);

}
void LinkListRemove(LinkNode** head, LinkNodeType to_delete)//删除指定值的元素
{
    if (head == NULL){
        return;
    }
    if (*head == NULL){
        return;
    }
    LinkNode* pos = LinkListFind(*head, to_delete);
    LinkListErase(head, pos);
}
void LinkListRemoveAll(LinkNode** head, LinkNodeType to_delete)
//删除指定值的所有元素都删掉
{
    if (head == NULL){
        return;
    }
    if (*head == NULL){
        return;
    }
    LinkNode* cur = *head;
    while (cur!= NULL)
    {
        LinkListErase(head, (LinkListFind(*head, to_delete)));
        cur = cur->next;
        if (cur->next==NULL)//如果最后一个要删除的元素,cur->next 也为空的话,最后一个元素就不能被删除了,需要重新
            //判断这个元素是不是要删除的元素。
        {
            LinkListErase(head, (LinkListFind(*head, to_delete)));
            return;
        }
    }
    return;

}

int LinkListEmpty(LinkNode* head)//判断链表是否为空,链表为空返回1,否则返回0
{
    return  (head->next == NULL) ? 0 : 1;
}
size_t LinkListSize(LinkNode* head)// 求链表中元素的个数
{
    if (head == NULL){
        return;
    }
    size_t count = 0;
    LinkNode* cur = head;
    while (cur != NULL){
        ++count;
        cur = cur->next;
    }
    return count;
}

测试代码如下:

#define _CRT_SECURE_NO_WARNINGS
#include "test.h"
//////////////////////////////////////////////
////////////////以下为测试代码///////////////
////////////////////////////////////////////
#if 1
#include <stdio.h>
#define TEST_HEADER printf("\n===============%s================\n",__FUNCTION__);

void testinit(){
    TEST_HEADER;
    LinkNode* head;
    LinkListInit(&head);
}
void test1(){
    TEST_HEADER;
    LinkNode* head;
    LinkListInit(&head);
    LinkListPushBack(&head, 'a');
    LinkListPushBack(&head, 'b');
    LinkListPushBack(&head, 'c');
    LinkListPushBack(&head, 'd');
    LinkListPushBack(&head, 'e');
    LinkListPrintChar(head,"尾插四个元素");//用head是因为不需要修改头指针的指向
    LinkListPopBack(&head);
    LinkListPopBack(&head);
    LinkListPrintChar(head, "删除空链表");
    LinkListPrintChar(head,"删除两个元素");//不需要修改头指针指向
}
void test2(){
    TEST_HEADER;
    LinkNode* head;
    LinkListInit(&head);
    LinkListPushFront(&head, 'a');
    LinkListPushFront(&head, 'b');
    /*LinkListPushFront(&head, 'c');
    LinkListPushFront(&head, 'd');
    LinkListPushFront(&head, 'e');*/
    LinkListPrintChar(head,"插2");//用head是因为不需要修改头指针的指向
}
void test3(){
    TEST_HEADER;
    LinkNode* head;
    LinkListInit(&head);
    //LinkListPushBack(&head, 'a');
    //LinkListPushBack(&head, 'b');
    //LinkListPushBack(&head, 'c');
    //LinkListPushBack(&head, 'd');
    //LinkListPushBack(&head, 'e');
    LinkListPopFront(&head);//头删
    LinkListPrintChar(head, "删除一个元素");//不需要修改头指针指向

}
void test4(){
    TEST_HEADER;
    LinkNode* head;
    LinkListInit(&head);
    LinkListPushBack(&head, 'a');
    LinkListPushBack(&head, 'b');
    LinkListPushBack(&head, 'c');
    LinkListPushBack(&head, 'd');
    LinkListPushBack(&head, 'e');
    LinkNode* pos_x = LinkListFind(head,'x');
    printf("pox_x expect is NULL,actual %p\n", pos_x);
    LinkNode* pos_e = LinkListFind(head, 'e');
    printf("找到结点的地址为:%p\n", head->next,pos_e);
}
void test5(){
    TEST_HEADER;
    LinkNode* head;
    LinkListInit(&head);
    LinkListPushBack(&head, 'a');
    LinkListPushBack(&head, 'b');
    LinkListPushBack(&head, 'c');
    LinkListPushBack(&head, 'd');
    LinkListPushBack(&head, 'e');
    LinkListPrintChar(head, "不插入元素");
    LinkNode* pos = head->next->next;
    LinkListInsert(&head, pos, ' x');
    LinkListPrintChar(head, "插入一个元素");
}
void test6(){
    TEST_HEADER;
    LinkNode* head;
    LinkListInit(&head);
    LinkListPushBack(&head, 'a');
    LinkListPushBack(&head, 'b');
    LinkListPushBack(&head, 'c');
    LinkListPushBack(&head, 'd');
    LinkListPushBack(&head, 'e');
    LinkListPrintChar(head, "不插入元素");
    LinkNode* pos = head->next;
    LinkListInsertAfter(&head, pos, ' x');
    LinkListPrintChar(head, "插入一个元素");
}
void test7(){
    TEST_HEADER;
    LinkNode* head;
    LinkListInit(&head);
    LinkListErase(&head,(LinkNode*)0x11);
    LinkListPrintChar(head, "删除空链表");
    LinkListPushBack(&head, 'a');
    LinkListPushBack(&head, 'b');
    LinkListPushBack(&head, 'c');
    LinkListPushBack(&head, 'd');
    LinkListPushBack(&head, 'e');
    LinkNode* pos = head->next;
    LinkListErase(&head, pos);
    LinkListPrintChar(head, "删除一个元素b");
    /*LinkNode* pos = head->next->next;
    LinkListErase(&head, pos);
    LinkListPrintChar(head, "删除一个元素c");*/

}
void test8(){
    TEST_HEADER;
    LinkNode* head;
    LinkListInit(&head);
    LinkListPushBack(&head, 'a');
    LinkListPushBack(&head, 'b');
    LinkListPushBack(&head, 'c');
    LinkListPushBack(&head, 'd');
    LinkListPushBack(&head, 'e');
    LinkNode* pos = head->next;
    LinkListErase2(&head, pos);
    LinkListPrintChar(head, "删除一个元素b");
}

void test9(){
    TEST_HEADER;
    LinkNode* head;
    LinkListInit(&head);
    LinkListRemove(&head, 'a');
    printf("删除a\n");
    LinkListPushBack(&head, 'a');
    LinkListPushBack(&head, 'b');
    LinkListPushBack(&head, 'c');
    LinkListPushBack(&head, 'd');
    LinkListPushBack(&head, 'e');
    LinkListPrintChar(head, "当前链表");
    LinkListRemove(&head, 'x');
    LinkListPrintChar(head, "删除x");
}
void test10(){
    TEST_HEADER;
    LinkNode* head;
    LinkListInit(&head);
    LinkListPushBack(&head, 'a');
    LinkListPushBack(&head, 'b');
    LinkListPushBack(&head, 'c');
    LinkListPushBack(&head, 'b');
    LinkListPushBack(&head, 'b');
    LinkListPrintChar(head, "当前链表");
    LinkListRemoveAll(&head, 'b');
    LinkListPrintChar(head, "删除b");
}

void test11(){
    TEST_HEADER;
    LinkNode* head;
    LinkListInit(&head);
    LinkListEmpty(&head);
    printf("%d\n");
    LinkListPushBack(&head, 'a');
    LinkListPushBack(&head, 'b');
    LinkListPushBack(&head, 'c');
    LinkListPushBack(&head, 'd');
    LinkListPushBack(&head, 'e');
    LinkListEmpty(&head);
    printf("%d\n");
}
void test12(){
    TEST_HEADER;
    LinkNode* head;
    LinkListInit(&head);
    LinkListPushBack(&head, 'a');
    LinkListPushBack(&head, 'b');
    LinkListPushBack(&head, 'c');
    LinkListPushBack(&head, 'd');
    LinkListPushBack(&head, 'e');
    LinkListPrintChar(head, "删除元素");
    size_t i=LinkListSize(head);
    printf("链表的长度为%d\n",i);
}
int main(){
    ///*testinit();
    //test1();*/
    //test2();
    //test3();
    // test4();
    //test5();
    //test6();
    //test7();
    //test8();
    //test9();
    test10();
    //test11();
    //test12();
    getchar();
    return 0;
}


#endif

这里就是我所有的链表实现,相关的一些重要的会在链表面试题中写出来的。

数据结构入门篇 之 【单链表】的实现讲解(附单链表的完整实现代码以及用单链表完成通讯录的实现代码) 阅读详情

相关推荐

多IMU车载GNSS/INS数据集及介绍

文章目录前言非常棒的GINS数据集采集轨迹采集时间MEMS IMU详细信息IMU测量值方程及相关误差建模参考噪声参数安装参数文件格式描述 前言 “本文作者感谢武汉大学多源智能导航实验室和牛小骥教授提供了本文所需的GNSS/INS数据集。” 本博文介绍数据集链接为多IMU车载GNSS、INS数据集,欢迎大家下载,由于是开源数据集,因此下载不需要积分 非常棒的GINS数据集 这是一套非常好的用于GNSS/INS组合导航应用的车载数据集,本数据集采集于湖北省武汉市一处工业园区,为开阔天空场景,GNSS R

十八与她的博客 6439

【单链表】单链表的删除

在有些应用中,允许线性表中存在值相同的数据元素。线性表的另一个删除操作listDeleteAll(SeqList *seqlist,dataType x)的功能是:删除线性表seqlist中所有等于x的数据元素。要求编写使用单链表实现上述功能的操作算法 题目分析:   题目很简单,我们只需要在遍历线性表seqlist的时候挨个和数据x比对,如果相同,删除当前结点就可以了,但恰恰在这里有一个小陷阱,废话不多说,直接上图 **************************************

chaim16的博客 1万+

【Qualcomm高通音频】音效调试_录音文件播放有杂音,如何定位原因?

一、录音播放数据处理过程介绍 (1)TX方向 麦克风(硅麦克风或者主机体麦克风)采集模拟音频信号,经过内部CODEC芯片中的adc转换为数字信号,在经过高通音频DSP处理音效后编码为wav/aac/amr/mp3等格式文件。 (2)RX方向 音频文件经过解码、重采样还原为pcm数据,经过DSP处理音效后送到内部CODEC,然后经过DAC转换为模拟信号,送到喇叭。 二、分析步骤 1...

crow_ch的博客 5971

实验3-带头结点的单链表

实验1: 1 /*编写函数void delx(linklist head, datatype x),删除带头结点单链表head中第一个值为x 的结点。 2 并构造测试用例进行测试。 3 */ 4 /**********************************/ 5 /*文件名称:lab3_01.c */ 6 /**********...

weixin_30502157的博客 2952

Snort源代码编译 _ 采坑之旅(for Windows VS2015)

    系统环境:Windows7 sp1 x64     编译环境:VS2015 SP1     Snort版本:2.9.12     daq版本:2.0.6     Snort官网:https://www.snort.org/downloads#snort-downloads 背景     最近需要实现一个类似网络防火墙的产品,主要参考Snort源码,先花了点时间简单读了下网上比较流行的《...

magictong的专栏 8888

中国裁判文书网案例批量爬取

本文介绍了某法院网站数据采集的技术研究过程,主要包含JS逆向分析和数据解密方法。通过开发者工具分析发现页面数据经过加密处理,重点研究了ciphertext等加密参数的生成逻辑。文章详细记录了定位加密函数、扣取加密代码、解密数据处理的全流程,并验证了解密方法的有效性。研究过程中强调了技术使用的法律边界,明确声明仅用于合法技术研究,禁止任何非法数据爬取行为。最终实现了加密数据的成功解密,并解释了各请求参数的作用,为后续数据清洗和存储奠定了基础。

2303_80825459的博客 815

单链表的基本实现(详细图解+解说)

目录 一.前言: 二.链表的结构实现: 三.单链表的功能实现-增删查..... 1.结点的申请 2.数据的头插 3.数据的打印 4.数据的尾插 5.数据的头删 6.数据的尾删 7.数据的查找 8.数据的指定插入和指定删除 9.链表的销毁 四.后言 一.前言: 我们都知道,顺序表是一块连续的可以存放数据的存储空间,其可以通过下标或指针解引用的方式快速访问某个位置的数据,但是由于空间的连续性,想要灵活的插入和删除数据便较为困难。 区别于顺序表,链表由一个个独立的可以存放数..

Eliauk_U的博客 5661

华为OD机考双机位C卷 - 螺旋数字矩阵 (Java & Python& JS & C/C++ & GO )

华为OD机考双机位C卷 - 数字螺旋矩阵(OD上机考试双机位C卷)。提供在线OJ刷题。Java、C++、Python、GO语言、C语言、JavaScript题解,并提供完整思路讲解。

算法大师! 3216

【 数据结构 】单链表的实现 - 详解(C语言版)

前言 简单用C语言来描述数据结构中的单链表,本文实现的只是简单的无头单链表,包括单链表的增加数据,删除数据,查找指定数据,修改指定数据,也就是简单的增删查改等操作。

上上谦. 的博客 1万+

计算机视觉学习路线图:从入门到专家

计算机视觉学习路线图:从入门到专家​ ,人工智能,计算机视觉,大模型,AI,计算机视觉学习路线图从七方面展开。先强调数学基础,含线性代数、概率统计和微积分;接着介绍 Python、OpenCV 等编程语言与工具;涵盖边缘检测、特征提取等经典算法;阐述深度学习中 CNN 结构、经典模型及实现;涉及目标检测、图像分割等高级专题;包含图像分类、目标检测和人脸识别等项目实战;最后提及科研进阶的论文阅读、项目参与和论文发表,助学习者从入门到专家。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 7万+

Open3D (C++) KD tree的使用【2025最新版】

Open3D (C++) KD tree的使用,博客长期更新,本文最近更新时间为:2025年1月6日。

点云侠的博客 1566

【数据结构】单链表的实现

快来看呀,小陳同学开始啃数据结构咯。

adcxhw的博客 1561

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

单链表及用单链表实现栈

单链表 package linked; import jdk.swing.interop.SwingInterOpUtils; public class SingleLinkedListTest { public static void main(String[] args) { SingleLinkedList singleLinkedList = new SingleLinkedList(); singleLinkedList.addHead("A");

执妄 218

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Java实现单链表

上篇博客我们实现了顺序表的所有操作,而顺序表存在以下问题: 顺序表中间 / 头部的插入 / 删除,时间复杂度为O(N) 扩容需要申请新空间,拷贝数据,释放旧空间,会有不小的损耗 扩容一般是呈两倍的增长,势必会有一定的空间浪费,例如,当前容量为100,满了后扩容到200,再继续插入5个元素,后面没有元素插入,那么就浪费了95个数据空间 为了避免上述的这些缺点,引入了链表,通过本篇博客的学习,我们要熟悉单链表的使用 链表 定义: 链表是一种物理存储结构上非连续存储结构,是Java数据结构中一种很基础很常见

一朵花花 799

单链表C语言实现及原理

单链表C语言实现及原理 一、简述 本文着重描述如何用C语言实现单链表的过程和原理,它包括了单链表所有的基础功能增、删、查、改。 关于单链表的定义就不在此赘述了。 本文是在参考了C语言单链表的基本操作总结(增删改查) 这篇文章之后,做出了一些优化,修复了部分bug,重新梳理了流程,使之更加简洁和容易理解,再次感谢原文作者。 代码如有任何错误或不妥,欢迎大家评论,给出宝贵建议。

Dennis_China的博客 6811

单链表简单实现

单链表逻辑图:单链表同顺序表一样,都是线性表,除了首尾节点之外,任何一个节点都有自己的前驱和后继;但是单链表每个节点在物理上的地址是不连续的或者说是随机的,也就是说单链表的节点是要一个就开一个,不会过多的开辟空间;这一点正是弥补了顺序表的不足;从上面的逻辑图我们就可以看出,每个节点的类型应该是一样的,节点主要分为数据域和指针域,同时对于一串链表来所,最后一个节点的指针域一定是NULL,以此来标记这是链表的结尾;同时我们只需要知道单链表的头节点,就可以很好的管理整个链表;

南猿北者博客 2620

C语言实现单链表

C语言实现单链表

sgz0527的博客 2273

C语言单链表实现

一:NOTE 今天分享一下单链表(有空头)的一些操作!主要呢就是增、删、打印! 二:预备知识 单链表可以比喻成一趟火车,有空头的单链表就像是一个火车头拉着一节有一节的车厢。一个车厢中有数据域和指针域,指针域用来连接,每节车厢肯定要有东西连着,不然就没有方向了。如图 所以连接的时候只要将指针域指向下一个节点就是连接上了,然后删除呢 给个图应该很清楚了 三:明确步骤 写程序前,首先捋清楚程序有哪些...

qq_43590728的博客 459

环境下实现单链表的操作_数组实现单链表

单链表常见的实现方法有两种,一种方式是定义一个结构体表示链表节点。比如:struct node{ int val; node* next; };然后就是通过next指针将链表的所有节点连接起来。如果涉及到链表节点的插入和删除操作,则只需要修改链表节点的指针即可。这种方式有个明显的缺点,就是不能随机存取。如果要在某个节点之后插入或者删除节点,复杂度是O(n),因为要从头开始逐...

weixin_32287387的博客 139

单链表实现

C语言实现数据结构链表

kunmu6666的博客 775

【数据结构】单链表实现

【数据结构】单链表实现

m0_59292239的博客 689

C++实现单链表基本操作

C++实现单链表基本操作 本博客按照上篇博客线性表单链表的基本操作而写出的完整代码,详情请看单链表基础概念 #include<iostream> using namespace std; //函数结果状态代码 #define OK 1 #define ERROR 0 typedef int Status; // Status 相当于 int typedef ...

diviner_s的博客 5758
上一篇: 研究c语言中 printf()、sprintf()、scanf()、sscanf()、之间的区别
下一篇: popen/system, 理解这两个函数和fork的区别.
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值