我想用C語言寫一個動態陣列dynamic array, 它能自動增長,類似C++ std::vector.
配合qsort, bsearch, 這樣我就能盡量使用C語言。下面的代碼現在只提供append, remove.
請您多多給予指教。
謝謝
// ---- dynamic array ----
#include <stdlib.h>
#include <string.h>
struct da_struct {
size_t cap ; // number of allocated elements
size_t len ; // number of occupied elements
size_t size; // size of an element
void *root; // pointer to the allocated block
};
// tell dynamic array the element size
struct da_struct da_init(size_t size) {
size_t cap = 100 * 1024;
void *root = malloc(cap * size);
return (struct da_struct){cap, 0, size, root};
}
// free the memory of dynamic array
void da_cleanup(struct da_struct *da) {
free(da->root);
}
// append an object into dynamic array
// object size should be the same as to init function
// return the element address in array or NULL if append fails
void *da_append(struct da_struct *da, void *obj) {
if (da->len >= da->cap){
da->cap *= 2;
void *newp = realloc(da->root, da->size);
if (!newp) {
return NULL;
}
da->root = newp;
}
void *ptr = da->root + (da->len++ - 1) * da->size;
memcpy(ptr, obj, da->size);
return ptr;
}
//the last element will overwrite the one to be removed
void *da_remove(struct da_struct *da, void *elem) {
memcpy(elem, da->root + da->len - 1, da->size);
return elem;
}
uj5u.com熱心網友回復:
挺好的,點贊。希望樓主繼續努力,進一步完善完善。。uj5u.com熱心網友回復:
//diff
-memcpy(elem, da->root + da->len - 1, da->size);
+memcpy(elem, da->root + --da->len, da->size);
uj5u.com熱心網友回復:
建議用第一個吧,不建議用第二個。
首先+ --連著不利于代碼閱讀,當然可以考慮加括號;
其次,--具有副作用,因為此處雖然有da->len-1的意思,同時,還會修改da->len的值,這里要看要不要有這一步了,個人感覺沒有這一步。
uj5u.com熱心網友回復:
感謝回復。
這一行是在remove函式里,因為洗掉一行后,實際的元素個數也要減一。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/233692.html
標籤:C語言
上一篇:有大佬知道這那錯了嗎
