2009-08-06 51 views
11

Đây là mã cho danh sách được liên kết bằng ngôn ngữ lập trình C.Làm thế nào để sử dụng cấu trúc trong C?

#include <stdio.h> /* For printf */ 
#include <stdlib.h> /* For malloc */ 

typedef struct node { 
    int data; 
    struct node *next; /* Pointer to next element in list */ 
} LLIST; 

LLIST *list_add(LLIST **p, int i); 
void list_remove(LLIST **p); 
LLIST **list_search(LLIST **n, int i); 
void list_print(LLIST *n); 

Mã chưa hoàn thành, nhưng tôi nghĩ là đủ cho câu hỏi của tôi. Ở đây ở cuối của nút cấu trúc "LLIST" được sử dụng, và nó cũng được sử dụng như một kiểu trả về trong việc tạo mẫu của hàm list_add. Chuyện gì vậy?

Trả lời

6

typedef tạo "loại" mới trong chương trình của bạn, vì vậy giá trị trả lại và loại tham số của các hàm đó chỉ là cấu trúc của bạn. Nó chỉ là viết tắt để sử dụng struct node cho loại.

Nếu bạn đã tạo ra một nút mới, bạn có thể làm điều đó như thế này (bằng cách sử dụng loại):

LLIST *node = malloc(sizeof(LLIST)); 
node->data = 4; 
node->next = someOtherItem; 
list_add(node, 1) 

Ngoài ra, với các nguyên mẫu hàm trong câu hỏi, bạn không thực sự cần những đôi con trỏ; kể từ khi dữ liệu trong cấu trúc của bạn chỉ là một int, bạn có thể làm một cái gì đó giống như

LLIST *list_add(int data, int position); 

thì list_add chức năng sẽ xử lý việc phân bổ, sao chép int vào struct và thêm nó vào danh sách liên kết.

Đặt tại một vị trí nhất định cũng đơn giản như thay đổi con trỏ next trong nút trước nút đến địa chỉ của nút mới được phân bổ và con trỏ next trong nút mới trỏ đến điểm tiếp theo các nút trước khi một trong những ban đầu được chỉ vào).

Hãy nhớ rằng (với phần còn lại của các nguyên mẫu hàm), bạn sẽ phải theo dõi các con trỏ tới mọi nút bạn tạo để xóa tất cả chúng.

Tôi không chắc mình hiểu cách chức năng tìm kiếm hoạt động. Toàn bộ điều này có thể được thực hiện tốt hơn rất nhiều. Bạn không nên để cung cấp vị trí của nút khi bạn tạo nút đó (nếu bạn chỉ định số cao hơn số nút?), V.v.

10

LLIST chỉ là một tên kiểu khác cho cấu trúc đã được tạo. Nói chung, định dạng sau sẽ tạo loại "NAME" là "struct x":

typedef struct x { ... } NAME; 
23

Đó là typedef. Nó thực sự làm hai việc cùng một lúc. Đầu tiên, nó định nghĩa một cấu trúc:

struct node { 
    int data; 
    struct node *next; 
} 

Và sau đó thực hiện một typedef:

typedef struct node LLIST; 

Điều đó có nghĩa LLIST là một loại, giống như int hay FILE hoặc char, đó là một viết tắt cho struct node, bạn cấu trúc nút danh sách liên kết. Không cần thiết - bạn có thể thay thế LLIST bằng struct node trong tất cả các vị trí đó - nhưng nó giúp đọc dễ dàng hơn một chút và giúp ẩn việc triển khai từ người dùng cuối kỳ quặc.

10

C yêu cầu bạn tham chiếu cấu trúc với tiền tố "cấu trúc", vì vậy, thông thường bạn nên đưa ra một typedef để đề cập ít chi tiết hơn.

Đó là, việc kê khai của struct của bạn có hai phần, và có thể được viết lại như vậy:

struct node { 
    int data; 
    struct node *next; /* pointer to next element in list */ 
}; 

typedef struct node LLIST; 

Vì vậy, LLIST chỉ là một tên khác cho struct node (nhờ Chris Lutz).

3

LLIST* là con trỏ tới cấu trúc được xác định theo cấu trúc LLIST.

Bạn nên làm

LLIST* myList = malloc(sizeof(LLIST)*number_of_elements); 

có một số bộ nhớ được phân bổ cho danh sách này. Thêm và xóa các mục yêu cầu bạn phải tái phân bổ bộ nhớ bằng cách sử dụng realloc. Tôi đã viết một số đoạn mã cho các danh sách (được tạo bằng các mảng).

Tôi có thể đăng mã ngay khi tôi ở nhà, hiện không phải là trường hợp.

+0

Về mặt kỹ thuật, bạn nên thực hiện 'malloc' cho từng mục trong danh sách, vì nó không phải là một danh sách đúng mà là một cấu trúc với một con trỏ ('* next') đến mục tiếp theo trong danh sách. Vì vậy, bạn làm một malloc riêng biệt khi tạo ra từng mục danh sách. – wizzwizz4

Các vấn đề liên quan