c语言实现:链表创建、插入、删除、翻转

news2024/11/18 6:37:15
#include <stdio.h>
#include <stdlib.h>

// 链表创建
typedef struct Node{
    int data;
    struct Node* next;
} Node;

// 创建一个节点
Node* createNode(int data){
    Node* newNode = (Node* )malloc(sizeof(Node));
    newNode->data = data;
    newNode->next = NULL;
    return newNode;
}

// 创建并插入一个节点
void insertNode(Node* head, int data){ // 要修改head得传入地址
    Node* insert = createNode(data);
    insert->next = head->next;
    head->next = insert;
}

// 打印链表
void nodeListPrint(Node* head){
    int index = 0;
    head = head->next;
    while(head != NULL){
        printf("index: %d, head->data: %d\n", index, head->data);
        head = head->next;
        index ++;
    }
}

// 根据data的值获取节点
Node* getNodeByData(Node* head, int data){
    while(head != NULL){
        if(head->data == data) return head;
        head = head->next;
    }
    printf("no wish node: %d\n", data);
    return NULL;
}


// 根据data的值删除节点
void deleteNodeByData(Node* head, int data){
    Node* delete = getNodeByData(head, data);
    if(delete == NULL) return;
    while(head != NULL && head->next != delete) head = head->next;
    head->next = delete->next;
    delete->next = NULL;
    free(delete);
}

// 链表翻转
void nodeListReverse(Node** head){
    Node* nodehead = *head; 
    Node* oldhead = (*head)->next;
    Node* next = NULL;
    *head = NULL;
    
    while(oldhead != NULL){
        next = oldhead->next;
        oldhead->next = *head;
        *head = oldhead;
        oldhead = next;
    }

    nodehead->next = *head;
    *head = nodehead;
}

int main(){
    
    Node* head = (Node* )malloc(sizeof(Node)); // 创建头节点
    for(int i = 1; i <= 10; i ++) insertNode(head, i);
    printf("1.完整链表如下:\n");
    nodeListPrint(head);
    printf("2.删除后的链表如下:\n");
    deleteNodeByData(head, 2);
    deleteNodeByData(head, 6);
    nodeListPrint(head);
    printf("3.链表翻转如下:\n");
    nodeListReverse(&head);
    nodeListPrint(head);
    printf("4.删除后的链表如下:\n");
    deleteNodeByData(head, 7);
    deleteNodeByData(head, 8);
    nodeListPrint(head);
    return 0;
    
}

在这里插入图片描述

其中链表翻转也可以不用二阶指针,但是需要做返还在主函数要接收

// 链表翻转一阶指针
Node* nodeListReverse1(Node* head){
    Node* nodehead = head;
    Node* nhead = NULL;
    Node* next = NULL;
    head = head->next;

    while(head != NULL){
        next = head->next;
        head->next = nhead;
        nhead = head;
        head = next;
    }
    nodehead->next = nhead;
    nhead = nodehead;
    return nhead;
}

在这里插入图片描述
在这里插入图片描述
结果仍然是一样的

其他补充:

Makefile可以这样写:

runm: clean MAIN
	./MAIN

MAIN: main.o
	gcc -o MAIN main.o

main.o: main.c
	gcc -c main.c -o main.o

clean:
	rm -f *.o MAIN TEST

runt: clean TEST
	./TEST

TEST: test.o
	gcc -o TEST test.o

test.o: test.c
	gcc -c test.c -o test.o

优化后如下所示:

TRV1 = MAIN
TRV2 = TEST
TEP1 = main.o
TEP2 = test.o
ORG1 = main.c
ORG2 = test.c


runm: clean $(TRV1)
	./$(TRV1)

$(TRV1): $(TEP1)
	gcc -o $@ $<

$(TEP1): $(ORG1)
	gcc -c $< -o $@

clean:
	rm -f *.o MAIN TEST

runt: clean $(TRV2)
	./$(TRV2)

$(TRV2): $(TEP2)
	gcc -o $@ $<

$(TEP2): $(ORG2)
	gcc -c $< -o $@

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

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

相关文章

35岁java转大模型笔记,大模型智能体(LLM Agent)学习笔记

\1. 什么是大模型&#xff1f; 大模型对应的英文是Large Language Model&#xff08;LLM&#xff09;&#xff0c;即大语言模型&#xff0c;简称大模型。技术层面讲&#xff0c;大模型是一种基于深度学习技术的机器学习模型。 为什么叫大模型呢&#xff1f;它是相对于小模型而…

万界星空科技铜拉丝行业MES系统,实现智能化转型

一、铜拉丝行业生产管理的难点主要体现在以下几个方面&#xff1a; 1、标准严格&#xff1a;铜线产品对质量的要求极高&#xff0c;特别是在电气性能、导电性、耐腐蚀性等方面&#xff0c;任何微小的瑕疵都可能影响产品的使用效果和安全性。 2、过程监控&#xff1a;生产过程…

点赞10万+,1分钟教会你,用AI生成的宠物带娃视频

今天刷到了这样的宠物带娃视频&#xff0c;最近这种视频爆火&#xff0c;出现了很多爆款&#xff0c;今天就拆解一下&#xff0c;教大家学会这种视频用AI如何生成。 我们先看一下这类视频的数据&#xff0c;很多账号都在做&#xff0c;对于不了解AI的人来说&#xff0c;会觉得…

轻松构建便民平台小程序源码系统 带完整的安装代码包以及搭建部署教程

系统概述 轻松构建便民平台小程序源码系统是一款集成了多项实用功能的模块化小程序开发框架。它基于当前最流行的小程序开发技术栈&#xff0c;如微信小程序、支付宝小程序等&#xff0c;通过预制的组件和模块&#xff0c;极大地简化了开发流程&#xff0c;降低了技术门槛。无…

Google BigTable架构详解

文章目录 什么是BigTable?架构图一、整体架构二、数据存储与索引存储模型 三、数据拆分与存储四、元数据管理五、读写流程 其他内容概览负载平衡其他存储和数据库选项 什么是BigTable? Bigtable是Google开发的一个高性能、可扩展的分布式存储系统&#xff0c;用于管理大规模…

Error running Application.Command line is too long

问题解析 本质上就是执行启动类Application的时候&#xff0c;执行的指令太长了&#xff0c;所以运行失败。 解决方案 1.打开Edit Configuration。 2.点击Modify options 3.勾选 Shorten command line 4.选择classpath file。 最终解决问题。

深入理解包管理工具

目录 引入npm配置文件常见属性版本理解package-lock.jsonnpm install其他命令发布自己的包 yarncnpmnpxpnpm安装和使用硬链接和软链接非扁平node\_modules存储store 引入 随着前端技术的发展&#xff0c;项目依赖的第三方库和工具越来越多&#xff08;例如&#xff1a;React、V…

信用卡验证-卢恩算法

卢恩算法 什么是 Luhn 算法&#xff1f; Luhn算法&#xff0c;也称为“模10算法”&#xff0c;是一种用于确定用户提供的标识号是否准确的公式。它广泛应用于验证信用卡号码以及其他数字序列&#xff0c;例如政府的社会安全号码 (SSN)。如今&#xff0c;Luhn算法是电子支付系…

详细分析SpringMvc中HandlerInterceptor拦截器的基本知识(附Demo)

目录 前言1. 基本知识2. Demo3. 实战解析 前言 对于Java的基本知识推荐阅读&#xff1a; java框架 零基础从入门到精通的学习路线 附开源项目面经等&#xff08;超全&#xff09;【Java项目】实战CRUD的功能整理&#xff08;持续更新&#xff09; 1. 基本知识 HandlerInter…

OJ在线评测系统 前端创建题目(增) 更新题目(改) 题目列表(查) 以及做题页面的开发 基于VUECLI脚手架画界面

目录 前端创建页面的开发一 创建一个路由 用acro design写 前端创建页面的开发二 题目管理页面 搜索 最終效果 题目更新页面的开发 携带参数的那种 修改路由 页码更新细节 我们先处理菜单项的权限控制和权限隐藏 在这里改 属性绑定一个函数 可以参考聚合搜索项目…

金属增材制造咋突破?纳米纹理粉末如何助力金属增材制造?

大家好&#xff0c;今天我们来了解一篇金属增材制造文章——《High absorptivity nanotextured powders for additive manufacturing》发表于《Science Advances》。金属增材制造在医疗、航空航天等领域&#xff0c;它潜力巨大&#xff0c;但目前可打印的金属材料有限&#xff…

word中的表格全部设置宽度100%

1、背景 我们用工具将数据库或其他的数据导出成word时&#xff0c;表格有的会大于100%&#xff0c;超过了边界。word没有提供全局修改的方法。如果我们想改成100%。 一种方式是通过宏&#xff0c;全局改。一种是手动改。 2、宏修改 如果表格多&#xff0c;可以通过这种方式。…

文献阅读——基于拉格朗日乘子的电力系统安全域边界通用搜索方法

摘要 为提升电力系统安全域(security region&#xff0c;SR)的构建效 率&#xff0c;提出一种基于拉格朗日乘子(Lagrange multiplier&#xff0c;LM) 的电力系统安全域边界(security region boundary&#xff0c;SRB)通用搜索方法。 首先&#xff0c;根据电力系统静态安全性问…

15.面试算法-树基础

1. 树基础 树在工程中有非常广泛的应用&#xff0c;在算法中也是一个极为庞大的体系&#xff0c;我们前面链表的文章中说过“没学会反转&#xff0c;链表相当于白学”&#xff0c;现在再加一句“没学会树的问题&#xff0c;算法相当于没学”。 本文我们将系统地学习相关问题。…

PLC程序加密的一种方法(密钥授权管理程序)

引文&#xff1a; 前段时间有客户跟我说&#xff0c;他们客户到期没有打款&#xff0c;所以想在PLC中开发一套授权管理程序&#xff0c;这样可以根据实际情况&#xff0c;给予客户不同的授权&#xff1b; 探讨&#xff1a; PLC怎么实现程序授权管理&#xff01; 对于国内工程师…

五星级可视化页面(28):3D园区—模型与数据的完美结合。

将园区3D模型和数据图表结合起来形成高大上的可视化效果有以下几方面的意义&#xff1a; 1. 提升信息表达效果&#xff1a; 通过将园区3D模型和数据图表结合&#xff0c;可以更生动地展现园区的空间结构和布局&#xff0c;同时将数据图表融入其中&#xff0c;直观地展示园区各…

Redis实战--Redis集群的搭建与使用

Redis是一个开源的高性能key-value数据库&#xff0c;它以其出色的性能和丰富的特性而广受欢迎。随着业务的发展&#xff0c;单机Redis可能无法满足大规模数据存储和高并发访问的需求。这时&#xff0c;Redis集群就显得尤为重要。本文将详细介绍Redis集群的概念、搭建过程以及使…

进阶美颜功能技术开发方案:探索视频美颜SDK

视频美颜SDK&#xff08;SoftwareDevelopmentKit&#xff09;作为提升视频质量的重要工具&#xff0c;越来越多地被开发者关注与应用。接下俩&#xff0c;笔者将深入探讨进阶美颜功能的技术开发方案&#xff0c;助力开发者更好地利用视频美颜SDK。 一、视频美颜SDK的核心功能 …

【CSS in Depth 2 精译_039】6.3 CSS 定位技术之:相对定位(上)

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第一章 层叠、优先级与继承&#xff08;已完结&#xff09;第二章 相对单位&#xff08;已完结&#xff09;第三章 文档流与盒模型&#xff08;已完结&#xff09;第四章 Flexbox 布局&#xff08;已…