c语言之链表学习小结

2023-05-16

1 链表

Typedef struct linkworker{

//此处Typedef 就是给结构体变量名struct linkworker取别名LINK

    char id[10];

    char name[10];

    struct linkworker *next;  //这个指针是结构体指针,只能指向这样的结构体

}LINK;

   LINK w1={“0001””战士”},w2={“0002”,”法师”},w3={“0003”,”射手”},*head;

   head=&w1;

   w1.next=&w2;

   w2.next=&w3;

  w3.next=NULL;

 

 

 

2 链表的三要素

1、头指针 head 是用来说明链表开始了,头指针就代表链表本身,所以以后要访问链表,就要访问头指针。

2、节点(node)链表中每一个结构体变量。

3、尾指针:用来说明链表结束(它是一个空指针NULL)。

 

如何来创建一个链表

1:用函数来创建一个链表

      返回值(创建的那个链表,实际就是要返回头指针)

      返回指针的函数

 

typedef struct student{

   Char id[10];

   Char name[10];

   Int age;

   Struct student *Next;//这个指针是结构体指针,只能指向这样的结构体

}STU;

STU *createLink(STU a[],int n)//要返回链表实际上就是要返回头指针

//通过结构体数组来提供节点

{

    STU *head;

    Head=&a[0]; //表示把数组a中的第一个元素赋给头指针,让头指针指向第一个节点

    //用循环n=4

    a[0].Next=&a[1];   

    a[1].Next=&a[2];

    a[2].Next=&a[3];   

    a[3].Next=NULL;

//用循环把前一个节点与后一个节点通过next指针联系起来

    for(inti=0;i<n-1;i++)

    { //与上面的几行代码功能一样

        a[i].Next=&a[i+1];

    }

    a[n-1].Next=NULL; //退出循环后,把尾指针作为NULL

    return head; //返回头指针,实际就是链表本身
}

Void findById(STU *head,char id[]);

如何输出链表的所有节点值

void outPutLink(STU *head)//参数需要一个链表,实际就是需要头指针

{       

    STU *p=head;//把链表的头指针赋给指针p

    printf(“学号\t姓名”);

    while(p!=NULL){当访问的节点不到末尾的时候

    printf(“%s\t%s”,p->id,p->name);

    p=p->Next;//把指针移动到下一个节点

}



void main

{

STU a[8]={

    {“s1”,”张1”},{“s2”,”张2”},{“s3”,”你好”},{“s4”,”张三”},

    {“s5”,”战士”},{“s6”,”张三”},{“s7,”哈哈”},{“s8”,”法师”}},*head

    ,NewNode={“s9”,”八戒”,12},*pNewNode=&NewNode;

    Head=createLink(a,8);

    outPutLink(head);

    Head=Insert(head,pNewNode);

    outPutLink(head);

}

 

 

 

链表的查找

链表的查找(如何在链表中查找一个指定的值)如果找到就输出,找不到输出没找到。

Void findById(STU *head,char id[])

{ //在一个链表中查找指定工号

  //要访问链表中的所有节点

    STU *p=head;//把链表的头指针赋给p

While(p!=NULL)

{

    //p就代表链表中的每一个节点,

    //如果p所指向那个节点的id与我们要找的id相同则退出循环

    If(strcmp(p->id,id)==0)

    {

        break;//说明找到了,就要退出循环

    }

    p=p->Next;

}

    If(p=NULL)

    {
       printf(“找不到此人”)
    }
    else{
     //找到了就输出指针所指向的那个节点的值       
      printf(“%s\t%s”,p->id,p->name); 
   }
}

 

链表的删除:

 

1:必须找到要删除的节点(还要保留要删除节点前的节点

2:然后才是删除

3:该函数要返回删除后的新链表,实际上是返回头指针;

根据工号去删除对应链表中的节点

STU *delById(STU *head char id[])//第一个参数告诉是哪一个链表,第二个参数是哪一个节点

{        //必须要找的该节点

    STU*p=head,*fornt;

    While(p!=NULL){

     If(strcmp(p->id,id)==0)     break;//如果这个节点是要找的节点

    //p在向后移动的过程中,首先把当前值赋给front,之后p再去移动

     fornt=p;//状态保存法

     p=p->Next;//移动到下一个节点

}

    If(p!=NULL){    //说明找到了要删除的节点

        //p前面一个节点的Next指向p后面一个节点

        fornt->Next=p->next;//这里的节点其实需要释放空间malloc和free;new和delete

   }

   return head;

}

 

 

 

链表的插入

可能会插入在开头,中间,结尾

1:找的要插入的位置

2:front->Next=&NewNode;           NewNode->next=p;中间

//插入一个节点并返回插入后的链表


   
STU *InsertNode(STU *head, STU *pNewNode)//第一个参数告诉是哪一个链表,第二个参数是哪一个节点

{        //必须要找的该节点

    STU*p=head,*fornt;

    While(p!=NULL&& p->age < pNewNode->age)
   {//如果发现p指向的年龄比新节点的年龄小就不断循环

    //p在向后移动的过程中,首先把当前值赋给front,之后p再去移动

    fornt=p;//状态保存法

     p=p->Next;//移动到下一个节点

   }

If(p==head)
{ //说明新节点插入在开头

    pNewNode->Next=head;//新节点的Next要指向以前的head

    head=pnewNode;//新的head要指向插入的节点

}
else If(p=NULL)
{ //说明新的节点插入在链表的末尾

   Front->next=pnewNode;//把front的Next指向新节点

   pnewNode->next=NULL;//再把新节点的Next赋值为NULL

}
else
{     //说明新的节点插入在中间

      //在p的前面插入

      fornt->Next=pNewNode;//把front的next指向新节点

    新节点的next指向p

   pNewNode->next=p;

}
else
{

    return head;

}

 

 

 

函数模板写链表

#if 1 
#include <iostream>  
using namespace std;

template<class Type>
class Link
{
public:
 Link();
 void Insert(Type&);//插入
 void Delete(Type );//删除
 void Reverse();//倒置
 void Print();//输出
 ~Link();//结点的释放
 struct Node
 {
  Node *next;
  Type* p;
 };
 Node *head;
};

template<class Type>
Link<Type>::Link()
{
  head = NULL;
}

template<class Type>
void Link<Type>::Reverse()
{
 Node * current = head ;
 Node * next = NULL ;
 Node * result = NULL ;
 while( current != NULL )
 {
  next = current->next ;
  current->next = result ;
  result = current ;
  current = next ;
 }
 head = result ;
}

template<class Type>
void Link<Type>::Insert(Type& t)
{
 Node* temp = new Node;
 temp->p = &t;
 temp->next = head;
 head = temp;
}

template<class Type>
void Link<Type>::Delete(Type t )
{
 Node * current = head ;
 while( current != NULL )
 {
  if( current->next != NULL &&* (current->next->p) == t )
  {
   Node * tmp = current->next;
   current->next = current->next->next ;
   delete tmp;
   return ;
  }
  current = current->next ;
 }
}

template<class Type>
void Link<Type>::Print()
{
 for (Node *pp = head; pp; pp = pp->next)
 {
  cout << *(pp->p) << " ";
 }
 cout << endl;
}
template<class Type>
Link<Type>::~Link()
{
 Node* pp;
 while (pp = head)
 {
  head = head->next;
  delete pp->p;
  delete pp;
 }
}
int main()
{
 Link<double> DoubleLink;
 for (int i = 1; i < 7; i++)
 {
  DoubleLink.Insert( * new double(i + 0.1) );
 }
 DoubleLink.Delete( double(2.1) );
 DoubleLink.Reverse();
 DoubleLink.Print();
 return 0;
}
#endif 
 

 

 

 

 

共用体和位运算

什么是共用体?所有成员都使用同一片地址单元

如何来定义共用体

union 共用体类型名

{

成员列表

};

说明:

1、共用体的定义与使用方法与结构体类似

2、结构体中各个成员都有属于自己的存储单元,而共用体中各个成员都共享一个存储单元

3、数据类型与存储单元大小的对应关系;

Int-----2个存储单元(2个字节、16位2进制)

Float---4个存储单元(64位)

Long---4个存储单元(64位)

Char---1个存储单元(8位)

Double--8个存储单元

4、结构体的大小等于结构体中所有成员所占存储单元之和

5、共用体的大小等于共用体中最大成员所占存储单元的大小

6、右边的是低字节,左边的是高字节

位运算

~ :按位求反                   把0变成1,把1变成0

<<:左移                            把数字向左移动,右边补0                    ex:   10001<<2  --> 00100

>>:右移                            把数字向右移动,左边补0                    ex:     10001>>2   --> 00100

&:位与        全为1则为1,有0 为0

10010

  &01110

00010

^:异或            相同为0,不同为1

10010

  ^01110

11100

 

|:位或            有1则1,全0为0

 

优先级别:~、<<、>>、&、^、|

 

Inta=3,b=6;

C=a^b<<2;

先要把10进制化成2进制(化成8):

0000 0 0 1 1              00000 0 1 1

0000 0 1 1 0  -> ^ 0001 1 0 0 0

                                                   000110 1 1

根据优先级先执行左移

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c语言之链表学习小结 的相关文章

  • CPU超线程技术到底有什么用?

    什么是超线程技术 前几天的超线程文章引起了不少讨论 xff0c 有些四驱两驱之类留言就不点出来了 今天咱们趁热打铁来聊下CPU超线程的实际用途 超线程的英文名是Hyper Threading Technology xff0c 简称HT 超线
  • 蓝桥杯 生日蜡烛

    某君从某年开始每年都举办一次生日party xff0c 并且每次都要吹熄与年龄相同根数的蜡烛 现在算起来 xff0c 他一共吹熄了236根蜡烛 请问 xff0c 他从多少岁开始过生日party的 xff1f 请填写他开始过生日party的年
  • QNX实时操作系统

    一个实时操作系统 xff08 RTOS xff09 必须是可靠的 xff1b 它必须是快速和响应的 xff0c 管理有限的资源和安排任务 xff0c 使它们按时完成 xff0c 并确保功能是隔离的 xff0c 不受其他功能的干扰 在本节中
  • Makefile教程(绝对经典)

    Makefile教程 xff08 绝对经典 xff0c 所有问题看这一篇足够了 xff09 GUYUEZHICHENG的博客 CSDN博客 makefile 该篇文章为转载 xff0c 是对原作者系列文章的总汇加上标注 支持原创 xff0c
  • 王道考研操作系统笔记

    https mp weixin qq com mp appmsgalbum biz 61 MzI0OTI2MjY2MQ 61 61 amp action 61 getalbum amp album id 61 227777034051051
  • 《管理的常识》:怎么做一个优秀的管理者?

    关于作者 艾伦 默里是 华尔街日报 的副总编 xff0c 华尔街日报 网和市场观察网的执行主编 xff0c 同时也是三次普利策新闻奖的得主 默里先生自己的新闻作品也获得过多次大奖 xff1a 关于亚洲的报道让他两次摘取了海外新闻出版俱乐部奖
  • VLAN 基础知识

    为什么需要VLAN 1 什么是VLAN VLAN Virtual LAN xff0c 翻译成中文是 虚拟局域网 LAN可以是由少数几台家用计算机构成的网络 xff0c 也可以是数以百计的计算机构成的企业网络 VLAN所指的LAN特指使用路由
  • 目标设定的SMART原则

    目标设定的SMART原则来源于管理大师彼得 德鲁克的 管理的实践 xff0c 有五个基本的原则 xff1a 1 目标必须是具体的 xff08 Specific xff09 2 目标必须是可以衡量的 xff08 Measurable xff0
  • 软件安全开发 - 流程规范

    写一篇软件安全开发流程分享给大家 xff0c 帮助从事软件开发 xff0c 测试 xff0c 管理的人员 xff0c 规范操作 xff0c 重视软件工程安全 现今社会存在各种网络安全事件 xff0c 比如勒索病毒导致许多网络系统瘫痪 xff
  • 读保护_混合ASIL系统中不同安全等级模块间的边界保护

    01 功能安全组件的软件开发 针对ISO 26262对功能安全软件研发的要求 xff0c AUTOSAR将功能安全需求进行了具体拆分 当前的AUTOSAR规范囊括了诸多功能安全组件软件开发的需求概念 在AUTOSAR系统设计的架构中 xff
  • 功能安全的一些好文

    特约专栏 一篇文章带你认识功能安全 本文将结合ISO 26262 xff0c 从什么是功能安全 什么是功能安全工程师以及功能安全工程师主要做什么 xff0c 三个方面展开对功能安全的介绍 https mp weixin qq com s v
  • make和makefile

    第二十六课 xff1a Makefile设计 哔哩哔哩 bilibili 内部资料 课程简介 大连理工大学国家精品课 嵌入式软件设计是计算机 软件工程等学科的专业方向课 xff0c 是一门实践性 技术性很强的重要课程 本课程的主要任务是全面
  • acm算法有用吗?写给自己。

    acm算法有用吗 xff1f 写给自己 xff0c 也希望能帮助那些大一迷茫的人 我是一个普通二本院校即将进入大三的acmer xff0c 一般问这个问题的人都是一个acmer的失败者 xff0c 因为成功的人都去忙着学习该学习的算法了 x
  • 算法题中常用的C++ STL

    一 栈 xff08 stack xff09 stack实现了一种先进后出的数据结构 xff0c 使用时需要包含stack头文件 C 43 43 定义stack语法 xff1a span class hljs stl container sp
  • Boot Loader

    在嵌入式操作系统中 xff0c BootLoader是在操作系统内核运行之前运行 可以初始化硬件设备 建立内存空间映射图 xff0c 从而将系统的软硬件环境带到一个合适状态 xff0c 以便为最终调用操作系统内核准备好正确的环境 在嵌入式系
  • 什么是SecOC 板端加密通讯

    板端加密通讯 Security Onboard Communication 缩写为SecOC SecOC是AUTOSAR标准中提出的针对ECU间通信安全提出的标准 CAN网络是明文传输 xff0c 广播报文 xff0c 无发送合法性校验 为
  • C++11:noexcept关键字

    1 介绍 C 43 43 11新标准引入的noexcept 运算符 xff0c 可以用于指定某个函数不抛出异常 预先知道函数不会抛出异常有助于简化调用该函数的代码 xff0c 而且编译器确认函数不会抛出异常 xff0c 它就能执行某些特殊的
  • 嵌入式应用程序设计流程

    第三十课 xff1a 应用程序设计流程 哔哩哔哩 bilibili arm linux gcc 交叉编译器 通过挂载实现程序调试 xff1a xff08 省去程序下载环节 xff09 第三十二课 xff1a 文件操作 哔哩哔哩 bilibi
  • uboot和bootloader有啥区别

    uboot和bootloader有啥区别 reboot to bootloader有什么用 IT教学网 片内的ram用来存储启动代码 xff0c 在2440初始化sdram之前 xff0c 代码就在片内ram中运行 片内ram装载的是nor

随机推荐

  • 微内核和宏内核以及混合内核

    操作系统内核的几个重要的特点 xff1a 内核是操作系统的核心部分 xff0c 它管理着系统的各种资源内核可以看成连接应用程序和硬件的一座桥梁 xff0c 是直接运行在硬件上的最基础的软件实体在一些简单的硬件设备上可以没有内核或操作系统而直
  • Adaptive AUTOSAR——Time Synchronization(VRTE 3.0 R21-11)

    15 Time Synchronization 15 1 What is Time Synchronization 时间同步是自适应平台基础中的一个功能集群 时间同步通过库向应用程序提供C 43 43 API xff0c 该库作为RTA V
  • Adaptive AUTOSAR——Update and Configuration Management(VRTE 3.0 R21-11)

    16 1 What is Update and Configuration Management 更新和配置管理 xff08 UCM xff09 是自适应平台服务中的一个功能集群 作为一种自适应平台服务 xff0c UCM实现了自适应平台的
  • Adaptive AUTOSAR 学习笔记 - AP 背景、技术及特征

    本系列学习笔记基于 AUTOSAR Adaptive Platform 官方文档 R20 11 版本 本文从AUTOSAR EXP PlatformDesign pdf开始 xff0c 一边学习 xff0c 一边顺带着翻译一下 尽力而为 x
  • gPTP时钟同步(时间同步)协议简介

    一 时间同步要解决的问题 不知道大家还记得军训练习齐步走的场景吗 xff1f 齐步走的动作要领你还记得吗 xff1f 教官首先发出 齐步 走 的命令 xff0c 大家听到 齐步 二字后 xff0c 开始调整动作 xff0c 最终所有人实现动
  • acm有用吗?

    acm有用吗 xff1f 废话 xff0c 没用的话费这么大劲干什么来了 xff0c 但是搞acm需要前期的高付出 xff0c 但是后期会有高回报 xff0c 也不是什么都不管不顾的高付出 xff0c 学好基础课的情况下高付出 中学加小学1
  • std::atomic 原子操作

    类模板 template lt class T gt struct atomic 多线程小结 xff1a 非原子操作 xff0c 不加锁 xff0c 效率很高 xff0c 但无法得到正确的结果非原子操作 xff0c 加锁 xff0c 效率很
  • Adaptive AUTOSAR——Execution Management(VRTE 3.0 R21-11)

    ChatGPT回答 xff1a Adaptive AUTOSAR Execution Management 模块是用于管理软件执行的模块 xff0c 其主要功能包括 xff1a 任务调度 xff1a 支持对任务进行调度和执行 xff0c 以
  • 【C/C++】获取当前系统时间(time_t和tm)清晰梳理

    C C 43 43 获取当前系统时间 xff08 time t和tm xff09 清晰梳理 c 43 43 time t YuXi 0520的博客 CSDN博客 C 43 43 获取系统当前时间 c 43 43 time函数 C 43 43
  • Adaptive AUTOSAR——State Management(VRTE 3.0 R21-11)

    状态管理是自适应平台服务中的一个功能集群 在自适应平台中 xff0c 状态决定了一组活动的自适应应用程序 特定于项目的应用程序 xff0c 即状态管理器 xff0c 决定何时请求状态更改 xff0c 从而更改当前活动的应用程序集 状态管理器
  • Adaptive AUTOSAR 文档官方如何阅读

    目前很多关于 Adaptive AUTOSAR 的文章都是官方文档的简化翻译 xff0c 不如直接看官方文档更全面深入 Adaptive AUTOSAR 文档官方下载地址 Adaptive Platform AUTOSAR https ww
  • Adaptive AUTOSAR-诊断管理-Diagnostic Server概述和诊断通信

    Diagnostic Server 对于AUTOSAR adaptive平台 xff0c 不用重新刷写整个ECU即可添加新的软件包 xff0c 各个软件包描述为SoftwareClusters xff0c 每个SoftwareCluster
  • Linux启动过程

    Linux 系统启动过程 菜鸟教程 Linux 系统启动过程 linux启动时我们会看到许多启动信息 Linux系统的启动过程并不是大家想象中的那么复杂 xff0c 其过程可以分为5个阶段 xff1a 内核的引导运行 init系统初始化建立
  • SOTA技术概述

    SOTA技术概述 懂车帝 懂车帝提供对于整车OTA类型 xff0c 主要分为两类 xff0c FOTA xff08 Firmware over the air xff09 和SOTA xff08 Software over t https
  • 什么是AUTOSAR?为什么汽车公司开始采用AUTOSAR来开发新产品?

    越来越多的车企开始应用ATUOSAR xff0c 也有很多公司在招聘时会在JD里注明 xff0c 应聘者需要熟练掌握AUTOSAR xff0c 那么什么是AUTOSAR xff1f 为什么从奔驰 宝马等传统豪华汽车巨头 xff0c 到新势力
  • 4.5 车载通信技术SOME/IP 白皮书

    1 SOME IP 协议概述 SOME IP xff08 Scalable service Oriented MiddlewarE over IP xff09 是指基于 IP 的可扩展的面向服务的中间件 SOME IP 协议于 2011 年
  • 计算机图形学方向和前景&&3D

    我是刚入坑计算机图形学的小菜鸟 xff0c 在百度上搜索计算机图形学方向和前景和3D xff0c 几乎不能搜到什么有用的东西 xff0c google还能搜到些有用的 xff0c 但是需要翻墙 恰好前几天山大承办的games xff0c 北
  • 在字符串中插入另一个字符串方法二

    算法分析 xff1a 把第一个字符串的前一部分和后一部分分别保存在两个字符串result和tmp中 然后再做一个拼接reslut 61 reslut 43 str2 43 tmp include lt stdio h gt include
  • linux压缩命令学习小结

    1 zip格式压缩 zip 压缩文件名 原文件名 zip命令只能压缩文件 压缩文件Ex xff1a zip file1 zip file1 解压缩 unzip file1 zip zip r 压缩文件名 源目录 加了 r就是压缩目录了 mk
  • c语言之链表学习小结

    1 链表 Typedef struct linkworker 此处Typedef 就是给结构体变量名struct linkworker取别名LINK char id 10 char name 10 struct linkworker nex