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

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

(1)线性表顺序存储的优缺点:

优点:无需为表中逻辑关系添加额外存储空间;

可以快速随机访问元素,时间复杂度O(1)。

缺点:插入删除需要移动元素O(n);

无法动态存储。

  1. 线性表链式存储。

如图,链表每个元素都包含数据和指针两部分,指针指向下一个元素,元素间不一定连续存储。

特点:,线性表链式存储结构的特点是一组任意的存储单位存储线性表的数据元素,存储单元可以是连续的,也可以不连续。可以被存储在任意内存未被占用的位置上。

所以前面的顺序表只需要存储数据元素信息就可以了。在链式结构中还需要一个元素存储下一个元素的地址。

为了表示每个数据元素,ai与其直接后继数据元素ai+1之间的逻辑关系,对ai来说,除了存储其本身的信息外,还需要存一个指示器直接后续的信息。把存储元素信息的域叫数据域,把存储直接后继位置的域叫指针域。这两部分信息组成数据元素ai的存储映像,叫结点(Node);

单链表中,c语言的描述
typedef struct person {
char name[32];
char sex;
int age;
int score;
}DATATYPE;

typedef struct node {
DATATYPE data;
struct node *next,*prev;
}LinkNode;

typedef struct list {
LinkNode *head;
int tlen;
int clen;
}LinkList;

LinkList *CreateLinkList(int len);
int InsertHeadLinkList(LinkList *list, DATATYPE data);
int ShowLinkList(LinkList *list);
LinkNode *FindLinkList(LinkList *list, char *name);
int DeleteLinkList(LinkList *list, char *name);
int ReviseLinkList(LinkList *list, char *name, DATATYPE data);
int DestroyLinkList(LinkList *list);
int InsertTailLinkList(LinkList *list, DATATYPE data);

今天学了链表创建、判断链表是否为空、头插入元素、获取链表长度、遍历链表、查找元素、删除元素,程序如下。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

#include "linklist.h"

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

LinkList* CreateLinkList()

{

  LinkList* ll = malloc(sizeof(LinkList));

  if (NULL == ll)

    {

      fprintf(stderr, "CreateLinkList malloc");

      return NULL;

    }

  ll->head = NULL;

  ll->clen = 0;

  return ll;

}

int IsEmptyLinkList(LinkList* ll) { return 0 == ll->clen; }

int InsertHeadLinkList(LinkList* ll, DATATYPE* data)

{

  LinkNode* newnode = malloc(sizeof(LinkNode));

  if (NULL == newnode)

    {

      fprintf(stderr, "InsertHeadLinkList malloc");

      return 1;

    }

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

  newnode->next = NULL;

  if (IsEmptyLinkList(ll))

    {

      ll->head = newnode;

    }

  else

    {

      newnode->next = ll->head;

      ll->head = newnode;

    }

  ll->clen++;

  return 0;

}

int GetSizeLinkList(LinkList* ll) { return ll->clen; }

int ShowLinkList(LinkList* ll)

{

  int len = GetSizeLinkList(ll);

  LinkNode* tmp = ll->head;

  int i = 0;

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

    {

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

             tmp->data.socre);

      tmp = tmp->next;

    }

  return 0;

}

DATATYPE* FindLinkList(LinkList* ll, char* name)

{

  LinkNode* tmp = ll->head;

  while (tmp)

    {

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

        {

          return &tmp->data;

        }

      tmp = tmp->next;

    }

  return NULL;

}

int DeleteLinkList(LinkList* ll, char* name)

{

  LinkNode* tmp = ll->head;

  if (IsEmptyLinkList(ll))

    {

      return 1;

    }

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

    {

      ll->head = ll->head->next;

      free(tmp);

      ll->clen--;

      return 0;

    }

  while (tmp->next)

    {

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

        {

            LinkNode* tmp2 = tmp->next;

          tmp->next = tmp->next->next;

          free(tmp2);

          ll->clen--;

          return 0;

        }

      tmp = tmp->next;

    }

  return 1;

}

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

相关文章:

  • AIStarter新功能上线:模型管理与创作者收益系统全面升级,助力AI开发效率提升
  • 函数定义、 异常处理、 迭代器协议、内置函数、返回值
  • WiFi密码查看器打开软件自动获取数据
  • 通用Agent如何评估效果:智能体评测方案AgentCLUE-General(Manus暂时领先)
  • 人形机器人的 9 个分岔口
  • 图灵爬虫练习平台 第十四题 逆向
  • 一款倒计时结束强制关闭浏览器的插件
  • 可视化图解算法38:重建二叉树
  • C++标准流详解:cin/cout的绑定机制与cerr/clog的缓冲差异
  • Spark集群搭建-Standalone
  • 芯片:金线的作用
  • 关于 ast: Babel AST 全类型总览
  • 在Java中实现Parcelable接口和Serializable接口有什么区别?
  • trame实现双视图(返场版)
  • MySQL 日期计算方法 date_sub()、date_add()、datediff() 详解-文中有示例帮助理解
  • java基础-泛型
  • tails os系统详解
  • 实物工厂零件画图案例(上)
  • 进程与线程:09 进程同步与信号量
  • Linux的域名解析服务器
  • OAuth安全架构深度剖析:协议机制与攻防实践
  • 【Nacos】env NACOS_AUTH_IDENTITY_KEY must be set.
  • SparkSQL 连接 MySQL 并添加新数据:实战指南
  • uniapp+vue3中自动导入ref等依赖
  • 通义灵码2.5版本全新体验
  • CSP-J普及组第一轮真题单选题专项训练(二)
  • NumPy 2.x 完全指南【九】常量
  • 虹科应用 | 探索PCAN卡与医疗机器人的革命性结合
  • 软件测试(2)软件测试分类及流程
  • 【自学30天掌握AI开发】 - 课程简介