day19:零基础学嵌入式之数据结构

一、链表

1.线性表的链式存储目的:解决顺序存储的缺点,插入和删除,动态存储问题。
2.特点:
(1)线性表链式存储结构的特点是一组任意的存储单位存储线性表的数据元素,存储单元可以是连续的,也可以不连续。可以被存储在任意内存未被占用的位置上。
(2)也就是说前面的顺序表只需要存储数据元素信息就可以了。在链式结构中还需要一个元素存储下一个元素的地址。

3.结点

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

(2)链式结构

4.手撕基本函数

(1)linklist.h

#ifndef _LINKLIST_H_
#define _LINKLIST_H_

typedef struct 
{
    char name[10];
    char sex;
    int age;
    int socre;
}DATATYPE;

typedef  struct _node_
{
    DATATYPE data;
    struct _node_ *next;
}LinkNode;

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

LinkList *CreatLinkList(); 
int InsertHeadLinkList(LinkList *ll,DATATYPE* data);
int IsEmptyLinklist(LinkList *ll);
int GetSizeLinkList(LinkList *ll);
int ShowLinkList(LinkList*ll);
DATATYPE * FinfLinkList(LinkList*ll,char *name);
int  DeleteLinkList(LinkList *list, char *name);
int InsertTillLinkList(LinkList *ll,DATATYPE *data);
int IsertPosLindList(LinkList *ll,DATATYPE *data,int pos);
#endif 

(2)创建

LinkList *CreatLinkList()
{
    LinkList *ll = malloc(sizeof(LinkList));
    if(NULL == ll)
    {
        fprintf(stderr, "CreatLinkLis malloc");
    }
    ll->head = NULL;
    ll->clen =0;
    return ll;
}

(3)头插

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 IsEmptyLinklist(LinkList *ll)
{
    return 0 == ll->clen;
}
int GetSizeLinkList(LinkList *ll)
{
    return ll->clen;
}

(4)显示

int ShowLinkList(LinkList*ll)
{
    int len = GetSizeLinkList(ll);
    LinkNode *tmp = ll->head;
    int i;
    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;
}

(5)查找

DATATYPE *FinfLinkList(LinkList*ll,char *name)
{
    LinkNode *tmp = ll->head;
    while(tmp)
    {
        if(strcmp(tmp->data.name,name))
        {
            return &tmp->data; 
        }
        tmp = tmp->next;
    }
    return NULL;
}

(6)删除指定位置

int  DeleteLinkList(LinkList *ll, char *name)
{
    LinkNode *tmp =ll->head;
    if(IsEmptyLinklist(ll))
    {
        return 1;
    }
    if(0 ==strcmp(ll->head->data.name,name))
    {
        ll->head = ll->head->next;
        free(ll->head);
        ll->clen--;
    }
    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;
}

(7)尾插

int InsertTillLinkList(LinkList *ll,DATATYPE *data)
{
    LinkNode *newnode = malloc(sizeof(LinkNode));
    if(NULL == newnode)
    {
        fprintf(stderr, "InsertTillLinkList malloc");
        return 1;
    }
    memcpy(&newnode->data, data, sizeof(DATATYPE));
    if(IsEmptyLinklist(ll))
    {
        InsertHeadLinkList(ll, data);
    }
    LinkNode *tmp = ll->head;
    while(tmp->next)
    {
        tmp = tmp->next;
    }
    tmp->next=newnode;
    newnode->next=NULL;
    ll->clen++;
    return 0;
}

(8)指定位置插

int IsertPosLindList(LinkList *ll,DATATYPE *data,int pos)
{
    LinkNode *newnode = malloc(sizeof(LinkNode));
    memcpy(&newnode->data, data, sizeof(DATATYPE));
    if(NULL == newnode)
    {
        fprintf(stderr, "IsertPosLindList malloc");
        return 1;
    }
    memcpy(&newnode->data, data, sizeof(DATATYPE));
    if(IsEmptyLinklist(ll))
    {
        InsertHeadLinkList(ll,data);
    }
    LinkNode *tmp = ll->head;
    int len  = GetSizeLinkList(ll);
    if(len == pos)
    {
        InsertTillLinkList(ll,data );
    }
    int i=0;
    for(i=0;i<pos-1;++i)
    {
        tmp = tmp->next;
    }
    newnode->next = tmp->next;
    tmp->next = newnode;
    ll->clen++;
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值