线性表的链式表示【单链表】

news2024/12/22 20:04:57

 单链表的优缺点

优点缺点

1. 插入和删除操作不需要移动元素,只需要修改指针

2. 不需要大量的连续存储空间

1. 单链表附加指针域,也存在浪费存储空间的缺点。

2. 查找操作需要从表头开始遍历,依次查找,不能随机存取。

单链表结点的定义

typedef int ElemType;
typedef struct LNode{
    ElemType data;//数据域
    struct LNode *next;//指针域
}LNode, *LinkList;

注意

LNode*是结构体指针,和LinkList完全等价。

头插法新建链表

代码

#include <stdio.h>
#include <stdlib.h>//malloc需要

typedef int ElemType;
typedef struct LNode{
    ElemType data;
    struct LNode *next;
}LNode, *LinkList;

void list_head_insert(LNode* &L) {
    L = (LinkList) malloc(sizeof(LNode));//申请头节点空间,头指针指向头结点
    L -> next =NULL;
    ElemType x;
    scanf("%d", &x);
    LNode *s;//用来指向申请的新结点
    while(x != 9999){
        s = (LinkList) malloc(sizeof(LNode));
        s -> data = x;
        s -> next = L -> next;//s的next指向原本链表的第一个结点
        L -> next = s;//头结点的next,指向新结点
        scanf("%d",&x);
    }
}

void print_list(LinkList L){
    L = L -> next;
    while(L != NULL){
        printf("%3d", L -> data);
        L = L -> next;
    }
    printf("\n");
}

int main(){
    LinkList L;//L是链表头指针,LinkList是结构体指针类型
    list_head_insert(L);//输入数据可以为3,4,5,6,7,9999,头插法新建链表
    print_list(L);//打印链表
    return 0;
}

效果

注意

#include <stdlib.h>//malloc需要

尾插法新建链表

代码

#include <stdio.h>
#include <stdlib.h>//malloc需要

typedef int ElemType;
typedef struct LNode{
    ElemType data;
    struct LNode *next;
}LNode, *LinkList;

void list_tail_insert(LNode* &L) {
    L = (LinkList) malloc(sizeof(LNode));//申请头节点空间,头指针指向头结点
    L -> next =NULL;
    ElemType x;
    scanf("%d", &x);
    LNode *s, *r = L;//s是用来指向申请的新结点,r始终指向链表尾部
    while(x != 9999){
        s = (LinkList) malloc(sizeof (LNode));//为新结点申请空间
        s -> data = x;
        r -> next = s;//新结点给尾结点的next
        r = s;//r指向新的尾部
        scanf("%d",&x);
    }
    r -> next = NULL;//让尾结点的next为NULL
}

void print_list(LinkList L){
    L = L -> next;
    while(L != NULL){
        printf("%3d", L -> data);
        L = L -> next;
    }
    printf("\n");
}

int main(){
    LinkList L;//L是链表头指针,LinkList是结构体指针类型
    list_tail_insert(L);//输入数据可以为3,4,5,6,7,9999,头插法新建链表
    print_list(L);//打印链表
    return 0;
}

效果

按位查找

注意

        判断查找位置是否合法

代码

#include <stdio.h>
#include <stdlib.h>//malloc需要

typedef int ElemType;
typedef struct LNode{
    ElemType data;
    struct LNode *next;
}LNode, *LinkList;

void list_tail_insert(LNode* &L) {
    L = (LinkList) malloc(sizeof(LNode));//申请头节点空间,头指针指向头结点
    L -> next =NULL;
    ElemType x;
    scanf("%d", &x);
    LNode *s, *r = L;//s是用来指向申请的新结点,r始终指向链表尾部
    while(x != 9999){
        s = (LinkList) malloc(sizeof (LNode));//为新结点申请空间
        s -> data = x;
        r -> next = s;//新结点给尾结点的next
        r = s;//r指向新的尾部
        scanf("%d",&x);
    }
    r -> next = NULL;//让尾结点的next为NULL
}

void print_list(LinkList L){
    L = L -> next;
    while(L != NULL){
        printf("%3d", L -> data);
        L = L -> next;
    }
    printf("\n");
}

LinkList GetElem(LinkList L,int SearchPos){
    int i = 0;
    if(SearchPos < 0){
        return NULL;
    }
    while(L !=  NULL && i < SearchPos){
        L = L -> next;
        i++;
    }
    return L;

}

int main(){
    LinkList L,search;//L是链表头指针,search是指针,LinkList是结构体指针类型
    list_tail_insert(L);//输入数据可以为3,4,5,6,7,9999,头插法新建链表
    print_list(L);//打印链表
    //按位查找
    search = GetElem(L,2);
    if(search != NULL){
        printf("Succeeded in searching by serial number\n");
        printf("%d\n",search -> data);
    }
    return 0;
}

效果

按值查找

代码

#include <stdio.h>
#include <stdlib.h>//malloc需要

typedef int ElemType;
typedef struct LNode{
    ElemType data;
    struct LNode *next;
}LNode, *LinkList;

void list_tail_insert(LNode* &L) {
    L = (LinkList) malloc(sizeof(LNode));//申请头节点空间,头指针指向头结点
    L -> next =NULL;
    ElemType x;
    scanf("%d", &x);
    LNode *s, *r = L;//s是用来指向申请的新结点,r始终指向链表尾部
    while(x != 9999){
        s = (LinkList) malloc(sizeof (LNode));//为新结点申请空间
        s -> data = x;
        r -> next = s;//新结点给尾结点的next
        r = s;//r指向新的尾部
        scanf("%d",&x);
    }
    r -> next = NULL;//让尾结点的next为NULL
}

void print_list(LinkList L){
    L = L -> next;
    while(L != NULL){
        printf("%3d", L -> data);
        L = L -> next;
    }
    printf("\n");
}

LinkList LocateElem(LinkList L,ElemType SearchVal){
    while(L){
        if(L -> data == SearchVal){//吐过找到对应的值,就返回那个结点的地址
            return L;
        }
        L = L -> next;
    }
    return NULL;
}
int main(){
    LinkList L,search;//L是链表头指针,search是指针,LinkList是结构体指针类型
    list_tail_insert(L);//输入数据可以为3,4,5,6,7,9999,头插法新建链表
    print_list(L);//打印链表
    //按值查找
    search = LocateElem(L,6);
    if(search != NULL){
        printf("Search by value succeeded\n");
        printf("%d\n",search -> data);
    }
    return 0;
}

效果

i位置插入元素

代码

#include <stdio.h>
#include <stdlib.h>//malloc需要

typedef int ElemType;
typedef struct LNode{
    ElemType data;
    struct LNode *next;
}LNode, *LinkList;

void list_tail_insert(LNode* &L) {
    L = (LinkList) malloc(sizeof(LNode));//申请头节点空间,头指针指向头结点
    L -> next =NULL;
    ElemType x;
    scanf("%d", &x);
    LNode *s, *r = L;//s是用来指向申请的新结点,r始终指向链表尾部
    while(x != 9999){
        s = (LinkList) malloc(sizeof (LNode));//为新结点申请空间
        s -> data = x;
        r -> next = s;//新结点给尾结点的next
        r = s;//r指向新的尾部
        scanf("%d",&x);
    }
    r -> next = NULL;//让尾结点的next为NULL
}

void print_list(LinkList L){
    L = L -> next;
    while(L != NULL){
        printf("%3d", L -> data);
        L = L -> next;
    }
    printf("\n");
}


LinkList GetElem(LinkList L,int SearchPos){
    int i = 0;
    if(SearchPos < 0){
        return NULL;
    }
    while(L !=  NULL && i < SearchPos){
        L = L -> next;
        i++;
    }
    return L;

}


bool ListFrontInsert(LinkList L,int i,ElemType InsertVal){
    LinkList p = GetElem(L,i -1 );
    if(NULL == p){
        return false;
    }
    LinkList q;
    q = (LinkList) malloc(sizeof (LNode));
    q -> data = InsertVal;
    q -> next =  p -> next;
    p -> next = q;
    return true;
}



int main(){
    LinkList L,search;//L是链表头指针,search是指针,LinkList是结构体指针类型
    list_tail_insert(L);//输入数据可以为3,4,5,6,7,9999,头插法新建链表
    bool ret;
    ret = ListFrontInsert(L,2,99);
    print_list(L);//打印链表
    return 0;
}

注意

从函数调用位置,跳转到函数定义位置,ctrl + 鼠标左键点击

效果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1425194.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

day39_mysql

今日内容 0 复习昨日 1 DML 2 约束 3 DQL 0 复习昨日 1 什么是数据库(Database)? 用来组织,存储,管理数据的仓库 2 什么是数据库管理系统(Database Management System-DBMS)? 用来管理数据库的一个软件 3 数据库分类 关系型数据库,Oracle,Mysql,SqlServer,DB2非关系数据库,Re…

Elasticsearch(ES) 下载添加IK分词器

上文 通过Web请求对 Elasticsearch(ES) 进行索引的 增删查 操作 我们通过web请求 创建了一个索引 但 目前 我们的索引是不具有分词效果的 我们并没有为索引指定分词器 所以 我们目前加进去的数据 就会保持原样 没有分词的能力 我们执行get查询操作 会发现一个 mappings字段 它…

v-if及v-for、computed计算属性的使用

v-if 概念及使用 v-if是Vue.js中的一个指令&#xff0c;用于根据表达式的真假值条件性地渲染一块内容。如果表达式的值返回真&#xff0c;则Vue会渲染这块内容&#xff1b;如果返回假&#xff0c;则不渲染。 基本用法: <p v-if"isVisible">看到我了吗&#…

【TI毫米波雷达】CLI模块初始化,demo工程覆写CLI控制指令代码的操作方式(以IWR6843AOP为例)

【TI毫米波雷达】CLI模块初始化&#xff0c;demo工程覆写CLI控制指令代码的操作方式&#xff08;以IWR6843AOP为例&#xff09; 本文主要针对demo工程 通过覆写CLI配置 跳过CLI配置命令 以此来达到自动配置参数 并控制雷达的功能 在此期间不开启CLI和相关初始化 只是针对CLI控…

穿越时空的视觉盛宴:古董展览可视化大屏的魅力

在我们的生活中&#xff0c;科技与传统的交融已经变得无处不在。走进古董的世界&#xff0c;仿佛打开了时光的闸门&#xff0c;每一件古董都承载着千年的故事与历史。然而&#xff0c;传统的古董展览方式&#xff0c;往往受限于空间和展示手段&#xff0c;难以让每一位观众深入…

在CentOS 7 中配置 YUM源

目录 YUM源的功能&#xff1a; YUM 源的安装过程 ps YUM工具 配置YUM仓库/YUM源 网络源&#xff1a;使用官方源 前提&#xff1a;联网 YUM源的功能&#xff1a; YUM&#xff08;Yellowdog Updater Modified&#xff09;是一个在Red Hat、CentOS、Fedora等基于RPM的Linux发…

八种Flink任务监控告警方式

目录 一、Flink应用分析 1.1 Flink任务生命周期 1.2 Flink应用告警视角分析 二、监控告警方案说明 2.1 监控消息队中间件消费者偏移量 2.2 通过调度系统监控Flink任务运行状态 2.3 引入开源服的SDK工具实现 2.4 调用FlinkRestApi实现任务监控告警 2.5 定时去查询目标库…

[网络安全] IIS----WEB服务器

一、 WEB服务器 WEB服务器 也叫网页服务器和 HTTP服务器使用协议: HTTP(端口:80) 或 HTTPS(端口443)浏览器:HTTP客户端网站: 一个或多个网页组成的集合 二、HTTP和HTTPS协议: HTTP : 是 HyperText Transfer Protocol&#xff08;超文本传输协议&#xff09;的简写&#xff0c;…

[数据结构与算法]贪心算法(原理+代码)

博主介绍&#xff1a;✌专研于前后端领域优质创作者、本质互联网精神开源贡献答疑解惑、坚持优质作品共享、掘金/腾讯云/阿里云等平台优质作者、擅长前后端项目开发和毕业项目实战&#xff0c;深受全网粉丝喜爱与支持✌有需要可以联系作者我哦&#xff01; &#x1f447;&#…

HarmonyOS-Stage模型开发概述

Stage模型开发概述 基本概念 下图展示了Stage模型中的基本概念。 图1 Stage模型概念图 UIAbility组件和ExtensionAbility组件 Stage模型提供UIAbility和ExtensionAbility两种类型的组件&#xff0c;这两种组件都有具体的类承载&#xff0c;支持面向对象的开发方式。 UIAbili…

力扣hot100 无重复字符的最长子串 双指针 滑动窗口 哈希

Problem: 3. 无重复字符的最长子串 文章目录 思路Code 思路 &#x1f468;‍&#x1f3eb; 参考 Code ⏰ 时间复杂度: O ( n ) O(n) O(n) &#x1f30e; 空间复杂度: O ( 1 ) O(1) O(1) class Solution {public int lengthOfLongestSubstring(String s){if (s null ||…

Quartus生成烧录到FPGA板载Flash的jic文件

简要说明&#xff1a; Altera的FPGA芯片有两种基本分类&#xff0c;一类是纯FPGA&#xff0c;另一类是FPGASoc&#xff08;System on chip)&#xff0c;也就是FPGAHPS&#xff08;Hard Processor System&#xff0c;硬核处理器&#xff09;&#xff0c;对应两种Flash烧录方式&a…

算法模板 2.差分

差分和前缀和是逆运算 差分数组可以将对a数组任意区间的加/减操作优化到O ( 1 ) 一维差分 797. 差分 - AcWing题库 #include <bits/stdc.h> using namespace std; const int N 100010; int a[N], b[N];void insert(int l, int r, int c){b[l] c; //表示l以后&#x…

消息中间件之RocketMQ源码分析(三)

RocketMQ中的Consumer启动流程 RocketMQ客户端中有两个独立的消费者实现类分别为DefaultMQPullConsumer和DefaultMQPushConsumer&#xff0c; DefaultMQPullConsumer DefaultMQPullConsumer,该消费者使用时需要用户主动从Broker中Pull消息和消费消息&#xff0c;提交消费位点…

Altium Designer的学习

PCB设计流程 1.新建空白工程&#xff1a; 创建一个新的工程 新建四个文件&#xff0c;并且保存&#xff1a; 每次打开文件时&#xff0c;打开以.PrjPcb结尾的文件 2.元件符号的创建&#xff1a; 在绘制图形的时候设置成10mil,为了在原理图中显得不那么大。 在绘制引脚的时候设…

外星人入侵(python)

前言 代码来源《python编程从入门到实践》Eric Matthes 署 袁国忠 译 使用软件&#xff1a;PyCharm Community Editor 2022 目的&#xff1a;记录一下按照书上敲的代码 alien_invasion.py 游戏的一些初始化设置&#xff0c;调用已经封装好的函数方法&#xff0c;一个函数的…

将vant地区数据改为label value children格式

以下代码放到nodejs中运行 a.js文件内容&#xff0c;vant的数据&#xff0c;来自import { areaList } from vant/area-data&#xff0c;形如&#xff1a; const fs require(fs);const a require(./a.js);const b transformData(a); fs.writeFileSync(./b.js, JSON.string…

STM32G4 系列命名规则

STM32G4产品线 基础型系列STM32G4x1 具有入门级模拟外设配置&#xff0c;单存储区Flash&#xff0c;支持的Flash存储器容量范围从32到512KB。 增强型系列STM32G4x3 与基本型器件相比具有更多数量的模拟外设&#xff0c;以及双存储区Flash&#xff0c;Flash存储器容量也提高…

如何在Windows系统使用Plex部署影音服务与公网访问本地资源【内网穿透】

文章目录 1.前言2. Plex网站搭建2.1 Plex下载和安装2.2 Plex网页测试2.3 cpolar的安装和注册 3. 本地网页发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 正文开始前给大家推荐个网站&#xff0c;前些天发现了一个巨牛的 人工智能学习网站&#xff0c; 通…

Spring-mybatis

怎样通过Spring整合Mybatis来实现业务 目录 1.导入依赖 <dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>3.8.1</version><scope>test</scope></dependency>&l…