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

嵌入式自学第二十二天(5.15)

顺序表和链表 优缺点
存储方式:
顺序表是一段连续的存储单元
链表是逻辑结构连续物理结构(在内存中的表现形式)不连续
时间性能,
查找顺序表O(1):下标直接查找
链表  O(n):从头指针往后遍历才能找到
插入和删除:
顺序表 O(n):需要整体元素移动后插入
链表   O(1):只需改指定位置指针指向即可。

空间性能
顺序表 需要预先分配空间,大小固定
链表, 不需要预先分配,大小可变,动态分配


循环链表
简单的来说,就是将原来单链表中最有一个元素的next指针指向第一个元素或头结点,链表就成了一个环,头尾相连,就成了循环链表。circultlar linker list。

双向链表:

如图:每个节点都包含三部分,数据,指向下个节点的指针,指向上个节点的指针。

Makefile:工程管理工具。

预处理、编译、汇编生产obj、链接

a.out:main.c ./doubleLinklist.c

        gcc main.c doubleLinklist.c

Clean:

        rm a.out.

保存后按make命令默认走第一条规则生成a.out

按make clean清除a.out

#代表源文件

SRC += main.c

SRC +=doulink.c

DST = app

CC = gcc

FLAG = -g

LIB=-lm

$(DST):$(SRC)

        $(CC)  $(SRC) $(FLAG) $(LIB) -o $(DST)

clean

        rm $(DST)

指定文件:make -f makefile2

今天写了双向链表相关操作的函数:

#include "doulink.h"

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

struct DouLinkList* CreateDouLinkList()//创建双向链表

{

    struct DouLinkList* dl = (struct DouLinkList*) malloc(sizeof(struct DouLinkList));

    if(NULL == dl)

    {

        fprintf(stderr,"CreateDouLinkList malloc\n");

        return NULL;

    }

    dl->head = NULL;

    dl->clen = 0;

    return dl;

}

int InsertHeadDouLinkList(struct DouLinkList* dl, struct DATATYPE* data)//双向链表头查

{

    struct DouNode * newnode =   (struct DouNode*)malloc(sizeof(struct DouNode));

    if(NULL == newnode)

    {

        fprintf(stderr,"inserthead malloc\n");

        return 1;

    }

    memcpy(&newnode->data,data,sizeof(struct DATATYPE));

    newnode->next = NULL;

    newnode->prev = NULL;

    newnode->next = dl->head;

    if(dl->head)

    {

        dl->head->prev = newnode;

    }

    dl->head  = newnode;

    dl->clen++;

    return 0;

}

int ShowDouLinkList(struct DouLinkList* dl,DIR dir)//双向链表遍历

{

    struct DouNode* tmp = dl->head;

    if( FORWADR==dir)

    {

        while(tmp)

        {

            printf("%s %c %d %d\n",tmp->data.name,tmp->data.sex,tmp->data.age,tmp->data.score);

            tmp=tmp->next;

        }

    }

    else if(BACKWADR == dir)

    {

        while(tmp->next)

        {

            tmp=tmp->next;

        } // end node

        while(tmp)

        {

            printf("%s %c %d %d\n",tmp->data.name,tmp->data.sex,tmp->data.age,tmp->data.score);

            tmp=tmp->prev;

        }

    }

    return 0;

}

int InsertTailDouLinkList(struct DouLinkList*dl,struct DATATYPE*data)//双向链表尾插

{

    if(IsEmptyDouLinkList(dl))

    {

        return InsertHeadDouLinkList(dl,data);

    }

    else  

    {

        struct DouNode* tmp = dl->head ;

        while(tmp->next)

        {

            tmp= tmp->next;

        }

        struct DouNode* newnode = (struct DouNode*)malloc(sizeof(struct DouNode));

        if(NULL == newnode)

        {

            fprintf(stderr,"InsertTailDouLinkList malloc\n");

            return 1;

        }

        //初始化节点

        memcpy(&newnode->data,data,sizeof(struct DATATYPE));

        newnode->next  = NULL;

        newnode->prev = NULL;

       // 连接链表

        newnode->prev  = tmp;

        tmp->next  = newnode;

        dl->clen++;

    }

    return 0;

}

int InsertPosDouLinkList(struct DouLinkList*dl,struct DATATYPE*data,int pos)//双向链表指定位置插入元素

{

    int len = GetSizeDouLinkList(dl);

    

    if(pos<0 || pos>len)

    {

        return 1;

    }

    if(0 == pos)

    {

        return InsertHeadDouLinkList(dl,data);

    }

    else if(pos == len)

    {

        return InsertTailDouLinkList(dl,data);

    }

    else

    {

        struct DouNode* tmp = dl->head;

        int i = 0 ;

        for(i = 0 ;i<pos;++i)

        {

            tmp=tmp->next;

        }

        struct DouNode* newnode = (struct DouNode*)malloc(sizeof(struct DouNode));

        if(NULL == newnode)

        {

            fprintf(stderr,"InsertposDouLinkList malloc\n");

            return 1;

        }

        memcpy(&newnode->data , data,sizeof(struct DATATYPE));

        newnode->next  = NULL;

        newnode->prev  = NULL;

        newnode->next  = tmp;

        newnode->prev  = tmp->prev;

        tmp->prev = newnode;

        newnode->prev->next  = newnode;

        dl->clen++;

    }

    return 0;

}

int IsEmptyDouLinkList(struct DouLinkList*dl)//双向链表是否为空

{

    return 0 == dl->clen;

}

int GetSizeDouLinkList(struct DouLinkList*dl)//双向链表长度获取

{

    return dl->clen;

}

struct DouNode* FindDouLinkList(struct DouLinkList* dl,char *name)//查找元素

{

    if(IsEmptyDouLinkList(dl))

    {

        return NULL;

    }

    struct DouNode* tmp = dl->head;

    int len = GetSizeDouLinkList(dl);

    int i = 0 ;

    for(i = 0 ;i< len; ++i)

    {

        if(0 == strcmp(tmp->data.name,name))

        {

            return tmp;

        }

        tmp= tmp->next;

    }

    return NULL;

}

int ModifyDouLinkList(struct DouLinkList* dl,char *name,struct DATATYPE* data)//修改元素

{

    struct DouNode* ret = FindDouLinkList(dl,name);

    if(NULL == ret)

    {

        return 1;

    }

    memcpy(&ret->data,data,sizeof(struct DATATYPE));

    return 0;

}

http://www.xdnf.cn/news/6445.html

相关文章:

  • 02、基础入门-Spring生态圈
  • 云上玩转 Qwen3 系列之三:PAI-LangStudio x Hologres构建ChatBI数据分析Agent应用
  • 机器学习第十三讲:独热编码 → 把“红黄蓝“颜色变成001/010/100的数字格式
  • 数据结构之图的应用场景及其代码
  • MySQL 用户权限管理:从入门到精通
  • 26考研 | 王道 | 计算机组成原理 | 一、计算机系统概述
  • Java:跨越时代的编程语言传奇
  • 2025年黑客扫段攻击激增:如何构建智能防御体系保障业务安全?
  • Makefile与CMake
  • AI大模型应用:17个实用场景解锁未来
  • 软件设计师考试《综合知识》CPU考点分析(2019-2023年)——求三连
  • 让AI帮我写一个word转pdf的工具
  • 从《西游记》到微调大模型:一场“幻觉”与“认知”的对话20250515
  • 在 VMware 中挂载 U 盘并格式化为 ext4 文件系统的完整指南
  • 企业在蓝海市场有哪些推进目标?
  • 操作系统学习笔记第3章 内存管理(灰灰题库)
  • 嵌入式学习--江科大51单片机day7
  • Metagloves Pro+Manus Core:一套组合拳打通虚拟制作与现实工业的任督二脉
  • 题海拾贝:P4017 最大食物链计数
  • 399. 除法求值
  • 自然资源和空间数据应用平台
  • 深度学习框架---TensorFlow概览
  • 【vue】【环境配置】项目无法npm run serve,显示node版本过低
  • 【2025最新】VSCode Cline插件配置教程:免费使用Claude 3.7提升编程效率
  • Unity光照笔记
  • 解决Mawell1.29.2启动SQLException: You have an error in your SQL syntax问题
  • Java EE初阶——线程安全
  • 死锁(Deadlock)知识点详解
  • 青少年气胸术后护理要点清单
  • Cursor安全漏洞事件深度解析:当AI编程工具成为供应链攻击的新战场