數據結構中所講的動態分配的數組如何在 C 語言中實現?


struct list_t
{
int* head, *back, *end;
};
typedef struct list_t* list_t;

list_t list_initialize(int capacity)
{
list_t list = malloc(sizeof(*list));
list-&>head = malloc(sizeof(*list-&>head)*capacity);
list-&>back = list-&>head;
list-&>end = list-&>head + capacity;
return list;
}

void list_expand(list_t list)
{
int* newMem = realloc(list-&>head, sizeof(*list-&>head) * (list-&>end - list-&>head)*1.5);
list-&>back = newMem + (list-&>end - list-&>head);
list-&>end = newMem + (int)((list-&>end - list-&>head) * 1.5);
list-&>head = newMem;
}

void list_push(list_t list, int value)
{
if(list-&>end == list-&>back)
{
list_expand(list);
}
*list-&>back = value;
list-&>back++;
}

void list_finalize(list_t list)
{
free(list-&>head);
free(list);
}

int main()
{
list_t list = list_initialize(10);
for(int i = 0; i &< 100; i++) { list_push(list, i); } list_finalize(list); }

推薦一本書《C語言介面與實現》


malloc()和realloc()

int len = 0;

int* array = NULL;

scanf("%d",len);

array = (int*)malloc(sizeof(int)*len);

//

//balabala~~

//

scanf("%d",len);

array = (int*)realloc(array,sizeof(int)*len);

//

//balabala~

//

free(array);

以上


這個動態分配內存介紹的太複雜,怪不得題主會死在這裡。

居然還弄個Status作為返回值,對新手來說簡直嚴重阻礙閱讀性。

不知道題主從數組思維跳出來了沒,一開始我被數組思維限住了,卡了我三天。

int* 動態分配數組(int length)
{
int *arr = (int *)malloc(sizeof(int)*length); //相當於arr[length];
return arr;
}

int main(void)
{
int* arr = 動態分配數組(10); //相當於int arr[10];

for(int i = 0; i &< 10; i++) { arr[i] = i; } for(int i = 0; i &< 10; i++) { printf("arr[i]: %d ",arr[i]); } }

複雜一點的:

#define LENGTH 100

struct SQList
{
int *arr;
int length;
int listsize;
}

int InitList(SQList *L)
{
L.arr = (int *)malloc(sizeof(int) * LENGTH); //相當於int arr[100];
if(L.arr==NULL)
{
return -1; //分配失敗的話返回-1;
}
L.length = 0; //剛分配的數組裡面的值都是垃圾值;
L.listsize = LENGTH; //數組可容納元素個數;

return 0; //0表示動態數組創建成功;
}

int main(void)
{
int ret = 0;
struct SQList *L;
ret = InitList(L);
if(ret!=0) //如果動態分配內存失敗,下面的代碼就不執行了。
{
return ret;
}

for(int i = 0; i &< L.listsize; i++) { L.arr[i] = i; L.length++; } for(int i = 0; i &< L.length; i++) { printf("L.arr[i]: %d ",L.arr[i]); } return 0; }


我猜你一定沒有認真看有關指針、malloc以及結構部分的內容。即使有答主貼出代碼來,這三部分知識不搞明白,你還是看不懂


不就是單鏈表嗎


這本書加上郝斌數據結構視頻。


正好前幾天用過,寫了幾行瓜皮代碼 如下~

#ifndef _Class_Array_
#define _Class_Array_

#include &
#include &
#include &

#define Class_Array struct _Class_Array
struct _Class_Array{
int (*Add)(Class_Array*, void*);
int (*Set)(Class_Array*, int, void*);
void* (*Get)(Class_Array*, int);
int (*GetNumber)(Class_Array*);
int Number;
int SingleSize;
void *Data;
};

/*
*添加新的成員到數組內
*參數:Class_Array對象指針, 要加入的數據
*/
static int AddElement(Class_Array *this, void *Data){
void *TempRow = NULL;
int TempNumber = 0;
if (this == NULL)
return -1;
if (this -&> Data == NULL || Data == NULL)
return -1;
TempNumber = (this -&> Number) * (this -&> SingleSize);
TempRow = realloc(this -&> Data, TempNumber + this -&> SingleSize);
if (TempRow == NULL)
return 0;
memcpy(TempRow + TempNumber, Data, this -&> SingleSize);
this -&> Data = TempRow;
(this -&> Number) ++;
return this -&> Number;
}

/*
*獲得成員數據對象指針
*參數:Class_Array對象指針, 要獲得的成員位置
*返回值: 成員數據指針
*/
static void *GetElement(Class_Array *this, int Position){
if (this == NULL)
return NULL;
if (this -&> Data == NULL)
return NULL;
if (Position &> (this -&> Number) || Position &< 0) return NULL; return (this -&> Data + (Position * this -&> SingleSize));
}

/*
*設置成員數據
*參數:Class_Array對象指針, 要設置的成員位置, 數據
*返回值:成功返回1, 失敗返回 -1;
*/
static int SetElement(Class_Array *this, int Position, void *Data){
void *SetDataPos = NULL;
if (this == NULL)
return -1;
if (this -&> Data == NULL || Data == NULL)
return -1;
if (Position &> (this -&> Number) || Position &< 0) return -1; SetDataPos = GetElement(this, Position); if (SetDataPos == NULL) return -1; memcpy(SetDataPos, Data, this -&> SingleSize);
return 1;
}

/*
*獲得數組成員數量
*參數:Class_Array指針
*返回值:數組成員數量
*/
static int GetNumber(Class_Array *this){
if (this == NULL)
return 0;
return this -&> Number;
}

/*
*構造函數
*參數:單個結構大小(如果&<=0 則默認大小256位元組) *返回值:Class_Array對象指針 */ Class_Array *NewClass_Array(int SingleSize){ Class_Array *this = NULL; this = (Class_Array*)calloc(1, sizeof(Class_Array)); if (this == NULL) return NULL; this -&> SingleSize = (SingleSize &<= 0 ? 256 : SingleSize); this -&> Data = (void*)calloc(1, this -&> SingleSize);
if (this -&> Data == NULL)
return NULL;
(this -&> Number) ++;
this -&> Add = AddElement;
this -&> Set = SetElement;
this -&> Get = GetElement;
this -&> GetNumber = GetNumber;
return this;
}

/*
*析構函數
*參數:Class_Array對象指針
*返回值:無
*/
void DelClass_Array(Class_Array *this){
if (this == NULL)
return ;
if (this -&> Data != NULL){
free(this -&> Data);
this -&> Data = NULL;
}
free(this);
this = NULL;
}

#endif


我給個C++版,只實現了動態擴容——縮容的原理是一樣的。在需要擴容的時候,新建立一個2倍容量的堆對象數組,把原來的數據複製過去,然後把舊的堆對象刪掉,最後讓data指針指向新的堆對象。

#include &
#include &
using std::cin;
using std::cout;
using std::endl;
using std::sort;
class vector{
private:
int size;
int number;
int * data;
public:
vector(int size);
vector(vector v);
vector();
~vector();
void insert(int value);
void expand();
void show();
void sort_array();
};
vector::vector(int size){
this-&>size=size;
number=0;
data=new int[size];
}
vector::vector(vector v){
size=v.size;
number=v.number;
data=new int[size];
for (int i = 0; i &


len + = len_initialized;

然後再relloc一次就搞定了。


橙皮書上面有講啊

雖然是Java代碼,但其實都是一樣的內容。當數組滿的時候新建一個長度為原來兩倍的數組,當數組只有四分之一的items 時候將數組長度減半


推薦閱讀:

c語言是否可以通過調用void函數來完成對數組的賦值?
C編譯器用什麼語言寫的?
這個指針C語言如何聲明?
不用QT,你能讓UI同時運行在Mac, IOS, Windows, Android, Linux上嗎?
如何用C/C++動手編程一款windows平台下的屬於自己的音樂播放器軟體?

TAG:C編程語言 | 數據結構 | CC | 演算法與數據結構 |