结构体(2),链表,共用体

链式数据结构 -- 链表

定义:

struct Node 
{
    int data; //数据域 --存储要处理的数据 
    struct Node *next; //指针域,保存地址-- 指向下一个节点 
};  //数据域+指针域

//节点类型 

struct Node n1; 
struct Node n2;
struct Node n3;

s1-->s2-->s3 

狗链 

头节点:链表的第一个节点,用于找到该链表实现操作,数据域一般不需要使用

首节点:链表用于存储数据的第一个节点,是头节点的后一个节点

尾节点:链表用于存储数据的最后一个节点,后一个节点p->next为NULL

特点

    优势: 增加和删除数据 方便
    劣势: 存取不方便 

操作: //数据结构体 数据的处理 增删改查 

创建链表:

1.使用malloc函数创建头结点

2.传回头结点,可以return也可以传入struct Node **(只有函数内*运算才能实现被调修改主调)

第一种:

返回值为void,传入参数为struct Node**型

此时注意(*head)->next需要加空号,因为->运算优先级比*高

void createEmptyLinklist(struct Node **head)
{struct Node *head = malloc(sizeof(struct Node));(*head)->next = NULL;
}

第二种:

返回值为struct Node*,参数为struct Node*

struct Node *createEmptyLinklist(struct Node *head)
{*head = malloc(sizeof(struct Node));(*head)->next = NULL;return *head;
}

插入链表:

头插入:

1.创建新节点

2.将该节点的next变为原来头结点的next(保证原来头结点的next不丢失)

3.将头节点的next变为插入的节点

void pushFront(struct Node *head,int dt)
{//s1.创建节点 struct Node *new = malloc(sizeof(struct Node ));new->data = dt;//s2 new->next = head->next;//s3 head->next = new;
}
尾插入:

1.创建新节点

2.取到尾节点

3.在尾节点后面插入

void pushBack(struct Node *head,int dt)
{//s1 struct Node *new = malloc(sizeof(struct Node));new->data = dt;//s2struct Node *p = head;while (p->next!=NULL){p = p->next;}//s3 p->next = new;new->next = NULL;
}

删除:

头删:

1.创建临时节点

2.判断首节点是否为空(也就是head->next是否为NULL)

3.将首节点的next替换原来的首节点,并将首节点的地址赋值给临时节点

4.释放首节点

void popFront(struct Node *head)
{struct Node *p = NULL;if (isEmpty(head) == 0){p = head->next;head->next = p->next;free(p);}
}
尾删:

1.创建临时节点

2.判断首节点是否为空(也就是head->next是否为NULL)

3.将p的位置移动到尾节点的上一个位置(因为删除尾节点之后,还要更改该节点的next为NULL)

4.释放尾节点,并将尾节点的上一个位置的next更改为NULL

void popBack(struct Node *head)
{struct Node *p = head;if (isEmpty(head) == 0){while (p->next->next != NULL)p = p->next;free(p->next);p->next = NULL;}
}

销毁链表:

1.使用任意一个删除法删除除头结点外所有节点

2.删除头结点,并更改为NULL(因为头结点是在主函数中定义的)

void destroyLinklist(struct Node **head)
{while (isEmpty(*head) == 0){popFront(*head);}free(*head);*head=NULL; //将head修改成NULL 防止野指针操作 
}

链表逆序:

1.使用头插法依次插入原来节点(原来的节点被逆序插入)

2.删除原来的节点

void reverseLinkList(struct Node *head)  //头插,尾删
{struct Node *p=head->next;int i=0;while(p != NULL){headInsert(head,p->data);p=p->next;i++;}for(;i>0;i--) //删除多余元素{popback(head);}
}
查找中间节点:

创建两个节点,从头结点开始,一个每次移动一个节点(pmid),一个每次移动两个节点(pend),当pend移动到最后一个位置时,另一个节点移动到中间位置

struct Node *searchMiddleNode(struct Node *head)
{struct Node *pmid=head;struct Node *pend=head;if(isEmpty(head)==0){while(pend->next!=NULL)  //单数情况,可取到尾指针{pmid=pmid->next;  if(pend->next->next!=NULL)  //双数情况,取不到尾指针pend=pend->next->next;else{pmid->next;break;}}}return pmid;
}

共用体:

共用体 (union)


union demo
{
  int a;
  char b;
  short c;
};

计算机早期的时候,能不能尽量节省空间?

共用体技术:
      可以让,多个变量,共用 同一块内存空间 

语法:

union 共用体名
{
    成员列表 
};

注意:

  1.共用体初始化时,只能给一个值,这个值默认时给到第一个成员的 
  2.共用体空间中数据,取决最后一次给到值 
    赋值的时候,每个成员只能影响,自己对应的字节
  3.共用体类型
    可以定义变量
    可以定义数组
    可以定义指针 
    可以做函数参数 和 返回值 

->判断字节序的大小端

d.b为1,小端(低位数据放在低地址处,低低),d为0,大端(低位数据放在高地址处,高低)

int isLittleBigEnd(void)
{union{int a;char b;}d={1};return    d.b
}

->短类型转换为长类型:

无符号:高位拓展0

有符号:进行符号位拓展

#include <stdio.h>union demo
{char a;int b;
};int main()
{union demo d={0x10};printf("%#x\n",d.a);printf("%#x\n",d.b);
}

首先,char和int默认为有符号位

当此时我给a赋值0x10时,d.b的值为0x10(此时符号位为0)

当此时我给a赋值0x90时,d.b的值为0xffffff90(此时符号位为1)

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

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

相关文章

DeepSort整体流程梳理及匈牙利算法解析

文章目录 算法原理一、主要步骤二、算法流程:三、匈牙利算法:3.1 举例说明匈牙利匹配过程:3.2匈牙利算法中代价矩阵的计算(距离)卡尔曼滤波后面更新。 算法原理 DeepSort核心在于其对目标的外观特征和运动特征的联合使用,以及对目标匹配问题的优化处理。该算法通过融合目…

【前端技术】 ES6 介绍及常用语法说明

&#x1f604; 19年之后由于某些原因断更了三年&#xff0c;23年重新扬帆起航&#xff0c;推出更多优质博文&#xff0c;希望大家多多支持&#xff5e; &#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Mi…

使用wheelnav.js构建酷炫的动态导航菜单

目录 前言 一、WheelNav是什么 1、项目地址 2、关于开源协议 3、相关目录介绍 二、如何使用wheelnav.js 1、新建html页面 2、设置style样式 3、创建展示元素实现动态导航 三、参数即方法介绍 1、参数列表 2、运行方法 3、实际成果 四、总结 前言 用户体验永远是一…

玩转盲盒潮流:从0到1搭建小程序平台

玩转盲盒潮流并搭建一个从0到1的小程序平台来创作内容是一个充满挑战但有趣的过程。以下是一个步骤指南&#xff0c;帮助你实现这一目标&#xff1a; 1. 市场调研与定位 了解盲盒市场&#xff1a;研究当前盲盒市场的趋势、消费者喜好和成功案例。确定目标用户&#xff1a;明确…

android-jni2

详细的jni调用说明&#xff1a;Android学习--JNI_android jni-CSDN博客 jclass clazz;index;LOGE("开始:%d", "begin");clazz (*env).FindClass("com/changan/incalleventservice/input/NativeAction");//找到对应的java文件jfieldID instanc…

docker-compose 部署rabbitmq 15672打不开

docker-compose 部署rabbitmq 15672打不开 如果docker-compose的rabbitmq镜像后缀不是-management如&#xff1a;3.7.4-management&#xff0c;则需要进入容器中手动启动插件 部署rabbitmq后需要启动插件的命令&#xff1a; rabbitmq-plugins enable rabbitmq_management 一…

软件质量保障——三、四

三、黑盒测试 1.黑盒测试概述 1.1 如何理解黑盒测试&#xff1f; 1.2 黑盒测试有什么特点&#xff1f; 1.3 如何实施黑盒测试&#xff1f; 2. 黑盒测试用例设计和生成方法&#xff08;这里还是要自己找题做&#xff09; 2.1 等价类划分法 步骤&#xff1a; 1.选择划分准…

解释JDBC的作用和连接数据库的步骤

JDBC&#xff08;Java Database Connectivity&#xff09;是Java编程语言中用来执行SQL语句的API。它的主要作用是为Java程序提供连接各种关系型数据库的能力&#xff0c;使得Java开发者能够编写出与数据库进行交互的应用程序。JDBC的作用具体体现在以下几个方面&#xff1a; 数…

在多支付渠道中这个设计模式无敌好用!

假设我们有一个电商平台&#xff0c;需要支持多种支付方式。 通过策略模式来实现&#xff0c;管理不同的支付方式&#xff0c;并根据需求快速添加新的支付方式。 定义支付策略接口及其实现类&#xff1a; // 支付策略接口 public interface PaymentStrategy { void pay(int …

SASS基础知识

什么是SASS 1. SASS与CSS的关系 SASS&#xff08;Syntactically Awesome Stylesheets&#xff09;是一种强大的CSS扩展语言&#xff0c;它允许开发者使用变量、嵌套规则、混合宏和更多功能&#xff0c;这些在纯CSS中是不可能做到的。SASS旨在简化CSS代码的维护&#xff0c;并…

C语言练习1

前言 从0开始记录我的学习历程&#xff0c;我会尽我所能&#xff0c;写出最最大白话的文章&#xff0c;希望能够帮到你&#xff0c;谢谢。 提示&#xff1a;文章作者为初学者&#xff0c;有问题请评论指正&#xff0c;感谢。 题目 1&#xff1a; 已有定义&#xff1a;char a…

BI平台概述

随着数字化浪潮的推进&#xff0c;企业对于数据驱动决策的需求日益增长。纷享销客作为一款领先的CRM平台&#xff0c;一直致力于帮助企业实现销售管理的高效与智能。纷享销客一体化BI智能分析平台作为CRM平台中的重要一环&#xff0c;旨在为企业提供更加全面、深入的数据分析能…

【EBS】通过SQL查找所有的定时请求

--查找所有定时请求。 --也可以登录系统&#xff0c;在系统管理员下查找特定请求&#xff0c;状态设置为Scheduled进行查询 SELECT DISTINCT USER_CONCURRENT_PROGRAM_NAME, B.RESUBMIT_INTERVAL, B.RESUBMIT_INTERVAL_UNIT_CODE FROM FND_CONCURRENT_PROGRAMS_TL A, FND_…

HBuilderX编写APP一、获取token

一、新建项目 二、从onenet获取key.js 1、下载之后的压缩包&#xff0c;解压2、关键就是找到key.js 3、将这个key.js复制到刚才的目录下面去 4、这个key.js文件就是生成token的代码 5、只要调用createCommonToken(params)这个函数&#xff0c;就可以实现生成token了 其中onload…

Vue Router源码分析

摘要&#xff1a;最近项目中遇到了点Vue Router的问题&#xff0c;发现有些只是没理清楚&#xff0c;再次复习了下Vue Router的源码&#xff0c;记录下... Vue-Router的能力十分强大&#xff0c;它支持hash、history、abstract 3种路由方式&#xff0c;提供了<router-link&g…

Java多线程核心工具类

1.Thread类&#xff1a;代表一个线程。你可以通过继承Thread类或实现Runnable接口来创建线程。 2.Executor框架&#xff1a;java.util.concurrent.Executors和java.util.concurrent.Executor接口提供了一种创建和管理线程池的方法&#xff0c;可以减少在创建和销毁线程上的开销…

【TB作品】msp430g2553单片机,OLED,PCF8591,ADC,DAC

硬件 OLED PCF8591 /** OLED* VCC GND* SCL接P2^0* SDA接P2^1*//** PCF8591* VCC GND* SCL接P1^4* SDA接P1^5*//* 板子上按键 P1.3 *//* 单片机ADC输入引脚 P1.1 *//* 说明&#xff1a;将PCF8591的DAC输出接到单片机ADC输入引脚 P1.1&#xff0c;单片机采集电压并显示 */功能…

Docker run 命令常用参数详解

Docker run 命令提供了丰富的参数选项&#xff0c;用于配置容器的各种设置。以下是docker run命令的主要参数详解&#xff0c; 主要参数详解 后台运行与前台交互 -d, --detach: 在后台运行容器&#xff0c;并返回容器ID。-it: 分配一个伪终端&#xff08;pseudo-TTY&#xff0…

python字典用法

有dict和defaultdict两种字典。 defaultdict 是 Python 标准库中 collections 模块提供的一个类&#xff0c;它是 dict 的一个子类&#xff0c;具有与普通字典相同的接口和功能&#xff0c;但在某些方面表现出不同的行为。 与普通的字典相比&#xff0c;defaultdict 的一个主要…

RGB转LAB,HSV

Excel如下 目标 代码&#xff08;改下两个地址就可以&#xff09; import pandas as pd import colorspacious import colorsys# 读取Excel文件 df pd.read_excel(未分类output.xlsx)# 定义RGB到LAB和HSV的转换函数 def rgb_to_lab(rgb):lab colorspacious.cspace_convert(r…