【更新說明】
2012-08-17:修改makefile
2012-04-22:更新了slist.c中的slist_delete函式實現。
【描述】仿照《系統程式設計師成長計畫》通用雙鏈表,寫的乙個通用單鏈表。如有錯誤,歡迎指正。
【**清單】
slist.h
#ifndef __slist_h__
#define __slist_h__
#ifdef __cplusplus
extern "c" slistret;
typedef slistret (* slistdataprintfunc)(void *data);
slist *slist_create(void);
slistret slist_insert(slist *thiz, size_t index, void *data);
slistret slist_delete(slist *thiz, size_t index);
slistret slist_prepend(slist *thiz, void *data);
slistret slist_set_by_index(slist *thiz, size_t index, void *data);
slistret slist_get_by_index(slist *thiz, size_t index, void **data);
size_t slist_length(slist *thiz);
slistret slist_print(slist *thiz, slistdataprintfunc print);
slistret slist_destroy(slist *thiz);
#ifdef __cplusplus
}#endif
#endif
slist.c
#include #include #include #include "slist.h"
typedef struct _slistnode
slistnode;
struct _slist
;static slistnode *slist_node_create(void *data)
return node;
}static slistnode *slist_node_destroy(slistnode *node)
return slist_ret_ok;
}static slistnode *slist_get_node(slist *thiz, size_t index, int fail_return_last)
if(!fail_return_last)
return iter;
}slist *slist_create(void)
return thiz;
}slistret slist_insert(slist *thiz, size_t index, void *data)
if(thiz->first == null)
cursor = slist_get_node(thiz, index, 1);
if(index < slist_length(thiz))
else
node->next = cursor;
} else
return slist_ret_ok;
}slistret slist_delete(slist *thiz, size_t index)
else
} }
slist_node_destroy(cursor);
return slist_ret_ok;
}slistret slist_prepend(slist *thiz, void *data)
slistret slist_set_by_index(slist *thiz, size_t index, void *data)
return cursor != null ? slist_ret_ok : slist_ret_fail;
}slistret slist_get_by_index(slist *thiz, size_t index, void **data)
return cursor != null ? slist_ret_ok :slist_ret_fail;
}size_t slist_length(slist *thiz)
return length;
}slistret slist_print(slist *thiz, slistdataprintfunc print)
return slist_ret_ok;
}slistret slist_destroy(slist *thiz)
free(thiz);
thiz->first = null;
return slist_ret_ok;
}
test.c
#include #include #include #include "slist.h"
static slistret print_int(void *data)
int main(void)
slist_print(slist,print_int);
printf("\nlength:%d\n\n",slist_length(slist));
for(i = 0; i < 100; i++)
slist_print(slist,print_int);
printf("\nlength:%d\n\n",slist_length(slist));
printf("insert:\n");
for(i = 0; i < 100; i++)
slist_print(slist,print_int);
printf("\nlength:%d\n\n",slist_length(slist));
printf("insert:\n");
for(i = 0; i < 100; i++)
slist_print(slist,print_int);
printf("\nlength:%d\n\n",slist_length(slist));
printf("slist_set_by_index:\n");
assert((slist_set_by_index(slist, 4, (void *)4))== slist_ret_ok);
printf("index:%d,data:%d\n",4,(void *)4);
slist_print(slist,print_int);
printf("\nslist_get_by_index:\n");
data = (void **)malloc(1*sizeof(int));
assert((slist_get_by_index(slist, 4, &*data))== slist_ret_ok);
printf("%d\n\n",*data);
printf("delete:\n");
for(i = 0; i < 5; i++)
slist_print(slist,print_int);
printf("\nlength:%d\n\n",slist_length(slist));
printf("destory:\n");
assert((slist_destroy(slist))== slist_ret_ok);
printf("length:%d\n",slist_length(slist));
return 0;
}
makefile (改進的版本,2012-08-17)
cc := gcc
target := test
src := slist.c test.c
temp := $(wildcard *~)
$(target):$(src)
$(cc) -g $(src) -o $(target)
clean:
rm $(temp) $(target)
*makefile有改動(2012-08-17)
歡迎查詢錯誤,不斷改進!
系統程式設計師成長計畫005
1.這個變成大寫的函式,就不需要用函式指標來給foreach做引數了。因為他沒有什麼其他變種,不像print那樣,既要print int又要print str。函式指標,或者說 函式,別瞎用!2.書裡的寫法 dlist foreach dlist,str toupper,null 看來還是堅持了 函...
系統程式設計師成長計畫 併發 五
文章出處 作者 李先靜 無鎖 lock free 資料結構 多執行緒併發執行時,雖然有共享資料,如果所有執行緒只是讀取共享資料而不修改它,也是不用加鎖的,比如 段就是共享的 資料 每個執行緒都會讀取,但是不用加鎖。排除所有這些情況,多執行緒之間有共享資料,有的執行緒要修改這些共享資料,有的執行緒要讀...
系統程式設計師成長計畫 併發 五
無鎖 lock free 資料結構 多執行緒併發執行時,雖然有共享資料,如果所有執行緒只是讀取共享資料而不修改它,也是不用加鎖的,比如 段就是共享的 資料 每個執行緒都會讀取,但是不用加鎖。排除所有這些情況,多執行緒之間有共享資料,有的執行緒要修改這些共享資料,有的執行緒要讀取這些共享資料,這才是程...