數據結構中所講的動態分配的數組如何在 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平台下的屬於自己的音樂播放器軟體?