嵌入式数据结构学习

嵌入式数据结构学习笔记

持续更新中......

顺序表的实现

顺序表实现的代码.h文件:

//写法一:
typedef int data_t;
#define N 128

struct sqlist_t {
    data_t data[N];
    int last;
};

typedef struct sqlist_t sqlist;    //简化写法
typedef struct sqlist_t *sqlink;    //简化写法

//写法二:
typedef int data_t;
#define N 128

typedef struct sqlist_t {
    data_t data[];
    int last;
}sqlist,*sqlink;            //对比一下写法一

实现增删改查的功能函数:

sqlink list_create();
int list_clear(sqlink L);    //可以依靠返回值来判断函数运行是否成功
int list_empty(sqlink L);
int list_length(sqlink L);
int list_locate(sqlink L, data_t value);
int list_insert(sqlink L, data_t value, int pos);
int list_show(sqlink L);
int list_purge(sqlink L);
int list_merge(sqlink L1,sqlink L2);
int list_delete(sqlink L,int pos);

函数实现.c文件:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "sqlink.h"

//创建线性表
sqlink list_create();{
    //malloc
    sqlink L;    //声明指针L
    L =  (sqlink)malloc(sizeof(sqlist));    //申请一段内存,返回一个地址,要做强制类型转换
    if(L == NULL){
        printf("list malloc failed\n");    // 提示失败
        return L;
    }

    //initalize
    memset(L,0,sizeof(sqlist));    //一个好用的填充函数,地址,用啥填充,填充大小
    //结构体大小等于最后一个成员的偏移量加上最后一个成员的大小。
    L->last == -1;    //以上这两句不能写反

    //return
    return L;
}

//线性表置空
/*
*@ret 0-success -1-failed
**/
int list_clear(sqlink L);{
    if(L == NULL)
        return -1;

    memset(L,0,sizeof(sqlist));
    L->last == -1;

    return 0;
}

//判断是否是空的线性表
/*
* list_empty:check list is empty
* para L:list
* @ret 1--empty 0--not empty
**/
int list_empty(sqlink L);{
    if(L == NULL)
        return 1;
    else
        return 0;
}

//求线性表长度
int list_length(sqlink L);{

    return (L->last+1;);
}

int list_locate(sqlink L, data_t value);{
    int i;
    for(i = 0; i <= L->last; i++){
        if(L->data[i] == value)
            return i;
    }
    return -1;
}

//插入数据
int list_insert(sqlink L, data_t value, int pos);{
    int i;

    //full
    if(L->last == N-1){
        printf("list is full\n");
        return -1;
    }

    //check para pos ∈[0,last+1]
    if (pos < 0 || pos>L->last+1){
        printf("pos is invalid\n");
        return -1;
    }

    //move
    for(i = L->last;i>=pos;i--){
        L->data[i+1] =  L->data[i];
    }

    //update value last
    L->data[pos] = value;
    L->last++;
    return 0;
}

//展示列表
int list_show(sqlink L);{
    if(L == NULL)
        return -1;
    if(L->last == N-1){
        printf("list is full\n");
    for (i=0;1<=L->last;i++){
        print("%d",L->data[i]);
    }
    puts("");

    return 0;
}

//销毁,内存释放
int list_purge(sqlink L);{
    if(L == NULL)
        return -1;
    free(L);
    L = NULL;
    return 0;
}

int list_merge(sqlink L1,sqlink L2);{
    return 0;
}

int list_delete(sqlink L,int pos);{
    int 1;

    if(L->last == -1){
        printf("list is empty\n");
        return -1;
    }

    //pos [0,last]
    if(pos<0||pos>L->last){
        printf("delete pos is invalid\n");
        return -1;
    }
    
    //move    [pos+1,last]
    for(i=pos+1;i<=L->last;i++){
        L->data[i-1] = L->data[i];
}
    //update
    L->last--;

    return 0;
}

//合并
int list_merge(sqlink L1,sqlink L2);{
    int i = 0;
    int ret;

    while(i<=L2->last){
        ret = list_locate(L1,L2->data[i]);
        if(ret == -1){
            if(list_insert(L1,L2->data[i],L1->last+1) == -1)
                return -1;
        }
        i++;
    }
    return 0;
}

测试用代码

#include <stdio.h>
#include "sqlink.h"

void test_delete();

int main(int argc, const char *argv[])
{
    sqlink L;
     
    L = list_create();
    if(L == NULL)
        return -1;
    list_insert(L,10,0);
    list_show(L);
    list_purge(L);

    return 0;
}

void test_delete(){
    sqlink L;
     
    L = list_create();
    if(L == NULL)
        return -1;
    list_insert(L,10,0);
    list_show(L);
    list_delete(L,0);
    list_show(L);
    list_purge(L);
}

单链表

//列表的按序号查找
linklist list_get(linklist H,int pos){
    linklist p;
    int i;

    if(H == NULL){
        printf("H is NULLL\n");
        return NULL;
    }
    if(pos == -1){
        return H;
    }

    if(pos < -1){
        printf("pos is invalid\n");
        return NULL;
    }
        
    p = H;

    i = -1;
    while(i < pos){
        p = p->next;
        if(p == NULL){
            printf("pos is invalid\n")
            return NULL;
        }
        i++;
    } 
    return p;
}
int list_insert(linklist H,data_t value, int pos){
    linklist p;
    linklist q;
    
    if(H == NULL){
        printf("H is NULLL\n");
        return NULL;
    }

    //1 locate node p (pos-1)
    p = list_get(H,pos-1);
    if(p == NULL){
        return -1;
    }
  
    //2 new node q
    if((q = (linklist)malloc(sizeof(listnode))) == NULL){
        printf("malloc failed\n");
        return -1;
    }
    q -> data = value;

    //3 insert
    q -> next = p -> next;
    p -> next = q;

    return 0;
}
int list_delet(linklist H, int  pos){
    linklist p;
    linklist q;

    //1
    if(H == NULL){
        printf("H is NULLL\n");
        return -1;
    }
    
    //2 locate prior
    p = list_get(H,pos-1)
    if(p == NULL)
        return -1;
    if(p -> next == NULL){
        printf("delete pos is invalid\n");
        return -1;
    }
    
    //3 update list
    q = p ->next;
    p->next = q ->next;

    //
    free(q);
    q = NULL;
    return 0;
}
int list_free(linklist H){
    linklist p;

    if(H == NULL)
        return -1;

    p = H;
    
    printf("free:");
    while(H != NULL){
        p = H;
        printf("%d",p->data);
        free(p);
        H = H->next;
    }

    puts("");

    return NULL;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值