Con trỏ và kiểu cấu trúc

Một phần của tài liệu Giáo trình cấu trúc dữ liệu và giải thuật (ngành quản trị mạng) (Trang 148 - 178)

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");

Một phần của tài liệu Giáo trình cấu trúc dữ liệu và giải thuật (ngành quản trị mạng) (Trang 148 - 178)