自学嵌入式 day 18 - 数据结构 1

数据结构

相互之间存在一种或多种特定关系的数据元素的集合

1.特定关系:

(1)逻辑结构:

①集合:所有在同一个集合中,关系平等。

②线性关系:数据和数据之间是一对一的关系。(数组是线性表的形式之一)

③树状关系:一对多

④图状解构:多对多

(2)物理结构(在内存当中的存储关系,即将上述关系存入内存):

①顺序存储:数据存放在连续的存储单位中。逻辑关系和物理关系一致

②链式结构(链表):数据存放的单位是随机或任意的

Struct Per 数据元素

{

char name;

int age;

char phone;

}

程序 = 数据 + 算法

2.算法:

①定义:是解决特定问题求解步骤的描述,计算机中表现为指令的有限序列,每条指令表示一个或多个操作。

②特征(函数):

1),输入,输出特性,输入时可选的,输出时必须的。

2),有穷性,执行的步骤会自动结束,不能是死循环,并且每一步是在可以接受的时间内完成。

3),确定性,同一个输入,会得到唯一的输出。

4),可行性,每一个步骤都是可以实现的。

③设计:

1),正确性:语法正确

合法的输入能得到合理的结果。

对非法的输入,给出满足要求的规格说明

对精心选择,甚至刁难的测试都能正常运行,结果正确

2),可读性,便于交流,阅读,理解

3),健壮性,输入非法数据,能进行相应的处理,而不是产生异常

4),高效,存储低,效率高

④算法时间复杂度:执行算法所时间的度量,o(n)-粗略的估计

1)推算: 用常数1 取代运行时间中的所有加法常数

在修改后的运行函数中,只保留最高阶项。

如果最高阶存在且不是1,则取除这个项相乘的常数。

3.线代表

①定义:零个或多个数据元素的有限序列

②特征:元素之间是有顺序了。如果存在多个元素,第一个元素无前驱,最有一个没有后继,其他的元素只有一个前驱和一个后继。

当线性表元素的个数n(n>=0)定义为线性表的长度,当n=0时,为空表。在非空的表中每个元素都有一个确定的位置,如果a1是第一个元素,那么an就是第n个元素。

③线代表的常规操作:

线性表的常规操作 ADT

typedef struct person {

char name[32];

char sex;

int age;

int score;

}DATATYPE;

typedef int Datatype;

typedef struct list {

DATATYPE *head;

int tlen;

int clen;

}SeqList;

SeqList *CreateSeqList(int len);//创建顺序链表

int DestroySeqList(SeqList *list);//销毁链表

int ShowSeqList(SeqList *list);//遍历输出链表

int InsertTailSeqList(SeqList *list, DATATYPE data);//尾部元素赋值

int IsFullSeqList(SeqList *list);//判断链表是否已满

int IsEmptySeqList(SeqList *list);//判断链表是否为空

int InsertPosSeqList(SeqList *list, DATATYPE data, int pos);//指定位置插入元素

int FindSeqList(SeqList *list, char *name);//查找元素

int ModifySeqList(SeqList *list, char *old, DATATYPE new);//修改成员值

int DeleteSeqList(SeqList *list, char *name);//删除成员

int ClearSeqList(SeqList *list);//清空元素

④上述操作代码表示:

#include "seqlist.h"

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <strings.h>

SeqList *CreateSeqList (int len)//创建顺序链表

{

SeqList *sl = malloc (sizeof (SeqList));

if (NULL == sl) {

fprintf (stderr, "CreateSeqList malloc error\n");

return NULL;

}

sl->head = malloc (sizeof (DATATYPE) * len);

if (NULL == sl->head) {

fprintf (stderr, "CreateSeqList malloc2 error\n");

return NULL;

}

sl->tlen = len;

sl->clen = 0;

return sl;

}

int IsFullSeqList (SeqList *list)//判断链表是否已满

{

if (NULL == list) {

fprintf (stderr, "IsFullSeqList paramter error\n");

return 1;

}

return list->clen == list->tlen;

}

int InsertTailSeqList (SeqList *list, DATATYPE *data)//尾部元素赋值

{

if (IsFullSeqList (list)) {

fprintf (stderr, "seqlist full\n");

return 1;

}

memcpy (&list->head[list->clen], data, sizeof (DATATYPE));

list->clen++;

return 0;

}

int ShowSeqList (SeqList *list)//遍历输出链表

{

int len = GetSizeSeqList (list);

int i = 0;

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

{

printf ("%s %c %d %d\n", list->head[i].name, list->head[i].sex,

list->head[i].age, list->head[i].score);

}

return 0;

}

int GetSizeSeqList (SeqList *list)

{

return list->clen;

}

int FindSeqlist(SeqList *list,char *name)//查找元素

{

int i = 0;

int len = GetSizeSeqList(list);

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

{

if(0 == strcmp(list -> head[i].name,name))

{

return i;

}

}

return -1;

}

int InsertPosSeqList(SeqList *list, DATATYPE *data, int pos)//指定位插入元素

{

if(IsFullSeqList(list))

{

return 1;

}

int len = GetSizeSeqList(list);

if(pos < 0 || len < pos)

{

return 1;

}

int i ;

for(i = list -> clen;i > pos;--i)

{

memcpy(&list -> head[i],&list -> head[i - 1],sizeof(DATATYPE));

}

memcpy(&list -> head[pos],data,sizeof(DATATYPE));

list -> clen++;

return 0;

}

int IsEmpList(SeqList *list)//判断链表是否为空

{

return 0 == list -> clen;

}

int DeleteSeqList(SeqList *list,char *name)//删除链表

{

if(IsEmpList(list))

{

return 1;

}

int ret = FindSeqlist(list,name);

if(-1 == ret)

{

return 1;

}

int len = GetSizeSeqList(list);

int i ;

for(i = ret;i < len - 1;++i)

{

memcpy(&list -> head[i],&list -> head[i + 1],sizeof(DATATYPE));

}

list -> clen--;

return 0

相关推荐
阿让啊6 小时前
C语言strtol 函数使用方法
c语言·数据结构·c++·单片机·嵌入式硬件
superlls8 小时前
(算法 哈希表)【LeetCode 349】两个数组的交集 思路笔记自留
java·数据结构·算法
Ripple1231210 小时前
数据结构:顺序表与链表
数据结构·链表
一个响当当的名号10 小时前
B树,B+树,B*树(无代码)
数据结构·b树
古译汉书12 小时前
嵌入式铁头山羊stm32-ADC实现定时器触发的注入序列的单通道转换-Day26
开发语言·数据结构·stm32·单片机·嵌入式硬件·算法
野犬寒鸦12 小时前
力扣hot100:相交链表与反转链表详细思路讲解(160,206)
java·数据结构·后端·算法·leetcode
GalaxyPokemon13 小时前
LeetCode - 1089. 复写零
数据结构
失散1313 小时前
分布式专题——1.2 Redis7核心数据结构
java·数据结构·redis·分布式·架构
zzzsde14 小时前
【数据结构】强化训练:从基础到入门到进阶(1)
数据结构
奔跑吧 android14 小时前
【linux kernel 常用数据结构和设计模式】【数据结构 3】【模拟input子系统input_dev和input_handler之间的多对多关系】
linux·数据结构·input·kernel·input_dev·input_handler·input_handle