嵌入式数据结构学习笔记
持续更新中......
顺序表的实现
顺序表实现的代码.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;
}