0
Tải bản đầy đủ (.pdf) (51 trang)

Nhập dữ liệu cho một cấu trúc móc nố i:

Một phần của tài liệu TÀI LIỆU TÓM TẮT NGÔN NGỮ LẬP TRÌNH C PPT (Trang 40 -44 )

Giả thiết bạn có khai báo sau: typedef struct sinhvien

char ht[20]; char qq[20]; int tuoi;

struct sinhvien *tiep; }sinhvien;

Khai báo trên cho biết bạn. Có một cấu trúc sinhviên gồm 3 tr−ờng, và một con trỏ tên là tiếp. Bây giờ bạn có thể dùng cấu trúc này để khai báo các biến cấu trúc kiểu sinh viên. Với một chú ý là việc nhập dữ liệu hay bất cứ một thao tác nào trên cấu trúc đều phải sử dụng con trỏ. Khác với l−u trữ mảng, l−u trữ móc nối luôn có 1 con trỏ trỏ đến đầu danh sách, mục đích để dữ đầu mối, mỗi khi bạn thao tác trên cấu trúc đều bắt đầu từ đầu mối nàỵNếu muốn duyệt qua danh sách bạn phải sử dụng thêm 1 con trỏ khác để duyệt.

Chú ý

Đây cũng là 1 hình thức khai báo động, cho nên đầu ch−ơng trình bạn phải khai báo th− viện “alloc.h”.

Cú pháp

khai báo động nh− sau:

pd=(tên cấu trúc*)malloc(sizeof(tên cấu trúc));

Trong đó pd là con trỏ trỏ đầu danh sách. Nếu nh− từ phần tử thứ hai trở đi bạn phải dùng con trỏ khác để nhập dữ liệụ

Tôi xẽ mô tả bằng lời quá trình nhập dữ liệu và sau đó là ví dụ điển hình:

Với một cấu trúc đ−ợc định nghĩa nh− trên bạn cần hai con trỏ để phục vụ cho việc nhập dữ liệu

Con trỏ 1 luôn nắm đầu danh sách. Nh−ng lúc đầu danh sách còn rỗng, vì vậy nó làm nhiệm vụ nhập phần tử đầu tiên. Sau đó nó nh−ờng lại quyền này cho con trỏ thứ 2 con trỏ này tiếp tục làm nhiệm vụ đ−ợc giao đồng thời nắm dữ cuối danh sách để nhập tiếp dữ liệu, đến khi thôi thì nó cũng coi nh− hết nhiệm vụ và đ−ơng nhiên nó không còn liên quan gì tới danh sách này nữạSau khi nhập xong bạn đã có 1 danh sách: Có con trỏ pd đang nắm đầu danh sách.

VD:

Hãy nhập từ bàn phím danh sách một số sinh viên gồm các thông tin sau: họ tên , quê quán, và tuổị

Ch−ơng trình : #include<stdiọh>

#include<coniọh> #include<string.h> #include<alloc.h> typedef struct sinhvien

{

char ht[20]; char qq[20]; int tuoi;

struct sinhvien *tiep; }sinhvien;

main () {

char hoten[20]; /* bắt buộc phải khai báo thêm vì bạn dùng vòng while(1)*/ sinhvien *pd,*p; /* hai biến trỏ trong thân hàm*/

pd=NULL; /*đầu tiên pd không trỏ vào đâu cả*/

while(1) /* gọi là vòng lặp vô tận để thoát khỏi vòng này phụ thuộc vào câu lệnh break */

{

fflush(stdin);

printf("nhap ho ten:");gets(hoten);

if(hoten[0]==0)break; /* nếu hoten=0 thì thoát khỏi vòng lặp */ if(pd==NULL) /* nếu là phần tử đầu tiên của danh sách*/ {

pd=(sinhvien*)malloc(sizeof(sinhvien)); /*xin bộ nhớ cho phần tử đầu tiên */ p1=pd; /* gán 1 con trỏ khác = pd để nó làm tiếp nhiệm vụ nhập */

} else

{ /* từ lần nhập thứ 2 trở đi */

p1->tiep=(sinhvien*)malloc(sizeof(sinhvien));

p1=p1->tiep; /*p1->tiêp <=> link(p1) trong giải thuật */ }

strcpy(p1->ht,hoten); /* câu lệnh nhập tr−ờng ht vào trong danh sách nó khác câu lệnh nhập qq ở d−ới vì nó đã đ−ợc nhập vào máy rồi*/

printf("\n nhap tuoi:");scanf("%d",&(p1->tuoi));

p1->tiep=NULL; /*sau mỗi vòng lặp ấn định không còn phần tử tiếp theo vì có thể quay lại vòng khác bạn không nhập nữa*/

}

}

Chú ý:

Bạn nên làm quen với những quy định sau:

1. p=NULL: tức là không trỏ vào đâu cả.Con trỏ chỉ có thể nắm địa chỉ của 1 phần tử trong danh sách.

2. p=p->tiêp <=> p=link(p) <=>a[i] =>a[i+1] :phần tử tiếp theo của danh sách. Nh−ng với chú ý p->tiếp bao giờ cũng chạy tr−ớc p một b−ớc.

3. p->tiếp=NULL:không trỏ vào đâu nữa và cũng là phần tử cuối cùng của 1 danh sách.

4. strcpy(p->ht,hoten); đẩy tr−ờng họtên vào trong danh sách bắt buộc hotên đã đ−ợc nhập vào trong máy rồị Chú ý tr−ờng ht[20] hoàn toàn khác với hoten[20].

3.Thao tác trên cấu trúc:

Có rất nhiều thao tác trên danh sách ví dụ nh− hiển thị danh sách lên màn hình,tìm tên một ng−ời nào đó có hoặc không có trong danh sách, loại bỏ một ng−ời ra khỏi danh sách hoặc bổ sung...Nh−ng ở tr−ớc hết bạn hãy làm quen với hai công 3 công việc đơn giản nhất đó là nhập, hiển thị và tìm ng−ời nào đó có trong danh sách. Còn nếu bạn muốn tìm hiểu sâu hơn thì hãy xem ví dụ tổng hợp cuối phần nàỵ

ở trên Tôi đã giới thiệu cách nhập 1 danh sách bây giờ Tôi giới thiệu tiếp việc in 1 danh sách và tìm ng−ờị

Hiển thị danh sách:

Sau khi bạn nhập vào 1 danh sách và bạn ấn định 1 con trỏ(có tên) dữ đầu danh sách khi đó bạn muốn truy nhập vào danh sách đó bạn phải dùng 1 con trỏ khác có cùng kiểu dữ liệu gán bằng nó để làm nhiệm vụ(nếu không làm nh− vậy bạn sẽ mất đầu mối tức là mất địa chỉ), bằng câu lệnh:

VD p1=pd;

Và phép duyệt danh sách t−ơng ứng là: p1=p->tiếp xẽ cho phép bạn đi từ đầu đến cuối danh sách.

Cùng với ví dụ trên Tôi xẽ làm tiếp phần còn lại của công việc là hiển thị ra màn hình.

Tiếp ví dụ trên: p1=pd;

while(p1!=NULL)

{

printf("\n in ho ten:%s",p1->ht); printf("\n in que quan:%s",p1->qq); printf("\n in tuoi:%d",p1->tuoi); p1=p1->tiep;

}

}

Cứ 1 vòng lặp thì in đ−ợc 1 ng−ời vì con trỏ chỉ dữ địa chỉ đ−ợc 1 ng−ờị Trong while() bạn thử thay =p1->tiep!=NULL xem điều gì xẽ sảy rạ

Một phần của tài liệu TÀI LIỆU TÓM TẮT NGÔN NGỮ LẬP TRÌNH C PPT (Trang 40 -44 )

×