数据结构(单向链表)

news2024/11/15 10:50:53

单向链表代码

#ifndef _LINK_H_

#define _LINK_H_

typedef int DataType;

typedef struct node
{
    DataType data;
    struct node *pnext;
}Link_Node_t;


typedef struct link
{
    Link_Node_t *phead;
    int clen;
}Link_t;

extern Link_t *link_creat();
extern int push_link_head(Link_t *plink, DataType data);
extern int print_link_all(Link_t *plink);
extern int push_link_tail(Link_t *plink, DataType data);
extern int pop_link_head(Link_t *plink);
extern int pop_link_tail(Link_t *plink);
extern Link_Node_t * find_link_data(Link_t *plink, DataType data);
extern int change_link_data(Link_t *plink, DataType des, DataType src);
extern int delall_link_data(Link_t *plink);
extern Link_Node_t* med_link_data(Link_t *plink);
extern Link_Node_t* find_link_tail_k(Link_t* plink, int k);
extern int del_k_link(Link_t *plink, int k);

#endif

#include "link.h"
#include <stdio.h>
int main(void)
{
    int ret = 0;
    Link_Node_t* find = NULL;
    Link_t *plink = link_creat();
    if(plink ==  NULL)
    {
        printf("link_creat fail");
        return -1;
    }
    
    push_link_head(plink, 1);
    push_link_head(plink, 2);
    push_link_head(plink, 3);
    push_link_head(plink, 4);
    push_link_head(plink, 5);

    push_link_tail(plink, 6);
    push_link_tail(plink, 7);
    push_link_tail(plink, 8);
    push_link_tail(plink, 9);

    print_link_all(plink);

    pop_link_head(plink);
    pop_link_tail(plink);

    print_link_all(plink);

    find = find_link_data(plink, 10);
    if(NULL == find)
    {
        printf("没找到\n");
    }
    else
    {
        printf("index = %p\n", find);
    }

    ret = change_link_data(plink, 3, 50);
    if(ret == 1)
    {
        printf("没有需要修改的数据\n");
    }

    print_link_all(plink);

    //delall_link_data(plink);

    /*
    printf("清除\n");
    plink = link_creat();
    push_link_tail(plink, 6);
    print_link_all(plink);
*/

   find = med_link_data(plink);
   if(NULL == find)
   {
        printf("空链表\n");
   }
   else
   {
        printf("index = %p\n", find);
   }

   find = find_link_tail_k(plink, 4);
    if(NULL == find)
    {
        printf("没找到\n");
    }
    else
    {
        printf("index = %p\n", find);
    }

    ret = del_k_link(plink, 4);
    if(-1 == ret)
    {
        printf("不存在该节点\n");
    }

    print_link_all(plink);
    return 0;
}

#include "link.h"
#include <stdlib.h>
#include <stdio.h>

//创建头部
Link_t *link_creat()
{
    Link_t *plink = (Link_t *)malloc(sizeof(Link_t));
    if(NULL == plink)
    {
        perror("malloc fail");
        return NULL;
    }

    plink->phead = NULL;
    plink->clen = 0;

    return plink;
}

//头插
int push_link_head(Link_t *plink, DataType data)
{
    Link_Node_t *pnode = (Link_Node_t *)malloc(sizeof(Link_Node_t));
    if(NULL == pnode)
    {
        perror("malloc fail");
        return -1;
    }

    pnode->data = data;
    pnode->pnext = NULL;

    pnode->pnext = plink->phead;
    plink->phead = pnode;

    plink->clen++;

    return 0;
}
//判空
int is_empty_link(Link_t *plink)
{
    return NULL == plink->phead;
}

//尾插
int push_link_tail(Link_t *plink, DataType data)
{
    Link_Node_t *pnode = (Link_Node_t *)malloc(sizeof(Link_Node_t));
    if(NULL == pnode)
    {
        perror("malloc fail");
        return -1;
    }
    pnode->data = data;
    pnode->pnext = NULL;


    Link_Node_t *p = plink->phead;
    if(is_empty_link(plink))
    {
        plink->phead = pnode;
    }
    else
    {
        while(p->pnext != NULL)
        {
            p = p->pnext;
        }
        p->pnext = pnode;
    }

    plink->clen++;
    
    return 0;
}

//遍历
int print_link_all(Link_t *plink)
{
    Link_Node_t *p = plink->phead;
    while(p != NULL)
    {
        printf("%d ", p->data);
        p = p->pnext;
    }
    putchar('\n');
    return 0;
}

//头删
int pop_link_head(Link_t *plink)
{
    int i = 0;
    if(is_empty_link(plink))
    {
        i = 0;    
    }
    else
    {
        Link_Node_t *p = plink->phead;
        plink->phead = p->pnext;
        p->pnext = NULL;
        free(p);
        plink->clen--;

        i = 1;
    }

    return i;
}

//尾删
int pop_link_tail(Link_t *plink)
{
    int i = 0;
    if(is_empty_link(plink))
    {
        i = 0;
    }
    else
    {
        if(plink->clen == 1)
        {
            pop_link_head(plink);
        }
        else
        {
            Link_Node_t *p = plink->phead;
            while(p->pnext->pnext != NULL)
            {
                p = p->pnext;
            }

            free(p->pnext);
            p->pnext = NULL;
            i = 1;
            plink->clen--;
        }
    }
    return i;
}
//查找对应数据的节点地址
Link_Node_t * find_link_data(Link_t *plink, DataType data)
{
    Link_Node_t *p = plink->phead;

    while(p != NULL)
    {
        if(p->data == data)
        {
            return p;
        }
        p = p->pnext;
    }

    return NULL;
}
//改变对应数据
int change_link_data(Link_t *plink, DataType des, DataType src)
{
    Link_Node_t *p = plink->phead;

    while(p != NULL)
    {
        if(p->data == des)
        {
            p->data = src;
            return 0;
        }
        p = p->pnext;
    }

    return 1;
}
//清楚
int delall_link_data(Link_t *plink)
{
    while(1)
    {
        if(is_empty_link(plink))
        {
            free(plink);
            break;
        }
        else
        {
            pop_link_head(plink);
        }
    }
    return 0;
}

Link_Node_t* med_link_data(Link_t *plink)
{
    printf("clen = %d\n", plink->clen);
    int med = (plink->clen / 2) + 1;
    int num = 1;
    Link_Node_t *p = plink->phead;

    if(plink->clen == 0)
    {
        return NULL;
    }

    while(p != NULL)
    {
        if(num == med)
        {
            printf("data = %d\n", p->data);
            return p;
        }
        p = p->pnext;
        num ++;
    }

    return NULL;
}

Link_Node_t* find_link_tail_k(Link_t* plink, int k)
{
    int num = 0;
    if(k > plink->clen)
    {
        return NULL;
    }

    int find_k = plink->clen - k;
    printf("num = %d  k = %d\n", num, k);

    Link_Node_t *p = plink->phead;

    while(p != NULL)
    {
        if(num == find_k)
        {
            printf("data = %d\n", p->data);
            return p;
        }
        ++num;
        p = p->pnext;
    }

    return NULL;
}

int del_k_link(Link_t *plink, int k)
{
    int num = 1;

    if(k > plink->clen)
    {
        return -1;
    }
    else if(k == 1)
    {
        pop_link_head(plink);
        return 0;
    }
    else if(k == plink->clen)
    {
        pop_link_tail(plink);
        return 0;
    }

    Link_Node_t* p = plink->phead;
    
    while(p != NULL)
    {
        if(num == k - 1)
        {
            Link_Node_t *p1 = p->pnext;
            p->pnext = p->pnext->pnext;
            free(p1);
        }
        ++num;
        p = p->pnext;
    }

    return 0;
}

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

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

相关文章

智慧公厕技术应用、系统架构、应用功能有哪些?@卓振思众

智慧公厕的标准涵盖了多个方面&#xff0c;包括技术应用、系统架构、应用功能以及环保节能等。以下是【卓振思众】整理的一些标准要点&#xff1a; 技术应用‌物联网技术‌&#xff1a;通过无线传感器、监控设备等实时采集公厕内部环境数据。‌大数据与云计算‌&#xff1a;对数…

2157. 优秀的拆分(power)

代码 #include<bits/stdc.h> using namespace std; int a[10001]; int main() {int n,t1,k0;bool flagfalse;cin>>n;if(n%21) {cout<<-1;return 0;}while(n>0){if(n%21){k;a[k]t; }nn/2;tt*2;}if(k>1) {flagtrue;for(int ik;i>1;i--)cout<&l…

lit-llama代码解析

https://github.com/Lightning-AI/lit-llama/blob/main/README.md 下载的时候会报错误&#xff0c;因为网不行&#xff0c;一种方法就是多次尝试&#xff0c;另一种方法是终端连上代理下载 pycharm连接hugging face等网站_hugging face怎么连接-CSDN博客 根据指引下载权重 下…

springboot,maven多模块开发,子模块获取不到父模块添加的依赖,有多个root模块问题解决

错误示范 我以为放进去然后重载一下就是子模块了 导致后续在外层加的依赖&#xff0c;其article都接收不到 解决方案 需要在父模块的modules注册子模块 修改前后对比 此时子模块也能获取父模块的依赖

DDD设计方法-2-聚合、实体、值对象

前情提要&#xff1a;一共包含 如下六篇文章&#xff08;篇幅精简&#xff0c;快速入门&#xff09; 1、初识DDD 2、聚合、实体、值对象 3、仓储&#xff0c;封装持久化数据 4、端口和适配器 5、领域事件 6、领域服务&#xff0c;实现约定 DDD设计方法-2-聚合、实体、值对象&a…

基于mspm0g3507的智能送药小车(21年电赛f题,openmv寻迹,k210数字识别,并行pid调制)项目实验报告

2024年全国大学生电子设计竞赛&#xff08;TI杯&#xff09; 2024年7月17日 摘要&#xff1a;本项目由微处理器MSPM0G3507&#xff0c;编码器电机驱动&#xff0c;OPENMV、K210视觉处理单元&#xff0c;红外药品检测单元&#xff0c;ZIGBEE无限透传单元&#xff0c;OLED显示&am…

Docker数据卷和Dockerfile

1、什么是Docker数据卷 前言&#xff1a; 在下载的镜像中&#xff0c;我们不能够去改变它内部的一些配置&#xff0c;因为docker的镜像文件是已经配置好的&#xff0c;无法改变&#xff0c;我们只能改变镜像启动后的容器里面的内容&#xff0c;但是又因为&#xff0c;容器本来…

Java框架第四课(对Spring的补充Spring web)

目录 一.Spring web的认识 (1)Spring Web概念 (2)Spring web的特点 (3)Springweb运行的流程 (4)Springweb运行的流程图 二.搭建Spring web 三.自定义处理器类搭建 (1)处理器类配置 (2)处理器类接受请求 (3)获得请求数据 四.拦截器 (1)关于拦截器&#xff1a; (2)拦截器的…

【VMware】麒麟系统网络连接配置

在VMware配置页面点击编辑&#xff0c;进入虚拟网络编辑器将默认的 VMnet0删除&#xff0c;新建网络&#xff0c;设置桥接模式为Intel 打开主机cmd,查看主机IP地址&#xff0c;获取子网掩码&#xff0c;默认网关及DNS服务器 4.在主机寻找可用IP地址&#xff0c;ping不通的为未…

探秘发酵过程:酵母菌如何为白酒赋予不同风味?

在白酒酿造的神秘世界里&#xff0c;发酵过程如同一位隐形的艺术家&#xff0c;用其不同的笔触为白酒勾勒出千变万化的风味。而在这背后&#xff0c;酵母菌作为发酵的主角&#xff0c;发挥着至关重要的作用。今天&#xff0c;就让我们一起探秘发酵过程&#xff0c;了解酵母菌如…

shell 学习笔记:变量、字符串、注释

目录 1. 变量 1.1 定义使用变量 1.2 变量命名规则 1.3 只读变量 1.4 删除变量 1.5 变量类型 1.5.1 字符串变量 1.5.2 整数变量 1.5.3 数组变量 1.5.3.1 整数索引数组 1.5.3.2 关联数组 1.4 环境变量 1.5 特殊变量 2. 字符串 2.1 单引号字符串 2.2 双引…

erlang学习:用OTP构建系统23.12练习题

练习要求 制作一个名为prime_tester_server的gen_server&#xff0c;让它测试给定的数字是否是质数。 你可以使用lib_primes.erl里的is_prime/2函数来处理&#xff08;或者自己实现一个更好的质数测试函 数&#xff09;。把它添加到sellaprime_supervisor.erl的监控树里。 质…

图论(2)

一、度 度统计的是一个节点上又多少条边 度出度入度 出度&#xff1a;统计以该节点为起始点箭头指向外面的边的条数 入度&#xff1a;统计箭头指向该节点的边数 度为1的节点为悬挂节点&#xff0c;边为悬挂边 用矩阵计算节点的度 二、握手定理 比如这里第一个集合里面有三…

ARP协议(原理,特点,报文格式,具体过程),ARP缓存(有效时间,为什么),ARP欺骗(定向断网,成为中间人),RARP简单介绍

目录 ARP协议 引入 介绍 原理 arp请求/响应 特点 报文格式 硬件类型 协议类型 硬件/协议地址长度 op(操作码) 过程 发送请求并处理 返回响应并处理 总结 arp缓存 介绍 arp表项的有效时间 解释 arp欺骗 介绍 定向断网 基于arp的成为中间人的方式 多向…

跟李沐学AI:序列模型

目录 序列数据 自回归模型 马尔可夫假设 潜变量模型 序列模型总结 序列数据 实际中很多数据是时序结构的&#xff0c;如&#xff1a;电影的评价随时间的变化而变化&#xff1a;拿奖后评分上升、电影整体质量提升&#xff0c;人们要求变高。。。等等 除此之外&#xff0c;音…

比特币网络和支付

1. 比特币网络 比特币网络是一个去中心化的点对点网络&#xff0c;节点之间可以直接进行交易。网络上有不同类型的节点。 1.1 比特币网络的节点 比特币网络的节点有两种主要类型&#xff1a;全节点也称为完整节点和简单支付验证&#xff08;Simple Payment Verification,SPV)节…

档案|基于SprinBoot+vue的档案管理系统(源码+数据库+文档)

档案管理系统 基于SprinBootvue的档案管理系统 一、前言 二、系统设计 三、系统功能设计 管理员功能模块实现 学生功能模块实现 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1a;✌️大厂码农…

【数据库|第11期】深入掌握 SQL Server、Access 与 SQLite 中的 `UNION` 与 `UNION ALL`:从理论到实践

日期&#xff1a;2024年9月3日 作者&#xff1a;Commas 签名&#xff1a;(ง •_•)ง 积跬步以致千里,积小流以成江海…… 注释&#xff1a;如果您觉得有所帮助&#xff0c;帮忙点个赞&#xff0c;也可以关注我&#xff0c;我们一起成长&#xff1b;如果有不对的地方&#xff…

EMC整改问题

定位问题: 1.控制变量比较法:连和不连&#xff0c;接和不接来判断 2.频率判断法:低频一般是电源&#xff0c;高频一般是信号或者无线通信问题&#xff0c;还有倍频问题 3.解决方法: a.加器件&#xff0c;滤波&#xff0c;EMI共模电感&#xff0c;磁环 b.电源&#xff0c;高速信…

App推广新篇章:Xinstall带你走出数据迷雾,实现高效推广!

在如今的移动互联网时代&#xff0c;App推广已成为每个应用开发者必须面对的重要课题。然而&#xff0c;推广过程中往往伴随着诸多痛点&#xff0c;如数据混乱、投放盲目、决策滞后以及作弊困扰等。这些问题不仅影响了推广效果&#xff0c;还可能导致资源的浪费和投入产出不均衡…