2010-10-28 79 views
5

hey guys đúng vì vậy tôi đã gặp phải vấn đề này trong 6 giờ qua và đã được đánh google như điên không có kết quả. Tôi cần một con trỏ tới một mảng. Mảng này chứa các con trỏ tới các danh sách được liên kết. Im sẽ phải malloc nó kể từ khi tôi không biết kích thước mảng cho đến khi thời gian chạy.Con trỏ tới một mảng con trỏ đến các danh sách được liên kết

LList **array 

đây là suy nghĩ đầu tiên của tôi nhưng điều này chỉ mang lại cho tôi một con trỏ đến một mảng LList. Hay ít nhất đó là sự hiểu biết của tôi. Ai đó có thể cho tôi một tay không? Alex

EDIT: ok một số thông tin về cách sử dụng. Im triển khai bảng băm rất cơ bản. có một cấu trúc có chứa một con trỏ tới một mảng các con trỏ đến các danh sách liên kết. nó cần phải là một con trỏ đến mảng để khi tôi thay đổi kích thước bảng, tôi chỉ có thể thay đổi con trỏ để trỏ đến bảng lớn hơn.

+0

Ban đầu ở đầu bạn đã nói "con trỏ tới mảng ... [có chứa con trỏ tới danh sách được liên kết" nhưng chỉnh sửa mới của bạn bây giờ nói "con trỏ đến một danh sách được liên kết". Cái nào – user470379

+0

bắt tốt. đã chỉnh sửa lại. con trỏ đến mảng của con trỏ đến danh sách liên kết là những gì im đi cho. – Alex

+0

Tôi đã chỉnh sửa câu trả lời của tôi bên dưới để cho biết cách bạn thay đổi kích thước. Đó có phải là mối quan tâm chính của bạn sau bản chỉnh sửa mới, hay có điều gì khác mà bạn đang tự hỏi? – user470379

Trả lời

5

Có vẻ như bạn đang đi đúng hướng.

LList **array; 
array = malloc(num_ptrs * sizeof(LList*)); 

array tại là một mảng của các con trỏ tới LList, và các yếu tố như array[3] sẽ là một con trỏ đến một LList.

Mảng và con trỏ rất giống với C (nhưng không giống hệt nhau!), Như được hiển thị trong ví dụ cổ điển: *(array + 2) chủ yếu là tương đương với array[2].

Edit: Khi bạn cần thay đổi kích thước bảng, bạn sẽ chỉ cần realloc không gian thêm:

LList **new_array; 
new_array = realloc(old_array, new_size * sizeof(LList*)); 

new_arrayold_array có thể hoặc không có thể cùng một con trỏ sau đó, nhưng một trong hai cách new_array được đảm bảo là con trỏ tới đủ không gian để giữ mảng mới (hoặc NULL nếu bộ nhớ không thể được cấp phát)

2nd Edit: Như user411313 ám chỉ, nếu bạn muốn con trỏ thực tế để mảng, bạn sẽ cần phải lấy địa chỉ của mảng:

LList ***p_array; 
p_array = &array; 
+0

sai. câu hỏi là một con trỏ tới một mảng các con trỏ tới LList. giải pháp của bạn chỉ là một mảng các con trỏ tới LList. – user411313

+0

cố định .......... – user470379

0

Một con trỏ đến một đối tượng, về cơ bản giống như một con trỏ tới một mảng.

int * blah; // an int pointer. It could point to an array of ints, or a single int. 
int ** blah; // a pointer to an int pointer. It could point to something that points to an int, or it could be pointing to an array of pointers to single ints, or it could be a pointer that points to an array of ints. 

Tất cả phụ thuộc vào cách bạn sử dụng.

0

nếu bạn phải viết danh sách liên kết của riêng bạn, bạn có thể làm điều này.

typedef struct LLNode { 
    LLNode* next; 
    int  data; 
} LLNode; 

LLNode* linkedList = null; // a linked list 

LLNode** linkedListArray = (LLNode**) malloc(arraySize* sizeof(LLNode*)); 

LLNode*** pointerToLListArray = &linkedListArray; 

với một thư viện danh sách liên kết:

LList* linkedListArray = (LList*) malloc(arraySize* sizeof(LList)); 

LList** pointerToLListArray = &linkedListArray; 
0

Một con trỏ đến một con trỏ cũng có thể là một mảng của con trỏ.


int nLists; /* number of lists*/ 
LList **array; 
array = (LList **)malloc(nLists * sizeof(LList *)); 

sẽ tạo array là một chuỗi con trỏ đến LList. Sau đó, array[i] sẽ cung cấp cho bạn con trỏ đến danh sách được liên kết thứ i trong mảng.

0
typedef struct LList LList; 
struct LList { 
int value; 
LList *next; }; 

LList *(*p)[3]; /* pointer to an array of 3 pointers to LList */ 
LList ll1 = {11}; 
LList ll2 = {22}; 
LList ll3 = {33}; 
size_t sizeofarray = sizeof*p/sizeof**p; /* calc arraysize at runtime here */ 
p = malloc(sizeofarray * sizeof**p); /* allocate space for each LList-pointer in array */ 
(*p)[0] = &ll1; 
(*p)[1] = &ll2; 
(*p)[2] = &ll3; 
/* test output here: */ 
printf("\n%d\n%d\n%d", ((*p)[0])->value,((*p)[1])->value,((*p)[2])->value); 
free(p); 
Các vấn đề liên quan