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

数据结构----链表

1.数据结构基本概念

        数据结构:是一组用来保存一种或者多种特定关系的数据的集合,其核心在于如何组织和存储数据。

1.1数据结构的分类

        集合:其中的元素之间关系平等,没有明显的层级或关系链。

        图形结构:元素之间形成多对多的关系,形成网状结构,非常适合表示复杂的关系网络。

        树型结构:元素之间具有一对多的关系,最典型的例子是二叉树,它有效地表达了层级和分支的关系。

        线性结构:元素之间仅存在一对一的关系,线性表(如数组、链表)、队列、栈等都是线性

结构的实现。这些结构的特点是数据项之间有序排列。

        顺序存储:使用一段连续的内存空间来保存元素。其优点是空间连续,访问方便;但缺点是

插入和删除操作需要移动大量元素,且需要预分配内存空间,易造成存储空间碎片。

        链式存储:与顺序存储不同,链式存储采用一组非连续的内存空间来保存元素。每个元素

(或称为节点)除了存储数据外,还包含指向下一个元素的指针(单向链表)或指向前后元素的指

针(双向链表)。优点是插入和删除数据方便,不需要预分配内存;缺点是访问元素效率较低。

其他存储方式

        索引存储:通过关键字构建索引表,快速找到数据的存储位置,提高了数据检索的效率。

        散列存储(哈希存储):将数据元素的存储位置与其关键码之间建立确定的对应关系,实现了快速查找的存储方式。

1.2 示例

link.h


#ifndef __LINK_h__
#define __LINK_h__

typedef int DataType;//链表存储数据类型;

typedef struct node//链表结点类型;
{
    DataType date;               //  数据域;
    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 printf_link(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 data,DataType new_data);
extern int pop_link_all(Link_t * plink);
extern Link_node_t *find_link_end_k_node(Link_t *plink,int k);
extern Link_node_t *find_mid_link_node(Link_t *plink);
extern int delete_link(Link_t *plink , DataType n);

#endif

link.c

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


Link_t *create_link()
{
    Link_t *plink = (Link_t *)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 = (Link_node_t *)malloc(sizeof(Link_node_t));
    if(NULL == pnode )
    {
        perror("fail malloc");
    }
    pnode->date = data;
    pnode->pnext = NULL;
    pnode->pnext= plink->phead;
    plink->phead= pnode;
    plink->clen +=1;
}
void printf_link(Link_t *plink)
{
    Link_node_t *p = plink->phead;
    while(p!= NULL)
    {
        printf("%d  ",p->date);
        p=p->pnext;
    }
    printf("clen = %d\n",plink->clen);
}
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("fail malloc");
    }
    pnode->date = data;
    pnode->pnext = NULL;
    if(plink->phead == NULL)
    {
        push_link_head(plink,data);
    }
    else
    {
        Link_node_t *p = plink->phead;
        while(p->pnext != NULL)
        {
            p=p->pnext;
        }
        p->pnext=pnode;
        plink->clen+=1;

    }
    return 0;
}
int pop_link_head(Link_t *plink)
{
    Link_node_t *p = plink->phead;
    if(NULL == plink->phead)
    {
        return 0;
    }
    plink->phead= p->pnext;
    free(p);
    plink->clen -=1;

    return 0;
}
int pop_link_tail(Link_t *plink)
{  
    Link_node_t *p = plink->phead;
    
    if(NULL == plink->phead)
    {
        return 0;
    }
    else if(plink->clen==1)
    {
        pop_link_head(plink);   
    }
    else
    {
        while(p->pnext->pnext !=NULL)
        {
            p=p->pnext;
        }
        free(p->pnext);
        p->pnext = NULL;
        plink->clen -=1;
    }
    return 0;
}

Link_node_t *find_link_data(Link_t *plink, DataType data)
{
    Link_node_t *p = plink->phead;
    if(plink->clen ==0)
    {
        return NULL;
    }
    else
    {
        while(p!= NULL)
        {
            if(p->date == data)
            {
                printf("find\n");
                return p;
            }
            p=p->pnext;

        }
        printf("no find\n");
        return NULL;
    }
}

int change_link_data(Link_t *plink,DataType data,DataType new_data)
{
    Link_node_t *p =find_link_data(plink,data);
    if(p==NULL)
    {
        return -1;
    }
    p->date =new_data;
    return 0;
}

int pop_link_all(Link_t * plink)
{
    for(int i =0;i<plink->clen;++i)
    {
        pop_link_head(plink);
    }
    free(plink);
    return 0;
}

Link_node_t *find_mid_link_node(Link_t *plink)
{
    Link_node_t *p = plink->phead;
    if(plink->clen ==0)
    {
        return NULL;
    }
    for(int i = 0 ; i < plink->clen / 2; ++i)
    {
        p = p->pnext;
    }
    printf("mid=%d\n",p->date);
    return p;
}
Link_node_t *find_link_end_k_node(Link_t *plink,int k)
{
    Link_node_t *p = plink->phead;
    if(plink->clen ==0)
    {
        return NULL;
    }
    int a = plink->clen-k;
    if(a<0)
    {
        return NULL;
    }
    else
    {
        for(int i = 0 ; i < a; ++i)
        {
            p = p->pnext;
        }       
        printf("k=%d\n",p->date);
        return p;
    }
}
int delete_link(Link_t *plink , DataType n)
{
    if(plink->clen == 0)
    {
        return 0;
    }
    else if(plink->clen == 1)
    {
        pop_link_head(plink);
        return 1;
    }
    Link_node_t *p = plink->phead;
    Link_node_t *q = plink->phead;
    int i = 0;
    for(i = 0 ; i < n - 1 ; ++i)
    {
        p = p->pnext;
    }
    for(i = 0 ; i < n - 2 ; ++i)
    {
        q = q->pnext;
    }
    q->pnext = p->pnext;
    free(p);
    plink->clen--;
    return 1;
}


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

相关文章:

  • docker更改数据目录
  • ubuntu连接orangepi-zero-2w桌面的几种方法
  • C++ 的协程
  • java八股-jvm入门-程序计数器,堆,元空间,虚拟机栈,本地方法栈,类加载器,双亲委派,类加载执行过程
  • 数据集标注txt文件读取小工具
  • 【大数据测试HBase数据库 — 详细教程(含实例与监控调优)】
  • C# 特性与属性的区别
  • iOS 中,用户点击一个按钮到响应的全部流程
  • 【网络安全】服务基础第二阶段——第二节:Linux系统管理基础----Linux统计,高阶命令
  • 利用Spring Boot打造图书个性化推荐平台
  • C语言练习题之 数组中出现次数超过一半的数
  • C# 通过拖控件移动窗体
  • MySQL · 性能优化 · 提高查询效率的实用指南(上)
  • 第十四节:学习Springboot 的restful接口风格(自学Spring boot 3.x的第三天)
  • ROADM(可)-介绍
  • 【Linux网络编程】协议|OSI模型|TCP/IP模型|局域网通信|跨网络通信|地址管理|流程图
  • Kafka和ES加密
  • 深度学习dataset等概念
  • 【杂谈】-国产单片机学习成本高的原因分析
  • Deep Ocr
  • Flask如何处理静态文件
  • Spring拦截器与Servlet过滤器区别
  • Unity3D DOTS Component详解
  • 人机交互中的当斯定律
  • Redis数据持久化方法
  • 要在nginx中配置后端三个服务器的轮询和加权