当前位置: 首页 > article >正文

数据结构——单链表相关操作

zhuzhu1、结构框图:

2、增删改查:

定义链表节点和对象类型

/*************************************************************************
	> File Name: link.h
	> Author: yas
	> Mail: rage_yas@hotmail.com
	> Created Time: Tue 03 Sep 2024 11:30:03 AM CST
 ************************************************************************/

#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 *create_link();
extern int push_link_head(Link_t *plink,DataType data);
extern void print_link(Link_t *plink);
extern int push_link_tial(Link_t *plink,DataType data);
int pop_head(Link_t *plink);
int pop_tail(Link_t *plink);
int clear_link(Link_t *plink);
int update_link_data(Link_t *plink,DataType old_data,DataType new_data);
int *find_link_data(Link_t *plink,DataType data);

#endif

程序

/*************************************************************************
> File Name: link.c
> Author: yas
> Mail: rage_yas@hotmail.com
> Created Time: Tue 03 Sep 2024 11:29:54 AM CST
************************************************************************/

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

//创建一个链表对象
Link_t *create_link()
{
    //在堆上开辟sizeof(link_t)大小的空间
    Link_t *plink = malloc(sizeof(Link_t));  
    if(NULL == plink)//判断创建成功
    {
        perror("fail malloc");
        return NULL;
    }
    plink->phead = NULL;//初始化头指针
    plink->clen = 0;    //初始化当前链表长度
    return plink;       //返回创建好的链表对象
}

//头插
int push_link_head(Link_t *plink,DataType data)
{
    //堆上开空间
    Link_Node_t *pnode = malloc(sizeof(Link_Node_t));
    if(NULL == pnode)
    {
        perror("fail malloc");
        return -1;
    }
    pnode->data = data;  //初始化节点->数据域
    pnode->pnext = NULL; //初始化节点->指针域

    pnode->pnext = plink->phead; //头插
    plink->phead = pnode;        //头结点指向新节点

    plink->clen++; 
    return 0;
}

//遍历

void print_link(Link_t *plink)
{
    Link_Node_t *p = plink->phead;
    while(p != NULL)
    {
        printf("%d\n",p->data);
        p = p->pnext;
    }
}

//判空

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

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

        plink->phead = pnode;
    }
    else
    {
        Link_Node_t *p = plink->phead;
        while(p->pnext != NULL)
        {
            p = p->pnext;
        }
        p->pnext = pnode;
    }
    plink->clen++;
    return 0;
}

//头删
int pop_head(Link_t *plink)
{

    Link_Node_t *p = plink->phead;
    if(is_empty_link(plink))
    {
        return 0;
    }
    else
    {
        plink->phead = p->pnext;
    }
    plink->clen--;
    free(p);
}

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

    return 0;
}

//清空链表
int clear_link(Link_t *plink)
{
    Link_Node_t *p = plink->phead;
    while(!(is_empty_link(plink)))
    {
        pop_head(plink);
    }
}

//修改数据
int update_link_data(Link_t *plink,DataType old_data,DataType new_data)
{
    Link_Node_t *p = plink->phead;
    if(is_empty_link(plink))
    {
        printf("link is empty\n");
        return 0;
    }
    else
    {
        while(p->data != old_data)
        {
            p = p->pnext;
        }
        p->data = new_data;
    }
}

//查找数据
int *find_link_data(Link_t *plink, DataType data)
{
    Link_Node_t *p = plink->phead;
    while (p != NULL)  
    {
        if (p->data == data)  
        {
            printf("%p\n", p);  
        }
        p = p->pnext;  
    }
    return NULL;  
}

int main()
{
    
    Link_t *plink = create_link();
    if(NULL == plink)
    {
        return -1;
    }
    push_link_head(plink,4);
    push_link_head(plink,3);
    push_link_head(plink,2);
    push_link_head(plink,1);
    //clear_link(plink);
    push_link_tial(plink,5);
    push_link_tial(plink,6);
    push_link_tial(plink,7);
    push_link_tial(plink,8);
    //pop_head(plink);
    //pop_tail(plink);
    //print_link(plink);
    update_link_data(plink,7,9);
   // find_link_data(plink,5);
    print_link(plink);
    return 0;
}

http://www.kler.cn/a/288887.html

相关文章:

  • 【LuaFramework】服务器模块相关知识
  • LSTM-SVM时序预测 | Matlab基于LSTM-SVM基于长短期记忆神经网络-支持向量机时间序列预测
  • 大模型-使用Ollama+Dify在本地搭建一个专属于自己的聊天助手与知识库
  • x86_64 Ubuntu 编译安装英伟达GPU版本的OpenCV
  • 虚幻引擎是什么?
  • LeetCode:257. 二叉树的所有路径
  • C# 开发环境搭建(Avalonia UI、Blazor Web UI、Web API 应用示例)
  • n*n矩阵,输出矩阵中任意两点之间所有路径
  • 使用组件库:提升开发效率的关键
  • Arduino library for proteus 下载 安装 测试
  • <数据集>TACO垃圾识别数据集<目标检测>
  • 编译与链接
  • ArrayList 和 LinkedList 之间的主要区别。在什么情况下你会选择使用 ArrayList 而不是 LinkedList,反之亦然?
  • 文本数据分析-(TF-IDF)(1)
  • 突发性网络攻击的安全挑战分析
  • Google Play下架超110万款应用,中国成重灾区
  • HiveQL如何统计用户近一段时间活跃标签
  • 设计模式 17 中介者模式
  • Spring优缺点和SpringBoot基础和搭建
  • 数据库系统 第31节 物理存储与文件系统
  • 奇安信天眼--探针/分析平台部署及联动
  • MySQL5.7配置优化
  • h5适配iOS——window.open失效
  • 搭建pypi私有仓库(局域网内)出现的一些问题及解决方法
  • 【数据库|第11期】深入掌握 SQL Server、Access 与 SQLite 中的 `UNION` 与 `UNION ALL`:从理论到实践
  • windows系统安装配置Apache Maven