NGÔN NGỮ LẬP TRÌNH C Dữ liệu kiểu cấu trúc Ninh Thị Thanh Tâm Khoa CNTT – HV Quản lý Giáo dục Mục đích Biết cách khai báo kiểu liệu phức tạp: cấu trúc Cách biểu diễn kiểu danh sách liên kết nhờ cấu trúc tự trỏ Các thao tác danh sách liên kết Nội dung Cấu trúc niệm, định nghĩa Khai báo cấu trúc Đặt tên kiểu liệu Thao tác biến cấu trúc Truyền biến cấu trúc cho hàm Khái Các cấu trúc tự trỏ Ngăn xếp - LIFO Hàng đợi - FIFO Cây nhị phân – BINARY TREE Cấu trúc Khái niệm, định nghĩa Khai báo cấu trúc Đặt tên kiểu liệu Thao tác biến cấu trúc Truyền biến cấu trúc cho hàm Khái niệm, định nghĩa Cấu trúc: Một kiểu liệu bao gồm nhiều thành phần thuộc nhiều kiểu liệu khác Khai báo cấu trúc Khai báo kiểu liệu cấu trúc: struct { }; struct từ khóa đứng trước khai báo cấu trúc tên hợp lệ, dùng làm tên cấu trúc tương tự khai báo biến Ví dụ struct sinhvien { char ho_ten[30]; float diemtb; }; struct diem { float x,y; }; Khai báo cấu trúc (2) Khai báo biến cấu trúc: struct ; Ví dụ: struct sinhvien sv, dssv[100]; struct diem p, q, dsdiem[50]; Khai báo cấu trúc (3) Khai báo đồng thời cấu trúc biến cấu trúc: struct [] { } ; Ví dụ struct dagiac { int n; struct diem dsdinh[20]; } dg1, dg2; Có thể khai báo trực tiếp kiểu thành phần biến cấu trúc bên cấu trúc lớn struct dagiac { int n; struct { float x, y; } dsdinh[20]; } dg1, dg2; /*dsmn4.c*/ #include #include #include typedef struct mn { int so; struct mn *next; } mn; mn *ds; int m = 10; void taoday(){ int i; mn *p; randomize(); ds = NULL; for (i=0; iso = random(51); p->next = ds; ds = p; } } void sapxep(){ mn *p, *t; int x; p = ds; for (p = ds; p->next; p = p->next) for (t = p->next; t; t=t->next) if (p->so < t->so) { x = p->so; p->so = t->so; t->so = x; } } void inday(){ mn *p; for (p=ds; p; p=p->next) printf("%5d",p->so); puts(""); } void xoasau(mn *p){ if (p->next) p->next = (p->next)->next; else printf("Khong hop le"); } void main(){ mn *p; clrscr(); taoday(); inday(); sapxep(); inday(); for (p = ds; p->next;) if ((p->next)->so %2==0) xoasau(p); else if (p->next) p = p->next; if (ds->so%2==0) ds = ds->next; inday(); getch(); } Kết Ví dụ - FIFO Đưa vào danh sách móc nối thông tin tên điểm học sinh; nhập điểm chuẩn: Đưa học sinh đạt điểm chuẩn vào đầu danh sách Những học sinh không đạt xuống cuối danh sách (không làm thay đổi thứ tự) /*dsmn5.c*/ #include #include #include typedef struct { char ten[20]; float diem; } hocsinh; typedef struct mn{ hocsinh hs; struct mn *next; } ptr; ptr *ds; void taods(){ ptr *p, *q; hocsinh x; float d; char w[20]; ds = NULL; puts("Nhap danh sach ten, diem Het go /"); fflush(stdin); gets(w); while (strcmp(w,"/")){ strcpy(x.ten,w); scanf("%f",&d); x.diem = d; p = (ptr*)malloc(sizeof(ptr)); p->hs = x; p->next = NULL; if (ds) q->next = p; else ds = p; q = p; fflush(stdin); gets(w); } } void sapxep(){ float d; hocsinh x; ptr *p; int tiep = 1; printf("Nhap diem chuan"); scanf("%f",&d); while (tiep){ tiep = 0; for (p=ds; p->next; p=p->next) if (p->hs.diemnext)->hs.diem>=d){ x = p->hs; p->hs = (p->next)->hs; (p->next)->hs = x; tiep = 1; } } } void inds(){ ptr *p; for (p=ds; p; p=p->next) printf("%s %6.1f\n",p->hs.ten,p->hs.diem); getch(); } void main(){ taods(); inds(); sapxep(); inds(); } Cây tìm kiếm nhị phân Ví dụ: Nhập dãy số thực Xây dựng tìm kiếm nhị phân từ dãy số /*tree.c*/ #include #include #include typedef struct node { float k; struct node *left, *right; } node; node *goc; node *nutmoi(float x); void them(float x, node *p); void taocay(); void incay(node *p); void tim(float x, node *p, int t); void main(){ float y; taocay(); incay(goc); printf("Nhap y="); scanf("%f",&y); tim(y,goc,1); incay(goc); getch(); } node *nutmoi(float x){ node *p; if(!(p=(node*)malloc(sizeof(node)))){ printf("Loi cap phat bo nho"); getch(); exit(0); } p->k = x; p->left = p->right = NULL; return p; } void them(float x, node *p){ if (x==p->k) return; if (xk){ if (p->left) them(x,p->left); else p->left = nutmoi(x); } else{ if(p->right) them(x,p->right); else p->right = nutmoi(x); } } void taocay(){ float x; int i, n; printf("x="); scanf("%f",&x); printf("n="); scanf("%d",&n); for (i=1; ileft); printf("%6.1f",p->k); incay(p->right); } void tim(float x, node *p, int t){ if(!p){ printf("Khong tim thay"); getch(); exit(0); } if (p->k==x){ puts("Da tim thay"); getch(); exit(0); } if (xk) tim(x,p->left,t+1); else tim(x,p->right,t+1); }