gen_linklist.c
3.29 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
#include "gen_linklist.h"
#include "platform.h"
#include <stdio.h>
// https://blog.csdn.net/swwlqw/article/details/22498833
/*-------------- insert ------------------------------
* insert data to any postion
*/
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
#undef container_of
#define container_of(ptr, type, member) ((type *)(((size_t)ptr) - offsetof(type, member)))
typedef struct gen_linknodebuf_STR{
unsigned char status;
GenLinkNode node;
}GenLinkNodebuf;
GenLinkNodebuf gen_linknodebuf[500]={0};
GenLinkNode* gen_malloc(void)
{
for(unsigned short i = 0;i < 500;i++)
{
if(gen_linknodebuf[i].status == 0 ){
gen_linknodebuf[i].status = 1;
return &gen_linknodebuf[i].node;
}
}
return NULL;
}
void gen_free(GenLinkNode * nodetemp)
{
GenLinkNodebuf * temp;
temp = container_of(nodetemp,struct gen_linknodebuf_STR,node);
temp->status = 0;
}
unsigned char gen_linklist__insert(GenLinkList* const list,void *pele,unsigned short index)
{
uint8_t rtn=1;
PLATFORM_DISABLE_IRQ();
if(list->length < index)
{
rtn = 0;
}
else
{
//GenLinkNode *node = (GenLinkNode *)malloc(sizeof(GenLinkNode));
GenLinkNode *node = gen_malloc();
if(node ==NULL)
{
rtn = 0;
}
else
{
node->next = NULL;
node->pdata = pele;
GenLinkNode *pnode_tmp= list->front;
for(unsigned short i=0;i<index;i++){
if(pnode_tmp!=NULL)
pnode_tmp =pnode_tmp->next;
}//for
node->next =pnode_tmp->next;
pnode_tmp->next =node;
(list->length)++;
}
}
PLATFORM_ENABLE_IRQ();
return rtn;
}
/* -------------- detele ------------------------------
* detele node at any postion
*/
void* gen_linklist__detele(GenLinkList* const list,unsigned short index)
{
void * rtn = NULL;
PLATFORM_DISABLE_IRQ();
if(list->length <= index)
{
rtn = NULL;
}
else
{
GenLinkNode *pnode_tmp= list->front;
for(unsigned short i=0;i<index;i++){
if(pnode_tmp!=NULL)
pnode_tmp =pnode_tmp->next;
}//for
GenLinkNode *pnode_record= pnode_tmp->next;
if(pnode_record!=NULL)
{
pnode_tmp->next = pnode_tmp->next->next;
rtn =pnode_record->pdata;
//free(pnode_record);
gen_free(pnode_record);
if(list->length)
(list->length)--;
}
else{
rtn=NULL;
} //
}
PLATFORM_ENABLE_IRQ();
return rtn;
}
/*-------------- get ele ------------------------------
* get element of index;
*/
void* gen_linklist__get_ele(GenLinkList* const list,unsigned short index)
{
if( list->length <= index) return NULL;
GenLinkNode *pnode_tmp= list->front->next;//diff with no head
for(unsigned short i=0;i<index;i++){
// if(pnode_tmp->next != NULL)
pnode_tmp =pnode_tmp->next;
}//for
if(pnode_tmp != NULL)
return pnode_tmp->pdata;
else
return NULL;
}
/*-------------- get len ------------------------------
* get length of linklist
*/
unsigned short gen_linklist__get_len(GenLinkList* const list)
{
return list->length;
}