数据结构-单链表

news2024/11/24 14:24:16
#include<stdio.h>
#include<stdlib.h>

typedef struct Node
{
    int data;
    struct Node* next;
}Node;

//创建一个头结点,数据域保存链表节点数
Node* init_single_list()
{
    Node* node = (Node*)malloc(sizeof(Node));
    node->next = NULL;
    node->data = 0; //初始化时,链表节点数为0
    return node;
}

//头插法
static int insert_from_head(Node* head,int data)
{
    if(!head)
        return -1;
    Node* tmp_node = (Node*)malloc(sizeof(Node));
    tmp_node->data = data;
    tmp_node->next = head->next;
    head->next = tmp_node;
    head->data++;
    printf("data of list is: %d\n",head->data);
    return 0;
}
//尾插法
static int insert_from_tail(Node* head,int data)
{
    if(!head)
        return -1;
    
    Node* node = (Node*)malloc(sizeof(Node));
    Node* tmp_node = head;

    node->data = data;
    node->next = NULL;
    if (NULL == tmp_node->next)//链表初始化后首次插入
    {
        tmp_node->next = node;
        printf("in hear\n");
        head->data++;
        printf("head -> data in 1 = %d\n",head -> data);
        return 0;
    }
       
    tmp_node = tmp_node->next;
    while(tmp_node->next)
    {
        tmp_node = tmp_node->next;
    }
    tmp_node->next = node;
    head->data++;
    printf("head -> data in 2 = %d\n",head -> data);
    return 0;

}

/*
另一种尾插法的写法
void tailInsert(Node* L, int data) 
{
    Node* node = L;
    Node* node1 = node;

    for(int i = 0; i < L -> data; i++) {
        node = node->next;
    }
    Node* n = (Node*)malloc(sizeof(Node));
    n -> data = data;
    n -> next = NULL;
    node -> next = n;
    L -> data ++;
    printf("L -> data = %d\n",L -> data);
    printf("node1 -> data = %d\n",node1 -> data);
    printf("node -> data = %d\n",node -> data );
}
*/

//打印链表
static int print_single_list(Node* head)
{
    if((!head->next) && (!head))
        return -1;

    Node* tmp_node = head->next;
    while(tmp_node)
    {
        printf("%d ",tmp_node->data);
        tmp_node = tmp_node->next;
    }
    putchar('\n');
    return 0;
}

//删除链表中的某个节点
static int delete_node(Node* head,int data)
{
    if((!head->next) && (!head))
        return -1;

    Node* node = head;
    Node* tmp_node = node->next;
    while(tmp_node)
    {
        if (tmp_node->data == data)
        {
            node->next = tmp_node->next;
            free(tmp_node);
            printf("head->data start is %d\n",head->data);
            head->data--;
            printf("head->data end-- is %d\n",head->data);
            return 0;
        }
        node = tmp_node;
        tmp_node = tmp_node->next;
    }
    return -1;
    
}

/*
有问题的写法(free有问题)
static int delete_node_1(Node* head,int data)
{
    if((!head->next) && (!head))
        return -1;

    Node* tmp_node = head;
    Node* node = tmp_node;
    //Node* tmp_node = node->next;
    while(node->next)
    {
        if (node->next->data == data)
        {
            tmp_node->next = node->next->next;
            //free(tmp_node->next);   //直接free会发生错误
            printf("head->data is %d\n",head->data);
            head->data--;
            printf("head->data is %d\n",head->data);
            return 0;
        }
        tmp_node = node;
        node->next = node->next->next;
    }
    return -1;    
}*/

//指定在某个节点后面加入新节点
static int insert_from_node_tail(Node* head,int num,int data)
{
    if((!head->next) && (!head))
        return -1;

    Node* tmp_node = head;
    Node* node = (Node*)malloc(sizeof(Node));
    node->data = data;
    while (tmp_node->next)
    {
        if (tmp_node->next->data == num)
        {
            node->next = tmp_node->next->next;
            tmp_node->next->next = node;
            head->data++;
            printf("insert_from_node_tail ok\n");
            return 0;
        }
        tmp_node = tmp_node->next;
    }
    return -1;
}
//指定在某个节点前面加入新节点
static int insert_from_node_head(Node* head,int num,int data)
{
    if((!head->next) && (!head))
        return -1;

    Node* tmp_node = head;
    Node* node = (Node*)malloc(sizeof(Node));
    node->data = data;
    while (tmp_node->next)
    {
        if (tmp_node->next->data == num)
        {
            node->next = tmp_node->next;
            tmp_node->next = node;
            head->data++;
            printf("insert_from_node_head ok\n");
            return 0;
        }
        tmp_node = tmp_node->next;
    }
    return -1;
}
int main()
{
    Node* head = init_single_list();
    //Node* head_1 = init_single_list(head,12);
    int list_d;
    int insert_value;
    //insert_from_head(head,12);
    printf("please input data to insert the list and how many you want to insert\n");
    scanf("%d",&list_d);
    printf("list_d is %d\n",list_d);

    for (int i = 1; i <= list_d ; i++)
    {
        printf("please input insert_value %d:\n",i);
        scanf("%d",&insert_value);
        //insert_from_head(head,insert_value);
        insert_from_tail(head,insert_value);
        //tailInsert(head,insert_value);
        printf("insert_value is %d\n",insert_value);
    }
    
    //insert_from_head(head,12);
    print_single_list(head);
    printf("in main_1 head->data is %d\n",head->data);
    insert_from_node_tail(head,12,55555);
    print_single_list(head);
    printf("in main_2 head->data is %d\n",head->data);

    insert_from_node_head(head,55555,6666);
    print_single_list(head);
    printf("in main_3 head->data is %d\n",head->data);

    int ret = delete_node(head,12);
    if(-1 == ret)
        printf("the data is not in the list\n");
    else
        print_single_list(head);
    
    return 0;
}

在这里插入图片描述

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

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

相关文章

想知道搭建知识库有什么重点?看这篇就够了

在目前这个提倡无纸化的时代&#xff0c;搭建一个知识库已经是一种潮流。无论是个人还是企业来说&#xff0c;都是特别重要的一个工具。今天looklook就从搭建知识库的重点这方面来展开&#xff0c;详细地告诉大家该如何成功搭建一个完善的知识库。 搭建知识库的重点 1.建立素材…

ASUS华硕飞行堡垒8笔记本FX506LH LI LU FX706原装出厂 Win10系统工厂模式20H2

自带所有驱动、出厂主题壁纸LOGO、Office办公软件、MyASUS电脑管家、奥创控制中心等预装程序 所需要工具&#xff1a;16G或以上的U盘 文件格式&#xff1a;HDI,SWP,OFS,EDN,KIT,TLK多个底包 文件大小&#xff1a;10.95GB 注&#xff1a;恢复时会清空电脑上所有盘的数据&…

大小端模式

文章目录 一、概念二、举例三、判大小端和交换 一、概念 大端模式&#xff08;Big-endian&#xff09;&#xff0c;是一种数据存储方式&#xff0c;其中较高的字节&#xff08;最高有效字节&#xff09;存储在较低的内存地址&#xff0c;较低的字节&#xff08;最低有效字节&am…

php 开发微信 h5 支付 APIv3 接入超详细流程

✨ 目录 &#x1f388; 申请商户号&#x1f388; 申请商户证书&#x1f388; 设置V3密钥&#x1f388; 开通H5支付&#x1f388; 设置支付域名&#x1f388; SDK 下载&#x1f388; 第一次下载平台证书&#x1f388;非第一次下载平台证书&#x1f388; H5下单 &#x1f388; 申…

如何在WordPress网站中更改字体(8 种方法)

字体在网站设计中起着至关重要的作用。它们为设计和整体美学定下了基调&#xff0c;可以增强或削弱其外观和感觉。为您的网站选择字体集后&#xff0c;您需要知道如何更改它们。在 WordPress 中更改字体的方法有多种。如何更改它们取决于许多因素&#xff0c;包括您使用的主题类…

西安---高时空分辨率、高精度一体化预测技术之风、光、水能源自动化预测技术应用

能源是国民经济发展和人民生活必须的重要物质基础。在过去的200多年里&#xff0c;建立在煤炭、石油、天然气等化石燃料基础上的能源体系极大的推动了人类社会的发展。但是人类在使用化石燃料的同时&#xff0c;也带来了严重的环境污染和生态系统破坏。近年来&#xff0c;世界各…

9、PHP超级全局变量$_REQUEST 、$_POST、$_GET

1、PHP $_REQUEST 、$_POST用于收集HTML表单提交的数据。 以下代码演示了一个输入字段&#xff08;input&#xff09;及提交按钮(submit)的表单(form)。 当用户通过点击 "Submit" 按钮提交表单数据时, 表单数据将发送至<form>标签中 action 属性中指定的脚本文…

在阿里云平台注册一个域名

我们访问阿里云官网 阿里云 然后 我们右上角点击登录 然后 按正常操作流程登录 登录成功后 我们点击控制台 我们将鼠标 移入 右上角 图片指向的位置 我们点击域名 进入界面后点击注册域名 在输入框中输入域名内容 然后 按回车 然后弹出的列表 我们可以选一个未注册的 点击…

学习Dubbo前你要了解这些

文章目录 Dubbo的发展背景单一应用架构垂直应用架构分布式服务架构流动计算架构 RPCRPC的简单原理 DubboDubbo是什么Dubbo作者Dubbo的发展历程Dubbo架构 Dubbo发音&#xff1a; |ˈdʌbəʊ| Dubbo官方网站&#xff1a;http://dubbo.apache.org/ Dubbo是阿里巴巴开发的&#…

【Linux系统】结合有趣的小故事让你学懂生产者消费者模型

目录 由故事引入模型故事背景供货商们的矛盾市民们和供货商之间的矛盾一市民们和供货商之间的矛盾二市民们的矛盾模型总结 生产者消费者模型为什么要使用生产者消费者模型&#xff1f;生产者消费者模型的特点生产者消费者模型优点 基于BlockingQueue的生产者消费者模型C queue模…

含CPU芯片的PCB可制造性设计问题详解

CPU是中央处理器&#xff0c;Central Processing Unit 英文的缩写&#xff0c;电脑中一个最重要&#xff0c;最核心的东西&#xff0c;相当一个人的大脑&#xff0c;是用来思考、分析和计算的。目前市面上比较常见的CPU来自两个品牌&#xff0c;一个是intel公司生产的&#xff…

电脑数据恢复:恢复Windows中永久删除的文件

什么是数据恢复及其工作原理&#xff1f; 一般来说&#xff0c;数据恢复是从内部和外部硬盘、固态硬盘、USB、SD卡和其他辅助存储设备中恢复无法访问、删除、丢失、损坏的数据的过程。 删除文件后&#xff0c;你的Windows操作系统会自动将不需要的文件保存到回收…

Windows系统中数据标注软件LabelImg的安装和基本使用

文章目录 前言安装LabelImgLabelImg基本使用LabelImg支持的快捷键相关链接 前言 LabelImg是国立台湾大学&#xff08;National Taiwan University&#xff09;的Tzuta Lin主导完成&#xff0c;并基于免费软件许可MIT LICENSE发布在github上的一款计算机视觉&#xff08;Comput…

Ansible自动化运维工具的认识

目录 一、Ansible概述 二、Ansible特点 三、Ansible应用 1、使用者 2、Ansible工具集合 3、作用对象 四、Ansible的搭建 1、实验环境 2、环境准备 Ansible&#xff1a; 3、创建ssh免密交互登录 client端环境准备 五、Ansible配置 六、Ansible命令 1、ansible 实…

【C++ 重要知识点总结】表达式

表达式 1 基础 组合运算 优先级结合律 类型转换 运算符重载 左值和右值 2 算数运算符 3 逻辑和关系运算法 短路求值 逻辑与&#xff0c;当第一个判定为否的时候&#xff0c;不再执行第二个判定&#xff0c;可以用来屏蔽第二步的计算&#xff0c;代替条件判断&#xff0…

为什么很多公司都开始使用Go语言了?

越来越多的互联网大厂开始使用Go语言了&#xff0c;譬如腾讯、美团、滴滴、百度、Google、bilibili... 还有最初使用Python的字节跳动&#xff0c;甚至已经全面拥向Go了。这么多国内外首屈一指的公司&#xff0c;都在开始使用它了&#xff0c;它到底有什么优势呢&#xff1f;这…

03.MySQL——索引和事务

索引 索引的概念 索引可以提高数据库的性能。不用加内存&#xff0c;不用改程序&#xff0c;不用调sql&#xff0c;只要执行正确的 create index &#xff0c;查询速度就可能提高成百上千倍。但是查询速度的提高以插入、更新、删除的速度为代价。索引的价值在于提高一个海量数…

SOT封装特点和优势,sot23封装尺寸

SOT封装是一种常用的集成电路封装类型&#xff0c;常见的SOT封装类型包括3引脚&#xff08;如SOT-23&#xff09;、4引脚&#xff08;如SOT-89和SOT-223&#xff09;和6引脚&#xff08;如SOT-363&#xff09;&#xff0c;可以适应不同的电路设计和功能要求。具有以下特点和优势…

Springboot配置相关问题

目录 一.ConfigurationProperties注解补充知识&#xff1a; 二、松散绑定三、常用计量单位的应用四、数据校验补充知识 一.ConfigurationProperties注解 使用该注解可以为Bean绑定application.yml中的属性值。以下就是使用ConfigurationProperties注解的示例 项目结构 Serve…

Halcon机器视觉-15种常用缺陷检测实例

一、Halcon 15种常用缺陷检测实例分享 缺陷检测是一种通过计算机视觉技术来检测产品制造过程中的缺陷的方法。该技术可以检测出产品表面的缺陷&#xff0c;如裂纹、凹陷、划痕、气泡等&#xff0c;并且可以实时监测和诊断制造过程中的问题。在制造业中&#xff0c;机器视觉缺陷…