#include <stdio.h>
#include <unistd.h>
typedef void (*GFunc) (void* data,void* user_data);
typedef struct _GSList
{
void* data;
struct _GSList *next;
}GSList;
void g_slist_foreach (GSList *list, GFunc func, void* user_data);
GSList* g_slist_last(GSList *list);
GSList* g_slist_append (GSList *list, void* data);
GSList* g_slist_remove (GSList *list, void *data);
GSList* g_slist_insert (GSList* list, void* data, int position);
void each_callback(void* data, void* user_data);
GSList* g_slist_append (GSList *list, void* data)
{
GSList *last;
GSList *new_list;
new_list = (GSList*)malloc(sizeof(GSList));
new_list->data = data;
new_list->next = NULL;
if(list)
{
last = g_slist_last(list);
last->next = new_list;
return list;
}
else
return new_list;
}
GSList* g_slist_last(GSList *list)
{
if(list)
{
while(list->next)
list = list->next;
}
return list;
}
GSList* g_slist_insert (GSList* list, void* data, int position)
{
GSList* tmp;
GSList* pre = NULL;
if(position<0 && position == 0)
{
g_slist_append(list, data);
}
GSList* new_list = (GSList*)malloc(sizeof(GSList));
new_list->data = data;
new_list->next = NULL;
if(!list)
return new_list;
tmp = list;
while(position-- > 0 && (tmp != NULL))
{
pre = tmp;
tmp = tmp->next;
}
if(pre)
{
new_list->next = pre->next;
pre->next = new_list;
}
else
new_list->next = list;
list = new_list;
return list;
}
GSList* g_slist_remove (GSList *list, void *data)
{
GSList *tmp_list;
GSList *prev_list = NULL;
if(list == NULL)
return ;
tmp_list = list;
while(tmp_list)
{
if(tmp_list->data == data)
{
if(prev_list)
prev_list->next = tmp_list->next;
else
{
list = tmp_list->next;
}
free(tmp_list);
break;
}
prev_list = tmp_list;
tmp_list = tmp_list->next;
}
return list;
}
void g_slist_foreach (GSList *list, GFunc func, void* user_data)
{
while (list)
{
GSList *next = list->next;
(*func) (list->data, user_data);
list = next;
}
}
void each_callback(void* data, void* user_data)
{
printf("element:%s, user param:%s\n", (char*)data, (char*)user_data);
}
int main(void)
{
GSList *my_list = NULL;
my_list = g_slist_append(my_list,"yangjia1");
g_slist_append(my_list,"yangjia2");
g_slist_append(my_list,"yangjia3");
g_slist_insert (my_list, "hahha", 2);
g_slist_remove(my_list,"yangjia3");
g_slist_foreach(my_list, each_callback, "user_data");
}
数据结构之链表
最新推荐文章于 2021-09-12 16:41:03 发布