1 - danh sách ở đây là danh sách liên kết hả bạn?
nếu như vậy thì bạn có thể làm như sau:
Code:typedef struct _hs { char ten[30]; int diem[2]; _hs *pNext; }hocsinh;
Ví dụ mình khai báo cấu trúc thế này
Bây giờ mình muốn khai báo cấu trúc động với biến là danhsach ( với cấu trúc như trên )thì phải khai báo thế nào?PHP Code:typedef struct
{
char ten[30];
int diem[2];
}hocsinh;
Rồi khi dùng cấu trúc động thì mình truy cập vào từng biến kiểu gì, vẫn dùng danhsach[i].ten được không?
1 - danh sách ở đây là danh sách liên kết hả bạn?
nếu như vậy thì bạn có thể làm như sau:
Code:typedef struct _hs { char ten[30]; int diem[2]; _hs *pNext; }hocsinh;
^_,^
Facebook : https://www.facebook.com/langmaninternet
Bùi Tấn Quang
Theo mình nghĩ chắc là bạn hỏi về cấp phát bộ nhớ động cho mảng cấu trúc danhsach. Việc cấp phát bộ nhớ động cho mảng cấu trúc cũng như các thao tác truy xuất tới các thành phần trong mảng cấu trúc đều giống với mảng thông thường. Có thể demo một đoạn code như sau:
Đúng như bạn nói, bạn vẫn có thể truy xuất đến các thành phần của mảng cấu trúc bằng cách danhsach[i].ten, danhsach[i].diem. Nói chung mổi phần tử danhsach[i] của mảng cấu trúc danhsach là một cấu trúc kiểu hocsinh.C Code:
void main() { int N; hocsinh *danhsach; /* khai bao bien con tro kieu hocsinh */ /* cap phat N vung nho kieu cau truc hocsinh */ ------------------------------------- -------------------------------------
/* The thing that I think is the thing that I do. */
Post bài rồi mới thấy bài bạn này. Mình có chút thắc mắc, mình tưởng bộ nhớ động là khi mình nhập càng nhiều học sinh vào thì bộ nhớ được cấp phát càng rộng ra chứ. Sao lại phải khai báo số học sinh trước, thế thì nó có khác gì với bộ nhớ tĩnh đâu. Giải đáp hộ mình với, mình lại rối rồi
Tất nhiên vẫn có thể được. Làm theo dạng danh sách liên kết. Còn nếu là mảng cấu trúc thì phải nhập số học sinh N thôi. Lý do đã là mảng thì các phần tử của nó xếp cạnh nhau, như vậy ta mới có thể truy xuất tới các thành phần của nó được. Nếu như muốn mổi lần nhập thì mới cấp phát luôn thì chỉ có cách dùng danh sách liên kết, truy xuất thông qua con trỏ.
/* The thing that I think is the thing that I do. */
À thông thường khi cấp phát bộ nhớ động cho mảng cấu trúc người ta vẫn phải nhập N. Khác với cấp phát tĩnh ở đây là mình cấp phát đúng N vùng nhớ cho nó chứ không phải khai báo 1 mảng với kích thước là một hằng số bất kỳ (thông thường sẽ lớn hơn số vùng nhớ thực tế sử dụng, gây lãng phí).
/* The thing that I think is the thing that I do. */
- Trong C không cần ép kiểu vì nó sẽ tự động ép hết qua void*. Nếu dùng C++ compiler thì mới nên ép kiểu thế này.C++ Code:
danhsach = (hocsinh *) malloc(sizeof(hocsinh) * N);
- Cậu nên tập thói quen dùng malloc() với free().
Chậc, mình vẫn không sử dụng được, dịch nó vẫn báo lỗi, mọi người xem hộ khai báo cấu trúc động với cái hàm themhocsinh của mình với
PHP Code:#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct
{
char ho_ten[30];
float diem[10];
}hocsinh;
hocsinh *ds;
ds=(hocsinh *)malloc(sizeof(hocsinh)*500);
int a=0;
void themhocsinh() //nó báo lỗi ở hàm này nên mình chỉ đưa hàm này ra thôi
{
int d=0;
char hoten[30];
float diemthi[10];
do{
printf("Nhap ho va ten\n");
gets(hoten);
if(strlen(hoten)==0)
d=1;
else{
strcpy(ds[a].ho_ten,hoten);
printf("Nhap so diem\n");
scanf("%d",&ds[a].diem);
a++;
}
}while(d!=1);
}
Đã được chỉnh sửa lần cuối bởi goroshi : 02-09-2008 lúc 01:21 PM.