4. Mối liên quan giữa con trỏ, hàm, mảng, chuỗi và cấu trúc
4.5. Con trỏ và kiểu cấu trúc
a. Con trỏ cấu trúc (con trỏ bản ghi):
Trong C có 2 cách định nghĩa cấu trúc một bản ghi đó là dùng struct và typedef struct :
struct Date
{
unsigned char day; unsigned char month;
unsigned int year; };
Hoặc typedef struct
{
unsigned char day; unsigned char month;
unsigned int year; } Date;
Định nghĩa 2 bản ghi lồng nhau. Giả sử để lưu trữ thông tin về một sinh viên có sử dụng kiểu Date lưu thông tin ngày sinh như sau:
struct SinhVien {
char Hten [35];
struct Date Ngsinh; /*sử dụng kiểu Date được định nghĩa
ở cách 1*/
float LaptrinhCB, KientrucMT, MangMT, DiemTB;
}sv1, sv2; //sv1, sv2 là 2 biế́n bả̉n ghi SinhVien
Hoặc
typedef struct SinhVien {
char Hten [35];
Date Ngsinh; /*sử dụng kiểu Date được định nghĩa ở
cách 2*/
float TinDC, LaptrinhCB, KientrucMT, MangMT, DiemTB;
} s1, s2 ; /*s1, s2 và SinhVien là các kiểu bả̉n ghi
có cấu trú́c giống nhau*/
- Khai báo biến bản ghi và biến con trỏ bản ghi:
Theo cách 1:
struct SinhVien sv, *p;
Theo cách 2:
Việc khai báo một biến con trỏ kiểu bản ghi cũng tương tự như khai báo một biến con trỏ có kiểu dữ liệu khác, tức là đặt thêm dấu * vào trước tên biến. Cú pháp: struct<Tên cấu trúc> * <Tên biến con trỏ>;
//theo định nghĩa cách 1
Hay <Tên cấu trúc> * <Tên biến con trỏ>;
//theo định nghĩa cách 2
- Truy cập tới từng phần tử (từng trường) bản ghi:
Đối với biến bản ghi: Dùng dấu chấm (.) để phân cách giữa tên biến bản ghi
và tên biến trường
<Tên biến bản ghi>.<Tên biến trường> ;
Ví dụ: sv.Hten=”Nguyen Tuan Nghia”
Đối với biến con trỏ bản ghi: Dùng dấu -> (là dấu – và dấu >) để phân cách giữa tên biến con trỏ bản ghi và tên biến trường
<Tên biến con trỏ bản ghi> -> <Tên biến trường>;
Hay (*<Tên biến con trỏ bản ghi>) . <Tên biến trường>;
Ví dụ:
p=&sv; // cho con trỏ p trỏ vào vù̀ng nhớ của biến sv
printf(“ %s”,p->Hten); //truy nhập qua con trỏ
Hay
printf(“ %s”,(*p).Hten); //truy nhập qua vù̀ng nhớ con trỏ
Ta cũng có thể sử dụng phép toán * để truy cập vùng dữ liệu đang được quản lý bởi con trỏ cấu trúc để lấy thông tin cần thiết.
Cấp phát động chobiến con trỏ bản ghi: Cũng dùng hàm malloc() hoặc calloc để cấp phát.
p=(struct SinhVien*)malloc(sizeof(struct SinhVien)); hay
p=(SinhVien*)malloc(sizeof(SinhVien));
Ví dụ 21: Sử dụng con trỏ bản ghi viết hàm nhập và hàm xuất giá trị của một bản
ghi sinh viên.
//Khai báo tiền xử lý
#include<string.h> #include<conio.h> #include<stdio.h> #include<alloc.h>
//định nghĩa bản ghi Date
typedef struct
{ unsigned char day; unsigned char month; unsigned int year;
} Date;
//định nghĩa bản ghi SinhVien
struct SinhVien
{ char Hten [35]; Date Ngsinh;
float LaptrinhCB, KientrucMT, MangMT, DiemTB; };
Định nghĩa hàm nhapSinhVien
void NhapSinhVien (struct SinhVien *p)
{ char ht[35]; unsigned char d; unsigned int n; float diem;
fflush(stdin); //hàm xó́a vù̀ng đệm bàn phím
printf("\n Ho ten: "); gets(ht) ; strcpy(p->Hten,ht);
//Nhập ngày, tháng, năm sinh của sinh viên
printf("ngay sinh: "); scanf("%u", &d); p->Ngsinh.day=d; printf("thang sinh: "); scanf("%u", &d); p->Ngsinh.month=d; printf("nam sinh: "); scanf("%u", &n); p->Ngsinh.year=n;
//Nhập điểm cho sinh viên
printf("Diem Lap trinh CB: "); scanf("%f", &diem); p->LaptrinhCB=diem; printf("Diem Kien truc MT: "); scanf("%f", &diem); p->KientrucMT)=diem; printf("Diem Mang MT: "); scanf("%f",&diem); p->MangMT=diem;
//Tính điểm trung bình
p->DiemTB=( p-> LaptrinhCB+ p-> KientrucMT+ p-> MangMT )/3; }
//Định nghĩa hàm hiện thông tin về một bản ghi sinh viên void HienSinhVien (struct SinhVien *p)
{//hiện thông tin sinh viên
printf ("\n Sinh vien %35s”, p->Hten);
printf ("\n sinh ngay %2d thang %2d nam %4d “, p- >Ngsinh.day, p-> Ngsinh.month, p->Ngsinh.year);
b. K h a i báo biến mảng bản
ghi và biến con trỏ mảng bản ghi: Theo cách 1:
struct SinhVien ds[100], *p;
Theo cách 2:
SinhVien ds[100], *p;
Khai báo biến con trỏ mảng bản ghi cũng giống như khai báo một biến con trỏ bản ghi, tức là đặt thêm dấu * vào trước tên biến.
Truy cập tới phần tử của mảng bản ghi và trường:
Đối với biến mảng bản ghi:
<Tên biến bản ghi>[chỉ số phần tử].<Tên biến trường> ; Ví dụ: ds[1].Hten=”Nguyen Tuan Nghia”;
ds[2]=ds[1];
Đối với biến con trỏ mảng bản ghi
<Tên biến con trỏ bản ghi>[ chỉ số phần tử] . <Tên biến trường>; 152
printf ("\n Diem Lap trinh CB : %4.1f”, p->LaptrinhCB); printf ("\n Diem Kien truc MT : %4.1f”, p->KientrucMT); printf ("\n Diem Mang MT : %4.1f”, p->MangMT);
printf ("\n Diem TB : %4.1f”, p->DiemTB); getch();
}
//Định nghĩa hàm main()
int main(void) { clrscr;
struct SinhVien *p, sv; /*khai báo biến con trỏ kiểu bản ghi SinhVien*/
p=&sv; //cho con trỏ p trỏ vào vù̀ng nhớ biến sv // hoặc p=(struct SinhVien*)malloc(sizeof(struct SinhVien));
NhapSinhVien(p) ; //gọi hàm NhapSinhVien printf(“\n HIEN THONG TIN CHO MOT SINH VIEN:”);
HienSinhVien (p); // Gọi hàm hienSinhVien//hoặc free(p);
return(0); }//kết
thúc hàm main. Con
Hay (*(<Tên biến con trỏ bản ghi> + < chỉ số phần tử>)) . <Tên biến trường>; Hay (<Tên biến con trỏ bản ghi> + < chỉ số phần tử>) -> <Tên biến
trường>; Ví dụ:
p=ds; // cho con trỏ p trỏ vào vù̀ng nhớ của biến ds
printf(“ %s”,p[1].Hten); //truy nhập qua con trỏ
Hay
printf(“ %s”,(*(p+1)).Hten); //truy nhập qua vù̀ng nhớ con trỏ
hay
(p+i)-> LaptrinhCB= 9; //truy cập theo kiểu bản ghi
Ta phả̉i thêm chỉ số phầ̀n tử vào sau tên biế́n bả̉n ghi
Cấp phát động cho biến con trỏ bản ghi: Cũng dùng hàm malloc() hoặc calloc để cấp phát
p=(struct SinhVien*)malloc(n*sizeof(struct SinhVien)); hay
p=(SinhVien*)malloc(n*sizeof(SinhVien)); n là số lượng bản ghi yêu cầu được cấp phát
Ví dụ 22: Sửdụng con trỏ mảng bản ghi viết hàm nhập và hàm xuất giá trị của một bản ghi sinh viên
//Khai báo tiền xử lý
#include<string.h> #include<conio.h> #include<stdio.h> #include<alloc.h>
//định nghĩa bản ghi Date
typedef struct
{ unsigned char day; unsigned char month;
unsigned int year; } Date;
//định nghĩa bản ghi SinhVien
struct SinhVien { char Hten [35];
Date Ngsinh;
float LaptrinhCB, KientrucMT, MangMT, DiemTB; };
// Định nghĩa hàm nhapDSSV
void NhapDSSV (struct SinhVien *p, int n)
{ char ht; unsigned char d; unsigned int nam; float diem; for (int i=0; i<n; i++)
{ fflush(stdin); //hàm xó́a vù̀ng đệm bàn phím
printf("\n Ho ten: "); gets(ht); strcpy(p[i].Hten,ht);
//Nhập ngày, tháng, năm sinh của sinh viên
printf("ngay sinh: "); scanf("%d",&d); p[i].Ngsinh.day=d; printf("thang sinh: "); scanf("%d", &d ); p[i]. Ngsinh.month=d; printf("nam sinh: "); scanf("%d",&nam);
p[i].Ngsinh.year=nam;
//Nhập điểm cho sinh viên
printf("Diem Lap trinh CB: "); scanf("%f", &diem); p[i].LaptrinhCB=diem; printf("Diem Kien truc MT: "); scanf("%f", &diem); p[i].KientrucMT=diem;
printf("Diem Mang MT: "); scanf("%f", &diem); p[i].MangMT=diem;
//Tính điểm trung bình
p[i].DiemTB=( p[i]. LaptrinhCB+ p[i]. KientrucMT+ p[i]. MangMT )/3; }//kết thúc hàm nhapSinhVien
//Định nghĩa hàm hiện thông tin về một mảng bản ghi sinh viên
void HienSinhVien (struct SinhVien *p, int n) { for (int i=0; i<n; i++)
//hiện thông tin sinh viên
{ printf ("\n Sinh vien %35s”, (*(p+i)).Hten);
printf ("\n sinh ngay %2d thang %2d nam %4d “,p[i].Ngsinh.day, p[i]. Ngsinh.month, [i].Ngsinh.year);
printf ("\n Diem Lap trinh CB : %4.1f”, (p+i)->LaptrinhCB); printf ("\n Diem Kien truc MT : %4.1f”, (p+i)->KientrucMT); printf ("\n Diem Mang MT : %4.1f”, (p+)->MangMT);
printf ("\n Diem TB : %4.1f”, (p+i)->DiemTB); getch(); }//kết thúc hàm //Định nghĩa hàm main() int main(void) { int n; clrscr();
struct SinhVien *p; //khai báo biến con trỏ mảng bản ghi SinhVien
printf(“nhap so luong sv:”); scanf(“%d”,&n);
p=(struct SinhVien*)calloc(n,sizeof(struct SinhVien));
NhapDSSV(p,n) ; //gọi hàm NhapDSSV
printf(“\n HIEN THONG TIN CHO MOT SINH VIEN:”);
HienDSSV (p,n); // Gọi hàm hienDSSV
free(p);
return(0); }//kết thúc hàm main.
Ví dụ 23: Sử dụng các hàm nhập và hiện một sinh viên để viết hàm nhập và
hiện một danh sách sinh viên
//định nghĩa hàm nhập một danh sách sinh viên
void nhapdssv(SinhVien *p, int n) { for (int i=0; i<n; i++)
NhapSinhVien((p+i));
}
//định nghĩa hàm hiện một danh sách sinh viên void hiendssv(SinhVien *p, int n) { for (int i=0; i<n; i++)
HienSinhVien((p+i)); } //định nghĩa hàm main int main(void) { clrscr; SinhVien *p; int n=3; p=(SinhVien*)malloc(3*sizeof(SinhVien));
printf("\n HIEN THONG TIN CHO MOT SINH VIEN:");
hiendssv(p,n); // Gọi hàm hienSinhVien
return(0); free(p); }//kết thúc hàm main.
PHỤ LỤC 2
Chương trình quản lý điểm sinh viên được cài đặt bằng danh sách liên kết đơn. #include <stdio.h>
#include <conio.h> #include <alloc.h> #include <string.h>
//Dinh nghia ban ghi Date typedef struct
{ unsigned char day; unsigned char month; unsigned int year;
} Date;
//Dinh nghia ban ghi SinhVien typedef struct
{ char Hten [35]; Date Ngsinh;
float LaptrinhCB, KientrucMT, MangMT, DiemTB; }SinhVien;
typedef SinhVien ElementType; struct node
{ ElementType info;
struct node* link; };
typedef struct node* listnode; Dinh nghia ham nhapSinhVien void NhapSinhVien (SinhVien *p) { float f; char ht[35];
unsigned char d; unsigned int n;
fflush(stdin); /ham xoa vung dem ban phim
printf("\n Ho ten: ");
gets(ht);strcpy(p->Hten,ht);
//Nhap ngay, thang, nam sinh cua sinh viên printf("ngay sinh: ");
scanf("%d",&d); p->Ngsinh.day=d; printf("thang sinh: ");
scanf("%d",&d); p->Ngsinh.month=d; printf("nam sinh: ");
scanf("%d",&n); p->Ngsinh.year=n; //Nhap diem cho sinh viên printf("Diem Lap trinh CB: "); scanf("%f",&f); p->LaptrinhCB=f; printf("Diem Kien truc MT: "); scanf("%f",&f);p->KientrucMT=f; printf("Diem Mang MT: ");
scanf("%f",&f); p->MangMT=f; //Tinh diem trung bình
p->DiemTB=(p->LaptrinhCB+p->KientrucMT+p->MangMT)/3; }
//Dinh nghia ham hien thong tin mot ban ghi sinh vien void HienSinhVien (SinhVien sv)
{ //hien thong tin sinh viên printf ("\n Sinh vien %35s", sv.Hten);
printf ("\n sinh ngay %2d thang %2d nam %4d ",
sv.Ngsinh.day,sv.Ngsinh.month, sv.Ngsinh.year);
printf ("\n Diem Lap trinh CB : %4.1f", sv.LaptrinhCB); printf ("\n Diem Kien truc MT : %4.1f", sv.KientrucMT); printf ("\n Diem Mang MT : %4.1f", sv.MangMT);
printf ("\n Diem TB : %4.1f", sv. DiemTB); getch();
}
hàm khởi tạo danh sách rỗng
void Initialize (listnode *p) {
*P=NULL; }
ham tao nut moi
listnode newnode (ElementType sv)
{ listnode q;
q=(listnode)calloc (1,sizeof(struct node)); q->info=sv;
q->link = NULL; return (q);
}
//ham chen truoc nut dau
void Insertfirst ( listnode *p, ElementType x)
{listnode q; q= newnode(x); if (*p==NULL) *p=q; else {q->link=*p; *p=q; } }
// ham chen truoc nut cuoi
void InsertEnd ( listnode *p, ElementType x) { listnode q, m; q= newnode(x); if (*p==NULL) *p=q; else {m=*p;
while (m->link != NULL) m=m->link;
m->link=q; }
}
//ham chen truoc mot nut bat ky
void InsertBefor ( listnode *p, listnode r, ElementType x)
if (r == *p) Insertfirst(p,x); else {q= newnode(x); m=*p; while (m->link != r) m=m->link; q->link=r; m->link=q; } }
//ham chen sau mot nut bat ky
void InsertAfter ( listnode *p, listnode r, ElementType x) { listnode q;
if (*p==NULL)
printf("Danh sach rong"); else {q= newnode(x); q- >link = r->link; r- >link = q; } }
//ham xoa mot nut r
void DeleteNode ( listnode *p, listnode r) {listnode m; if (*p ==
NULL)
printf (" DANH SACH RONG"); else if (r == *p) {*p=(*p)->link; free(r); } else {m=*p; 160
while (m->link != r) m=m->link; m->link=r->link; free(r); } }
//ham tim nut co gia tri truong info=x listnode SearchNode ( listnode p, char x[])
{listnode m; if (p == NULL)
printf (" DANH SACH RONG"); else { m=p; while (m !=NULL) if (stricmp(x,m->info.Hten)==0) return (m); else m=m->link; } return (NULL); } //ham tao dsnd void CreateList(listnode *p) { char kt; SinhVien sv; do { NhapSinhVien (&sv); InsertEnd(p,sv);
printf("ban nhap tiep khong c/k: "); fflush(stdin); kt=getchar();
}while (kt!='k'); }
//ham duyet dsnd
void Browselist(listnode p) { listnode q;
SinhVien sv; q=p;
printf("Danh sach noi don:\n"); while (q!=NULL)
{ sv=q->info; HienSinhVien(sv); q=q->link; } getch(); } //ham menu int menu() { int chon; clrscr();
printf("\n MOT SO THUAT TOAN VE DANH SACH NOI DON\n\n"); printf(" Nhan so tuong ung de chon chuc nang:\n");
printf(" 1. Khoi tao danh sach \n");
printf(" 2. Nhap cac phan tu cho danh sach\n"); printf(" 3. In cac phan tu cua danh sach\n"); printf(" 4. Tim mot phan tu cua danh sach\n");
printf(" 5. Bo sung mot phan tu vao sau mot phan tu \n"); printf(" 6. Bo sung mot phan tu vao truoc mot phan tu\n"); printf(" 7. Xoa mot phan tu cua mang\n"); printf(" 0. Thoat khoi chuong trinh\n");
printf(" Nhap so tuong ung: "); scanf("%d",&chon);
return (chon); }
//ham chinh main
void main() {listnode *p,q; int chon; char ht[30]; char kt; ElementType sv; do { chon=menu(); switch (chon) { case 1: Initialize(p); break; case 2: CreateList(p); break; case 3:
printf("\n Cac phan tu co trong danh sach:\n\n") ; Browselist(*p);
getch(); break; case 4:
printf ("\n Nhap HT can tim: "); fflush(stdin); gets(ht1); q=SearchNode(*p,ht1);
if (q!=NULL)
printf("\n Tim thay phan tu trong Danh sach"); else
printf("khong tim thay phan tu trong danh sach"); getch();
break; case 5:
printf ("\n Nhap SV moi: "); NhapSinhVien(&sv);
printf ("\n Nhap HT de tim vt chen sau: "); fflush(stdin);gets(ht1);
q=SearchNode(*p,ht1); if (q==NULL)
printf("\n Khong tim thay phan tu trong DS\n"); else
{
//q la con tro chua vi tri nut tim thay o tren InsertAfter(p,q,sv)
printf(" Da bo sung phan tu \n"); getch();
} break; case 6:
printf ("\n Nhap HT moi: "); NhapSinhVien(&sv); printf ("\n Nhap HT de tim vt chen truoc: "); fflush(stdin); gets(ht1);
q=SearchNode(*p,ht1); if (q==NULL)
printf("\n Khong tim thay phan tu trong DS\n"); else
{
//q la con tro chua vi tri nut tim thay o tren InsertBefor(p,q,sv);
printf(" Da bo sung phan tu \n"); } getch();
break;
case 7:
printf ("\n Nhap ht Sinh vien can xoa: "); fflush(stdin); gets(ht1); q=SearchNode(*p,ht1);
if (q==NULL)
printf("\n Khong tim thay phan tu can xoa\n"); else
{DeleteNode(p,q);
printf(" Da xoa phan tu \n"); } getch();
break;
default: printf ("\n ban chon sai roi! "); }
} while (chon!=0); }//ket thuc ham main
Chương trình chuyển đổi một số hệ 10 sang hệ 2. Sử dụng các thao tác của Stack cài đặt bằng danh sách liên kết đơn để viết chương trình
#include <stdio.h> #include <conio.h> #include<alloc.h>
//Đinh nghĩa kiểu phầ̀n tử
typedef int ElementType; struct node
{ ElementType info;
struct node* link; };
typedef struct node* Stacknode; typedef struct
{
Stacknode top; } Stack;
//Định nghĩa hàm khởi tạo Stack rong void Initialize (Stack *S)
{
S ->top=NULL; };
//Định nghĩa hàm kiểm tra Stack có́ rỗng không?
int Empty(Stack S) {
}
//Định nghĩa hàm đẩy một nút vào Stack
void GetNode ( Stack *S, ElementType x)
{ Stacknode q;
q=( Stacknode) malloc (sizeof(struct node)); q->info=x;
q->link=S->top; S->top=q;
}
//Định nghĩa hàm lấy một nút khỏi Stack
void RemoveNode( Stack *S, ElementType *x) {Stacknode q; if
(Empty(*S))
printf("\n Stack rong"); else { q=S->top; *x=q- >info; S- >top=q->link; free(q); } }
/*Định nghĩa hàm chuển đổi số hệ 10 sang hệ 2 và đưa từng chữ số hệ 2 vào Stack*/
void doiso(Stack *S, ElementType x) { while (x!=0) { GetNode ( S, x%2); x=x/2; } } /*Định nghĩa hàm lấy từng chữ số hệ 2 và in ra màn hình*/
void inra (Stack *S) {ElementType x;
while (!Empty(*S)) { RemoveNode(S,&x); printf("%d",x); } } //Định nghĩa hàm main void main() { Stack *S; ElementType x; Initialize (S); printf("nhap so he 10:");scanf("%d",&x); doiso(S,x); inra (S); getch(); } }
Chương trình cài đặt các giải thuật sắp xếp và tìm kiếm với danh sách sinh viên được cài đặt bằng mảng
#include <stdio.h> #include <conio.h> #include <string.h> const int maxlist=100;
//đinh nghia ban ghi SinhVien struct SinhVien
{ char masv[10]; char Hten [35];
float LaptrinhCB, KientrucMT, MangMT, DiemTB; };
typedef SinhVien Item; typedef struct list
int count; };
// ham khoi tao danh sach rong void initializeList (list *L)
{
L->count=0; }
// ham kiem tra danh sach co rong khong? int EmptyList(list L)
{
return (L.count==0); }
// ham kiem tra danh sach co day khong? int FullList(list L)
{
return (L.count==maxlist); }
//ham bo sung sinh vien x vao vị tri pos
void insertElement (list *L, int pos, Item x) {
int i;
if (FullList (*L))
printf("Danh sach day!"); else
if ((pos <0) || ( pos>=maxlist ))
printf("\n Vi tri chen khong phu hop"); else
{
for (i=L->count;i>=pos;i--)
L-> element [i+1]= L-> element [i]; L-> element [pos]=x; L->count++;
} }
// ham tao danh sach
void NhapSinhVien (SinhVien *p) { float f; char ht[35],ma[10];
unsigned char d; unsigned int n;
fflush(stdin); //ham xoa vung dem ban phim printf("\n ma sinh vien: ");
gets(ma);strcpy(p->masv,ma); printf("\n Ho ten: ");
fflush(stdin);gets(ht);strcpy(p->Hten,ht); //Nhap diem cho sinh viên
printf("Diem Lap trinh CB: "); scanf("%f",&f); p->LaptrinhCB=f; printf("Diem Kien truc MT: "); scanf("%f",&f); p->KientrucMT=f; printf("Diem Mang MT: ");
scanf("%f",&f); p->MangMT=f; //Tinh diem trung bình
p->DiemTB=( p-> LaptrinhCB+ p-> KientrucMT+ p-> MangMT )/3;
}
//ham hien thong tin mot ban ghi sinh vien void HienSinhVien (SinhVien sv)
{
printf ("\n Ma sinh vien %10s", sv.masv); printf ("\n Sinh vien %35s", sv.Hten);
printf ("\n Diem Lap trinh CB : %4.1f", sv.LaptrinhCB); printf ("\n Diem Kien truc MT : %4.1f", sv.KientrucMT); printf ("\n Diem Mang MT : %4.1f", sv.MangMT);
printf ("\n Diem TB : %4.1f", sv. DiemTB); getch();
}
ham tao danh sach sinh vien
void CreateList (list *L)
{ int i=0; char kt;
Item sv; do
{ printf("nhap phan tu thu %d:",i+1); NhapSinhVien(&sv); L-
>element[i]=sv; L->count++;i++;
printf("ban nhap tiep khong c/k? "); fflush(stdin);kt=getchar();
}
while (kt!='k'); }
//ham in danh sach sinh vien ra man hinh
void PrintList(list L) { int i;
if (EmptyList(L))
{ printf("Danh sach rong"); return;
}
for (i=0; i<L.count;i++)
HienSinhVien(L.element[i]); }
ham InsertionSort sap xep danh sach theo ho ten
void InsertionSort (list *L) { int i, j;
Item temp;
for (i=1 ; i<L->count; i++) { temp=L->element[i]; j = i-1; while ((j>=0) && (stricmp(temp.Hten,L->element[j].Hten)>0)) { L->element[j+1] = L->element[j]; j--; } 170
L->element[j+1]=temp ; }
}
//ham SelectionSort sap xep theo ho ten
void SelectionSort (list *L)
{ int i, j, m; Item temp;
for (i=0 ; i<L->count-1; i++) { m = i ;
for (j=i+1 ; j<L->count; j++)
if (stricmp(L->element[i].Hten,L->element[j].Hten)>0) m=j; temp=L->element[i]; L->element[i]=L->element[m]; L->element[m]=temp ; } }
ham InterchangeSort sap xep theo ho ten
void InterchangeSort(list *L) {int i, j;
SinhVien temp;
for ( i=0; i<L->count-1;i++)
for ( j=i+1;j< L->count ;j++)
if (stricmp(L->element[i].Hten,L->element[j].Hten)>0) { temp=L->element[i]; L->element[i]= L->element[j]; L->element[j]=temp ; } }
//ham BubleSort sap xep theo ho ten
void BubleSort (list *L) {int i, j; Item
temp;
for (j=L->count-1 ; j<=i+1; j--) if (stricmp(L->element[i].Hten,L->element[j].Hten)>0) { temp=L->element[j]; L->element[j]=L->element[j-1]; L->element[j-1]=temp ; } }
// ham QuickSort sap xep theo ho ten
void QuickSort(list *L, int left , int right) { int i, j;
Item key,temp;
key= L->element[left]; i = left; j = right;
do
{ while ((stricmp(L->element[i].Hten, key.Hten)<0) && (i <= right))
i++;
while ((stricmp(L->element[j].Hten, key.Hten)>0) && (j >=left)) j--; if(i <=j) { temp=L->element[i]; L->element[i]=L->element[j]; L->element[j]=temp; i++ ; j--; } } while(i <= j); if(left<j) QuickSort(L, left, j); if(i<right) QuickSort(L, i, right); }
//ham QuickSort sap xep theo masv
void QuickSortMSV(list *L, int left , int right)
{ int i, j; Item key,temp; key= L->element[left]; i = left; j = right; do {
while ((stricmp(L->element[i].masv,key.masv)<0) && (i <= right)) i++;
while ((stricmp(L->element[j].masv,key.masv)>0) && (j >=left)) j--; if(i <=j) { temp=L->element[i]; L->element[i]=L->element[j]; L->element[j]=temp; i++ ; j--; } } while(i <= j); if(left<j) QuickSort(L, left, j); if(i<right) QuickSort(L, i, right); }
ham Sequen-Search tim kiem theo masv
int Sequen_Search(list L, char X[]) { int i=0;
for (i=0; i<L.count; i++)
if (stricmp(X,L.element[i].masv)==0) return (i);
return (-1); }
/* ham Sequen_Search theo cach 2 int Sequen_Search1(list L, char X[]) { int i;
strcpy(L.element[L.count].masv,X); while (stricmp(X,L.element[i].masv)!=0) i++; if (i<L.count) return (i); else return (-1); }*/
//ham BinarySearch tim kiem theo masv
int BinarySearch (list L, char X[]) { int mid, left=0, right=L.count-1;
do { mid=(left+right)/2; if (stricmp(X,L.element[mid].masv)==0) return (mid); else if (stricmp(X,L.element[mid].masv)<0) right=mid-1; else left=mid+1; } while(left<=right); return -1; } //ham menu int menu() { int chon; clrscr();
printf("\n MOT SO GIAI TOAN VE SAP XEP VA TIM
KIEM\n\n"); printf(" Nhan so tuong ung de chon chuc nang:\n"); printf(" 1. Khoi tao danh sach \n");
printf(" 2. Nhap cac phan tu cho danh sach\n"); printf(" 3. In cac phan tu cua danh sach\n"); printf(" 4. ham InsertionSort sap xep theo ho ten\n");
printf(" 5. ham SelectionSort sap xep theo ho ten\n");