《系統程式設計師成長計畫》學習交流 2 通用單鏈表

2021-06-05 18:21:48 字數 4174 閱讀 1488

【更新說明】

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 資料結構 多執行緒併發執行時,雖然有共享資料,如果所有執行緒只是讀取共享資料而不修改它,也是不用加鎖的,比如 段就是共享的 資料 每個執行緒都會讀取,但是不用加鎖。排除所有這些情況,多執行緒之間有共享資料,有的執行緒要修改這些共享資料,有的執行緒要讀取這些共享資料,這才是程...