C---链表

news2025/1/16 8:31:58

目录

  • 链表的遍历
  • 计算链表节点个数
  • 查找结点
  • 节点后插入新节点
  • 节点前插入新节点
          • 1.目标节点为头节点 (引起链表头变化)
          • 2.目标节点不是头节点
          • 节点前插入新节点(两种情况)完整版
  • 删除节点
            • 课外知识:gcc ... -g
          • 1.删除头节点
          • 2.删的不是头节点
  • 头插法动态创建链表
  • 尾插法动态创建链表
  • 更改节点(自己写的🤭)
          • 不是头节点:
          • 改头节点

链表的遍历

struct test 
{
     int data
     struct test *next;
};


void printlink(struct test *head)
{
     while(head!=NULL){
         printf("%d",head->data);
         head = head->next;     
     }
 
}
int main()
{
     struct test t1 = {1,NULL};
     struct test t2 = {2,NULL};	
     struct test t3 = {3,NULL};
     
     t1.next = &t2;
     t2.next = &t3;
     
     printlink(&t1);
    

	return 0;
}

计算链表节点个数

int getlinknode(struct test *head)
{
     int cnt =0;
       while(head !=NULL){
          cnt++;
          
          head = head->next;     
      }
      return cnt;
}

int main()
{
           int ret = getlinknode(&t1);
           printf("node = %d\n",ret);
}

查找结点

int searchnode(struct test *head,int data) //(链表头,要找的节点)
{
       while(head !=NULL){
            if(head->data == data){
                   return 1;   
            }  
            head = head->next;     
       }
       
      return 0;
}

int main(){
int t = searchnode(&t1,5);
     if(t==1){
         printf("有\n");     
     }else if(t ==0){
         printf("没有\n");     
     }
     }

节点后插入新节点

int insertFromBehind(struct test *head,int data,struct test *new)
{
  struct test *p = head;
         while(p != NULL){
              if(p->data == data){
                  new->next = p->next;
                  p->next = new;          
                  return 1;    
              }      
              p = p->next;   
         }
         return 0;
}

int main()
{
    struct test new = {5,NULL};
    
     insertFromBehind(&t1,3,&new);
     printlink(&t1);
}
 new->next = p->next;
                  p->next = new; 

原理如图:
在这里插入图片描述

节点前插入新节点

分为两种情况:

1.目标节点为头节点 (引起链表头变化)

思想:这个函数返回值是个指针,把这个指针给链表头,去引起main函数里链表头变化

struct test *insertfromfor(struct test *head,int data,struct test *new)
{
         struct test *p = head;
         if(p->data == data){
              new->next = head;
              return new;         //把新的头返回给main        
         }
}

int main()
{
  struct test *head = NULL;	
  struct test new2 = {7,NULL};
  head = &t1;  
  
   head = insertfromfor(head,1,&new2);    //让头等于新的头
   printf("after insert fromfor:\n");
   printlink(head);
}
2.目标节点不是头节点
添加进这部分就可以:struct test *insertfromfor(struct test *head,int data,struct test *new)

while(p->next !=NULL){
             if(p->next->data == data){
                  new->next = p->next;
                  p->next = new;
                  printf("insert ok\n");
                  return head;   //在这里return head 不要忘也不要弄错位置
             }
             p = p->next;         
         }
节点前插入新节点(两种情况)完整版
struct test *insertfromfor(struct test *head,int data,struct test *new)
{
         struct test *p = head;
         if(p->data == data){
              new->next = head;
              return new;         
         }
         while(p->next !=NULL){
             if(p->next->data == data){
                  new->next = p->next;
                  p->next = new;
                  printf("insert ok\n");
                  return head;
             }
             p = p->next;         
         }
}

int main()
{
     struct test new2 = {7,NULL};
     struct test new3 = {8,NULL};

      head = insertfromfor(head,1,&new2);
      printf("after insert fromfor:\n");
      printlink(head);
     
      head = insertfromfor(head,1,&new3);  //这里的1已经不是头了,在上一步操作后就变了
      printf("after insert fromfor not head:\n");
      printlink(head);
}

删除节点

课外知识:gcc … -g
              添加一个gdb调试的手段

删节点分两种情况

1.删除头节点
struct test *deletnode(struct test *head,int data)
{
       struct test *p = head;         
       if(p->data == data){
          head = head->next;
          free(p);
          return head;      
      }
}

int main()
{
      head = deletnode(head,1);
      printlink(head);
}
2.删的不是头节点
struct test *deletnode(struct test *head,int data)
{
        struct test *p = head;
        while(p->next != NULL){              
           if(p->next->data == data){
                p->next = p->next->next ;          
           }
           return head;
      }
}

int main()
{
        head = deletnode(head,2);
        printlink(head);
}

头插法动态创建链表

新来的是头,头一直在变,最后返回头

struct test *creathead(struct test *head)
{
       struct test *new ; 
       int i;
       for(i=0;i<5;i++){
            new =(struct test *) malloc(sizeof(struct test));
            printf("输入内容:\n");
            scanf("%d",&(new->data));
            
            if(head==NULL){
                head = new;
                           
            }else{
              new->next = head;
              head = new;              
            }
       }
       return head;
}

int main()
{
       struct test *head = NULL;
       head = creathead(head);
    
       printlink(head);
}

优化:

struct test *insertfromhead(struct test *head,struct test *new)
{
    
            if(head==NULL){
                head = new;                          
            }else{
                 new->next = head;
                 head = new;              
            }    
             return head;
}

struct test *creatlink(struct test *head)
{
       
        struct test *new;
      
        while(1){
            new =(struct test *)malloc(sizeof(struct test));
            printf("输入内容:\n");
            scanf("%d",&(new->data));
            
            if(new->data==0){
                 printf("0 quit\n") ;
                 return head;           
            }           
            
            head = insertfromhead(head,new);
}
}

int main()
{
     struct test *head = NULL;	 
     head = creatlink(head);
    
     printlink(head);
         
	 return 0;
}

尾插法动态创建链表

思想:遍历到最后一个节点,让最后一个节点的next= new

#include <stdio.h>
#include <stdlib.h>
 
struct test
{
	int data;
	struct test *next;
};
 
void printLink(struct Ltest* head)
{
	struct test* p = head;
 
	while(p != NULL){
		printf("%d ",p->data);
		p = p->next;
	}	
	putchar('\n');    
}
 
struct test* insertfromtail(struct test *head,struct test *new)    //把creatlink中准备好的data连起来
{ 
	struct test *p = head; 
    if(p == NULL){
        head = new;
        return head;
    }
    while(p->next! =NULL){    
        p = p->next;
    }
    p->next = new;
    
    return head;
}
 
struct test* createLink(struct test *head)    //  提示输入,获取内容,放到data里
{
	struct test *new = NULL;
 
	while(1){
		printf("input your new node data:\n");
		new = (struct test*)malloc(sizeof(struct test));
		scanf("%d",&(new->data));
		if(new->data == 0){
			printf("0 quit\n");
			free(new);            //如果第一次输入数据为0,则新节点new,malloc的空间没用,则free掉
			return head;
		}
		head = insertfromtail(head,new);       
	} 
}
 
int main()
{
 
	struct test *head = NULL;
 
	head = createLink(head);
    
	printLink(head);	//打印链表
 
	return 0;
}
 
 

更改节点(自己写的🤭)

不是头节点:

在这里插入图片描述
在这里插入图片描述

改头节点

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

CS224W 6 Graph Neural Networks

目录 引入 node embedding Deep Graph Encoders的引入 Basics of Deep Learning Deep Learning for Graphs ​编辑A Naive Approach GCN GCN的基本idea Aggregate Neighbors 训练GCN Unsupervised Training Supervised Training Oview 整体流程 Inductive capabil…

等保三级,多级等保认证的一点了解

2022年11月21日10:28:28 信息安全等级保护管理办法 信息系统的安全保护等级分为以下五级&#xff1a; 第一级&#xff0c;信息系统受到破坏后&#xff0c;会对公民、法人和其他组织的合法权益造成损害&#xff0c;但不损害国家安全、社会秩序和公共利益。 第二级&#xff0c;信…

c++ 之安装opencv显示图片

额,要把yolo+pose+class从python转成c++,一整头大,从头开始试。 win11 + vs2022 c++_v14 + opencv4.6.0 安装opencv 从官网下载OpenCV https://opencv.org/releases/ 我是windows系统,没啥好说的,就是下个exe然后安装。 我是装在 D:\Program Files (x86)\ 目录下,之后…

(一)逻辑回归及其代价函数 --- 吴恩达深度学习笔记

逻辑回归 — 适用于二分类问题 使用逻辑回归算法会得到的输出标签y&#xff0c;y在监督问题中全是0或者1&#xff0c;因此这是一种针对二分类问题的算法。 给定的输入特征向量x和一幅图像对应&#xff0c;我们希望识别这是否是一张猫的图片。因此我们想要一种算法能够输出一个…

CRDB-事务层知识点

事务层负责维护事务的原子性&#xff0c;确保事务中的所有操作都被提交或中止。此外&#xff0c;事务层在事务之间维护可序列化的隔离—这意味着事务与其他事务的影响完全隔离。尽管多个事务可能同时进行&#xff0c;但每个事务的体验就像每次只运行一个事务—可序列化的隔离级…

PyTorch实现DCGAN(生成对抗网络)生成新的假名人照片实战(附源码和数据集)

需要数据集和源码请点赞关注收藏后评论区留言~~~ 一、生成对抗网络&#xff08;GAN&#xff09; GAN&#xff08;生成对抗网络&#xff09;是用于教授DL模型以捕获训练数据分布的框架&#xff0c;因此可以从同一分布中生成新数据。它们由两个不同的模型组成&#xff0c;生成器…

52、ElasticSearch 简单查询

1、DSL Query 分类2、DSL Query 基础语法 1、match_all&#xff0c;查询所有 2、全文检索查询 4、精确查询 5、地图查询 3、总结分析 本章学习了全文检索查询、精确查询、地图查询等。 1、全文检索查询&#xff1a; match&#xff1a;通过指定字段查询&#xff0c;不允许使用…

Activity、Fragment之间的传值

1、Activity和Activity之间传值 1、使用Intent 2、使用Intent结合Bundle IntentBundle 3、传自定义对象实现&#xff08;实现Serialzable接口&#xff0c;性能较差&#xff0c;系统自动处理&#xff09; 传自定义对象 4、传自定义对象&#xff08;实现Parcelable,性能较好…

nginx 单向链表

ngx_list_t是Nginx封装的链表容器&#xff0c;它在Nginx中使用得很频繁&#xff0c;例如HTTP的头部就是用 ngx_list_t来存储的。当然&#xff0c;C语言封装的链表没有C或Java等面向对象语言那么容易理解。 ngx_list_t单向链表与ngx_queue_t双向链表是完全不同的&#xff0c;它是…

小程序直播系统开发制作_分享视频直播系统开发对企业的好处

许多小伙伴可能会感到困惑&#xff0c;直播小程序怎么制作&#xff0c;有直播小程序制作教程吗&#xff1f;为什么选择直播小程序&#xff0c;它会给企业带来什么好处&#xff1f;下面小编给大家一一解答。 一、小程序直播系统开发制作教程 ① 进入开发工具选择所在行业的模板…

Multigrid reinforcement learning with reward shaping

摘要 基于势能的奖励塑形已被证明是提高强化学习agent收敛速度的有效方法。 这是一种以原则性方式将背景知识纳入时间差分学习的灵活技术。然而&#xff0c;问题仍然是如何计算用于塑形给予学习agent的奖励的势能。在本文中&#xff0c;我们提出了一种通过状态空间离散化来解决…

计算机毕业设计java+ssm的高校科研仪器共享平台-计算机毕业设计

项目介绍 高校科研仪器共享平台&#xff0c;是一个学校内部提供信息管理的平台&#xff0c;是完全的&#xff0c;高速的&#xff0c;开放的&#xff0c;其核心思想是提供一个以自然语言为主的用户界面&#xff0c;让用户能够更好的刚加方便快捷的管理科研仪器信息的一个渠道和…

解决雪花算法生成的ID传输前端后精度丢失

本章目录&#xff1a; 问题描述解决方案 修改数据库字段配置MVC全局消息转换器修改Result类一、问题描述 在用雪花算法生成的ID传输到前端时&#xff0c;会出现后三位精度丢失 可以看到&#xff0c;我们得到的response为1594605819398193154 而前端展示的为159460581939819…

3 Minute Thesis (3MT)

1 定义 资料来源&#xff1a;https://zhuanlan.zhihu.com/p/63325983?utm_id0 3MT原则&#xff1a;要把博士课题介绍给一个受过高等教育但没有专业背景的人并阐述它的重要性。 定义&#xff1a;三分钟论文(3MT)是一个学术比赛&#xff0c;帮助当前的研究生培养有效的演讲和沟…

[附源码]计算机毕业设计JAVA基于web的电子产品网络购物平台

[附源码]计算机毕业设计JAVA基于web的电子产品网络购物平台 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a;…

MyBatis搭建

目录 1.我的开发环境 2.创建maven工程 (1)打包方式 : jar (2)引入依赖 3.创建MyBatis的核心配置文件 4.创建mapper接口 5.创建MyBatis的映射文件 1.映射文件的命名规则: 2.MyBatis中可以面向接口操作数据 , 要保证两个一致 : 映射文件官方示例: 6.执行配置文件中的SQL…

HC-05蓝牙模块--------手机与STM32通信(代码编写)(上位机配置)保姆级教程

⏩ 大家好哇&#xff01;我是小光&#xff0c;嵌入式爱好者&#xff0c;一个想要成为系统架构师的大三学生。 ⏩因为之前无论是电赛还是做项目&#xff0c;都用到了蓝牙模块&#xff0c;如&#xff1a;手机和stm32的通信&#xff0c;电赛中的双车通信&#xff0c;还是遥感小车的…

19 01-通过状态掩码读取DTC数目

诊断协议那些事儿 诊断协议那些事儿专栏系列文章&#xff0c;本文介绍存储数据传输服务下的19服务ReadDTClnformation的第一个子功能&#xff08;01h&#xff09;&#xff0c;通过状态掩码读取DTC数目。 关联文章&#xff1a; 19服务List $19服务:DTCStatusMask和statusofDT…

肠道菌群化合物库——科研领域的研究靶点

近年来&#xff0c;肠道菌群已经成为科研领域的研究热点&#xff0c;涉及领域之广泛&#xff0c;最近几年的研究主要集中在肠道菌群与多种疾病发生和发展的联系。近年来&#xff0c;肠道菌群时常登上各大国际学术周刊&#xff0c;实火&#xff01; “闻声而来”的肠道菌群肠道…

【异构知识蒸馏:IVIF】

Heterogeneous Knowledge Distillation for Simultaneous Infrared-Visible Image Fusion and Super-Resolution &#xff08;同时进行红外-可见光图像融合和超分辨率的异构知识蒸馏&#xff09; 近年来&#xff0c;红外-可见光图像融合引起了越来越多的关注&#xff0c;并且…