day 18:零基础学嵌入式之数据结构——

一、基础内容

1.数据结构:相互之间存在一种或多种特定关系的数据元素的集合。

2.逻辑结构
(1)集合,所有数据在同一个集合中,关系平等。
(2)线性,数据和数据之间是一对一的关系
(3)树, 一对多
(4)图,多对多

3.物理结构(在内存当中的存储关系)
(1)顺序存储,数据存放在连续的存储单位中。逻辑关系和物理关系一致
(2)链式,数据存放的存储单位是随机或任意的,可以连续也可以不连续。

4.算法:是解决特定问题求解步骤的描述,计算机中表现为指令的有限序列,每条指令表示一个或多个操作。
5.算法的特征
1,输入,输出特性,输入时可选的,输出时必须的。
2,有穷性,执行的步骤会自动结束,不能是死循环,并且每一步是在可以接受的时间内完成。
3,确定性,同一个输入,会得到唯一的输出。
4,可行性,每一个步骤都是可以实现的。

6.算法的设计
(1)正确性,
        1)语法正确
        2)合法的输入能得到合理的结果。
        3)对非法的输入,给出满足要求的规格说明
        4)对精心选择,甚至刁难的测试都能正常运行,结果正确
(2)可读性,便于交流,阅读,理解
(3)健壮性,输入非法数据,能进行相应的处理,而不是产生异常
(4)高效,存储低,效率高 

7.算法时间复杂度:也就是执行这个算法所花时间的度量

8.推导时间复杂度
(1)用常数1 取代运行时间中的所有加法常数
(2)在修改后的运行函数中,只保留最高阶项。
(3)如果最高阶存在且不是1,则取除这个项相乘的常数。

二、线性表

1.定义:零个或者多个数据元素的有限序列;
2.特征

(1)元素之间是有顺序了。如果存在多个元素,第一个元素无前驱,最有一个没有后继,其他的元素只有一个前驱和一个后继。
(2)当线性表元素的个数n(n>=0)定义为线性表的长度,当n=0时,为空表。在非空的表中每个元素都有一个确定的位置,如果a1是第一个元素,那么an就是第n个元素。

3.线性表的常规操作  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);

4.手撕上述代码

(1)seqlist.h

#ifndef _SEQLIST_H_
#define _SEQLIST_H_

typedef struct	person {
	char name[32];
	char sex;
	int age;
	int score;
}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 *newdata);
int DeleteSeqList(SeqList *list, char *name);
int ClearSeqList(SeqList *list);
int GetSizeSeqList(SeqList *list);
DATATYPE * GetItemSeqList(SeqList*list,int ind);
#endif // !1

(2)seqlist.c

#include "seqlist.h"
#include 
#include 
#include 

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 erro\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;
    //list->head[list -> clen]= *data;
}
int ShowSeqList(SeqList *list)
{
    int len = GetSizeSeqList(list);
    int i;
    for(i = 0;ihead[i].name,list->head[i].sex,list->head[i].age,list->head[i].score);
    }
}
int GetSizeSeqList(SeqList *list)
{
    return list->clen; 
}
int IsEmptySeqList(SeqList *list)
{

    return 0 == list->clen; 
}
int FindSeqList(SeqList *list, char *name)
{
    int i=0;
    int len = GetSizeSeqList(list);
    for(i=0;ihead[i].name,name))
        {
            return i;
        }
    }
    return -1;
}
DATATYPE *GetItemSeqList(SeqList *List,int ind)
{
    if(NULL ==List)
    {
        return NULL;
    }
    int len = GetSizeSeqList(List);
    if(ind < 0||ind >=len)
    {
        return NULL;
    }
    return &List->head[ind];
}
int InsertPosSeqList(SeqList *list, DATATYPE *data, int pos)
{
    if(IsFullSeqList(list))
    {
        return 1;
    }
    int len = GetSizeSeqList(list);
    if(pos<0||pos>len)
    {
        return 1;;
    }
    int i=0;
    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 DeleteSeqList(SeqList *list, char *name)
{
    if (IsEmptySeqList(list))
    {
        return 1;
    }  
    
    int vel=FindSeqList(list,name);
     int vel=FindSeqList(list,name);
    if(-1 == vel)
    {
        return 1;
    }
    int i;
    int len = GetSizeSeqList(list);
    for(i=vel;i<=list->clen;++i)
    {
        memcpy(&list->head[i], &list->head[i+1],sizeof(DATATYPE));
    }
    list->clen -=1;
    // list->clen++;
    return 0;
}
int ClearSeqList(SeqList *list)
{
    return list->clen = 0;
}
int ModifySeqList(SeqList *list, char *old, DATATYPE *newdeta)
{
    if (IsEmptySeqList(list))
    {
        return 1;
    }    
    int vel=FindSeqList(list,old);
    if(-1 == vel)
    {
        return 1;
    }
    memcpy(&list->head[vel], newdeta, sizeof(DATATYPE));
    return 0;
}
int DestroySeqList(SeqList *list)
{
    if(NULL == list)
    {
        return 1;
    }
    free(list->head);
    free(list);
    return 0;
}

(3)main.c

#include "seqlist.h"
#include
int main(int argc,char **argv)
{
    SeqList *s1 = CreateSeqList(5);
    DATATYPE data[]={
        {"zhangsan",'F',20,80},
        {"san",'M',21,81},
        {"zhan",'F',41,85},
        {"gsan",'M',35,82},
        {"an",'M',22,90},
    };
    InsertTailSeqList(s1,&data[0]);
    InsertTailSeqList(s1,&data[1]);
    InsertTailSeqList(s1,&data[2]);
    ShowSeqList(s1);
    printf("***************shan***\n");
    DeleteSeqList(s1, "zhangsan");
    // InsertPosSeqList(s1, &data[2],3);

    ShowSeqList(s1);
    // int ret = FindSeqList(s1,"zhangsan");
    // if(-1 ==ret)
    // {
    //     printf("not found");
    // }
    // else
    // {
    //     DATATYPE *tmp = GetItemSeqList(s1,ret);
    //     printf("%s %d\n",tmp->name,tmp->score);
    // }
    return 0;
}

5.线性表顺序存储的优点,缺点
(1)优点
        1)无需为表中的逻辑关系增加额外的存储空间
        2)可以快速随机访问元素O(1)
(2)缺点
        1)插入,删除元素需要移动元素o(n)
        2)无法动态存储。

三、vs—code的一些操作

(1)表头结果:放数组的状态信息,head:数组名,是指针指向首元素地址;tlen:总长度;clen:当前长度,代表使用的有效长度;

  • sudo:以管理员的
  • ping www.baidu.com:计算机是否联上网
  • 虚拟机快速上网步骤:虚拟机—》配置-网络适配器-选地址转换NAT(windows能上网虚拟机就可以上网)-ifconfig-看ens的名字(一般是33)-sudo vi /etc/network/interfaces-1回车day 18:零基础学嵌入式之数据结构——_第1张图片day 18:零基础学嵌入式之数据结构——_第2张图片

你可能感兴趣的:(数据结构)