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

数据结构(1)

1.定义
     一组用来保存一种或者多种特定关系的数据的集合(组织和存储数据)

     程序的设计:将现实中大量而复杂的问题以特定的数据类型和特定的存储结构存储在内存中, 并在此基础上实现某个特定的功能的操作;
程序 = 数据结构 + 算法

 2.数据与数据之间的关系 
  数据的逻辑结构:数据元素与元素之间的关系
           集合:关系平等
           线性结构:元素之间一对一的关系(表(数组,链表),队列。栈。。。)
           树型结构:元素之间一对多的关系(二叉树)
           图形结构:元素之间多对多的关系(网状结构)
    数据的物理结构:数据的逻辑结构在计算机内存中的存储形式
           顺序存储:采用一段连续的内存空间保存元素
                    优点:空间连续,访问方便
                    缺点:插入删除需要移动大量的元素
                          需要预分配内存空间
                          容易造成存储空间碎片
            链式存储:采用一组非连续的内存空间保存元素
                    缺点:访问元素效率低
                    优点:插入和删除数据方便
                          不需要预分配内存
            索引存储:通过关键字构建索引表,通过索引表来来找到数据的存储位置
            散列存储(哈希存储):将数据元素的存储位置与关键码之间建立确定对
                     应关系从而实现查找的存储方式

3.链式存储

    1.单向链表 

    1.链表的创建和插入

       

#include<stdio.h>
#include"link.h"
#include<head.h>
Link_Attribute_t *create_link()
{
    Link_Attribute_t *plink = malloc(sizeof(Link_Attribute_t));
    if(NULL == plink)
    {
        perror("malloc fail");
        return NULL;
    }
    plink->phead = NULL;
    plink->clen = 0;
    return plink;
}
int push_link_head(Link_Attribute_t *plink,TYDEDATA data)
{
    link_node_t *pnode = 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 remove_link_head(Link_Attribute_t *plink)
{
    if(is_empty_link(plink))
    {
        return 0;
    }
    else
    {
        link_node_t *p = plink->phead;
        plink->phead = p->pnext;
        free(p);
        plink->clen--;
        return 0;
    }
}
int remove_link_back(Link_Attribute_t *plink)
{
    link_node_t *p = plink->phead;
    if(is_empty_link(plink))
    {
        return 0;
    }
    else
    {
        if(NULL == p->pnext)
        {
            remove_link_head(plink);
        }
        else
        {
            while(p->pnext->pnext != NULL)
            {
                p = p->pnext;
            }
            free(p->pnext);
            p->pnext = NULL;
            plink->clen--;
            return 0;
        }
    }
}

链表的查找、修改和销毁

link_node_t *find_link_data(Link_Attribute_t *plink,TYDEDATA data)
{
    link_node_t *p = plink->phead;
    if(p->data == data)
    {
        return plink->phead;
    }
    else
    {
        while(p->pnext->data != data)
        {
            p = p->pnext;
        }
        return p->pnext;
    }
}
int change_link_data(Link_Attribute_t *plink,TYDEDATA data,TYDEDATA newdata)
{
    link_node_t *p = plink->phead;
    while(p->data != data)
    {
        p = p->pnext;
    }
    p->data = newdata;
    return 0;
}
int destroy_link(Link_Attribute_t *plink)
{
    while(plink->clen != 0)
    {
        //remove_link_back(plink);
        remove_link_head(plink);
    }
    printf("clen = %d\n",plink->clen);
    free(plink);
    return 0;
}

链表的排序

void insert_sort_link(Link_Attribute_t *plink)
{
    link_node_t *ptmp = plink->phead->pnext;
    link_node_t *pinsert = ptmp;
    plink->phead->pnext = NULL;
    while(pinsert != NULL)
    {
        link_node_t *p = plink->phead;
        //ptmp = ptmp->pnext;
        if(pinsert->data < plink->phead->data)
        {
            ptmp = ptmp->pnext;
            pinsert->pnext = plink->phead;
            plink->phead = pinsert;
            pinsert = ptmp;
            continue;
        }
        else
        {
            while(p->pnext != NULL && p->pnext->data < pinsert->data)
            {
                p = p->pnext;
            }
            ptmp = ptmp->pnext;
            pinsert->pnext = p->pnext;
            p->pnext = pinsert;
            pinsert = ptmp;
        }
    }
}


http://www.kler.cn/news/293987.html

相关文章:

  • LIN协议栈 AUTOSAR架构下 状态管理
  • Matplotlib通过axis()配置坐标轴数据详解
  • JavaEE(3)
  • 【debug】dpkg: error processing archive...Invalid cross-device link
  • pgrx在docker中问题无法解决
  • gitlab 启动/关闭/启用开机启动/禁用开机启动
  • 关于HTTP SESSION
  • 算法复盘——Leetcode hot100: 双指针算法
  • 软件测试基础总结+面试八股文
  • Vue2电商项目(二) Home模块的开发;(还需要补充js节流和防抖的回顾链接)
  • 数据结构(单向链表)
  • 软文发稿相比其他广告形式有哪些持续性优势?
  • 如何从硬盘恢复已删除/丢失的文件?硬盘恢复已删除的文件技巧
  • 如何录制黑神话悟空的游戏BGM导入iPhone手机制作铃声?
  • notepad下载安装使用以及高级使用技巧
  • Vue 中 nextTick 的最主要作用是什么,为什么要有这个 API
  • spring项目使用邮箱验证码校验
  • Vue3状态管理Pinia
  • APS开源源码解读: 排程工具 optaplanner
  • PHP批量修改MySQL数据表字符集为utf8mb4/utf8mb4_unicode_ci
  • 全网首发!!!opencv三通道Mat点云转halcon点云—HTuple类型
  • linux编译出现报错
  • ★ 算法OJ题 ★ 力扣3 - 无重复字符的最长子串
  • 百家云 BRTC:革新华为 HarmonyOS NEXT 系统的实时通信体验
  • ctfshow-php特性(web123-web150plus)
  • 安卓玩机工具-----ADB方式的刷机玩机工具“秋之盒”’ 测试各项功能预览
  • SpinalHDL之数据类型(一)
  • 【LeetCode】11.盛最多水的容器
  • UE4_后期处理_后期处理材质及后期处理体积三—遮挡物体描边显示
  • 网络安全与恶意攻击:如何应对?