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

THỰC HÀNH CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.12 MB, 45 trang )

Bài tập thực hành Cấu trúc dữ liệu và giải thuật

GVHD: Nguyễn Hữu Nhân Trang 1

THỰC HÀNH CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT
CẤU TRÚC

// CauTrucNgay.cpp : Defines the entry point for the console
application.
//

#include "stdafx.h"


#include <conio.h>
#include <stdio.h>
#include <math.h>
#include <string.h>
// Khai bao kieu NGAY
struct ngay
{
int ngay;
int thang;
int nam;
};
typedef struct ngay NGAY;

// Nguyen mau ham
int KiemTraNamNhuan(int nam);
int TinhSoNgayTrongThang(int thang, int nam);
int KiemTraHopLe(NGAY ng);


void Nhap(NGAY &ng);
void Xuat(NGAY ng, char *thongbao);
int TinhSTTNgayTrongNam(NGAY ng);
int TinhSTTNgay(NGAY ng);
NGAY TinhNgayHomTruoc(NGAY ng);
NGAY TinhNgayHomSau(NGAY ng);
NGAY TinhNgayTruoc(NGAY ng, int k);
NGAY TinhNgaySau(NGAY ng, int k);
int TinhKhoangCach(NGAY ng1, NGAY ng2);
int SoSanh(NGAY ng1, NGAY ng2);

void main()
Bài tập thực hành Cấu trúc dữ liệu và giải thuật

GVHD: Nguyễn Hữu Nhân Trang 2

{
NGAY ng1, ng2;

Nhap(ng1);
Xuat(ng1, "Ngay 1: ");

Nhap(ng2);
Xuat(ng2, "Ngay 2: ");

if (KiemTraNamNhuan(ng1.nam) == 1)
printf("Nam %d la nam nhuan\n", ng1.nam);
else
printf("Nam %d khong la nam nhuan\n", ng1.nam);


printf("Ngay 1 la ngay thu %d trong nam %d\n",
TinhSTTNgayTrongNam(ng1), ng1.nam);
printf("Ngay 1 la ngay thu %d ke tu 1/1/1\n",
TinhSTTNgay(ng1));

Xuat(TinhNgayHomTruoc(ng1), "Ngay hom truoc cua
Ngay 1 la: ");
Xuat(TinhNgayHomSau(ng1), "Ngay hom sau cua Ngay 1
la: ");

int k;
printf("Nhap k: ");
scanf("%d", &k);

Xuat(TinhNgayTruoc(ng1, k), "Ngay truoc k ngay cua
Ngay 1 la: ");
Xuat(TinhNgaySau(ng1, k), "Ngay sau k ngay cua Ngay
1 la: ");

int n = TinhKhoangCach(ng1, ng2);
if (n < 0)
printf("Ngay 1 truoc ngay 2 %d ngay\n", -n);
else
printf("Ngay 1 sau ngay 2 %d ngay\n", n);
}
Bài tập thực hành Cấu trúc dữ liệu và giải thuật

GVHD: Nguyễn Hữu Nhân Trang 3



// Dinh nghia ham
int KiemTraNamNhuan(int nam)
{
if (nam % 400 == 0 || (nam % 4 == 0 && nam % 100 != 0))
return 1;

return 0;
}

int TinhSoNgayTrongThang(int thang, int nam)
{
int songay;

switch (thang)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
songay = 31;
break;
case 4:
case 6:
case 9:
case 11:
songay = 30;
break;

case 2:
if (KiemTraNamNhuan(nam) == 1)
songay = 29;
else
songay = 28;
break;
default:
songay = 0;
Bài tập thực hành Cấu trúc dữ liệu và giải thuật

GVHD: Nguyễn Hữu Nhân Trang 4

}

return songay;
}


int KiemTraHopLe(NGAY ng)
{
int hople = 1;

if (ng.nam <= 0)
hople = 0;
else
if (ng.thang < 1 || ng.thang > 12)
hople = 0;
else
if (ng.ngay < 1 || ng.ngay >
TinhSoNgayTrongThang(ng.thang, ng.nam))

hople = 0;

return hople;
}

void Nhap(NGAY &ng)
{
int hople;

do
{
printf("Nhap ngay: ");
scanf("%d", &ng.ngay);

printf("Nhap thang: ");
scanf("%d", &ng.thang);

printf("Nhap nam: ");
scanf("%d", &ng.nam);

hople = KiemTraHopLe(ng);
Bài tập thực hành Cấu trúc dữ liệu và giải thuật

GVHD: Nguyễn Hữu Nhân Trang 5

if (!hople)
printf("Nhap lai! Ngay khong hop le.\n");
}
while(!hople);
}


void Xuat(NGAY ng, char *thongbao)
{
printf("%s", thongbao);
printf("%d/%d/%d\n", ng.ngay, ng.thang, ng.nam);
}

int TinhSTTNgayTrongNam(NGAY ng)
{
int stt = 0;

// Tinh tong so ngay cac thang truoc do
for (int i=1; i<ng.thang; i++)
stt = stt + TinhSoNgayTrongThang(i, ng.nam);

stt = stt + ng.ngay;

return stt;
}

int TinhSTTNgay(NGAY ng)
{
int stt = 0;

// Tinh tong so ngay cac nam truoc do
for (int i=1; i<ng.nam; i++)
if (KiemTraNamNhuan(i) == 1)
stt = stt + 366;
else
stt = stt + 365;


stt = stt + TinhSTTNgayTrongNam(ng);

return stt;
Bài tập thực hành Cấu trúc dữ liệu và giải thuật

GVHD: Nguyễn Hữu Nhân Trang 6

}

NGAY TinhNgayHomTruoc(NGAY ng)
{
NGAY kq;

if (ng.ngay == 1) // Ngay dau tien cua thang (1/?/?)
{
if (ng.thang == 1) // Thang dau tien cua nam
(1/1/?)
{
kq.nam = ng.nam - 1;
kq.thang = 12;
kq.ngay = 31;
}
else
{
kq.nam = ng.nam;
kq.thang = ng.thang - 1;
kq.ngay = TinhSoNgayTrongThang(kq.thang,
kq.nam);
}

}
else
{
kq.ngay = ng.ngay - 1;
kq.thang = ng.thang;
kq.nam = ng.nam;
}

return kq;
}

NGAY TinhNgayHomSau(NGAY ng)
{
NGAY kq;

int max = TinhSoNgayTrongThang(ng.thang, ng.nam);

Bài tập thực hành Cấu trúc dữ liệu và giải thuật

GVHD: Nguyễn Hữu Nhân Trang 7

if (ng.ngay == max) // Ngay cuoi cung cua thang
{
if (ng.thang == 12) // Thang cuoi cung cua nam
{
kq.nam = ng.nam + 1;
kq.thang = 1;
kq.ngay = 1;
}
else

{
kq.nam = ng.nam;
kq.thang = ng.thang + 1;
kq.ngay = 1;
}
}
else
{
kq.ngay = ng.ngay + 1;
kq.thang = ng.thang;
kq.nam = ng.nam;
}

return kq;
}

NGAY TinhNgayTruoc(NGAY ng, int k)
{
NGAY kq = ng;

for (int i=0; i<k; i++)
kq = TinhNgayHomTruoc(kq);

return kq;
}

NGAY TinhNgaySau(NGAY ng, int k)
{
NGAY kq = ng;


Bài tập thực hành Cấu trúc dữ liệu và giải thuật

GVHD: Nguyễn Hữu Nhân Trang 8

for (int i=0; i<k; i++)
kq = TinhNgayHomSau(kq);

return kq;
}

int TinhKhoangCach(NGAY ng1, NGAY ng2)
{
return TinhSTTNgay(ng1) - TinhSTTNgay(ng2);
}

int SoSanh(NGAY ng1, NGAY ng2)
{
int kc = TinhKhoangCach(ng1, ng2);

if (kc > 0)
return 1;
else
if (kc < 0)
return -1;
else
return 0;
}


Bài tập thực hành Cấu trúc dữ liệu và giải thuật


GVHD: Nguyễn Hữu Nhân Trang 9

// TamGiac.cpp : Defines the entry point for the console
application.
//Cấu trúc dữ liệu tam giác

#include "stdafx.h"


#include <stdio.h>
#include <conio.h>
#include <math.h>

// Khai bao kieu DIEM & TAMGIAC
struct diem
{
int x; // hoanh do
int y; // tung do
};
typedef struct diem DIEM;

struct tamgiac
{
DIEM dA;
DIEM dB;
DIEM dC;
};
typedef struct tamgiac TAMGIAC;


// Nguyen mau ham
void NhapDiem(DIEM &d);
void XuatDiem(DIEM d, char *thongbao);
float TinhKhoangCach(DIEM d1, DIEM d2);

int KiemTraHopLe(DIEM a, DIEM b, DIEM c);
void NhapTamGiac(TAMGIAC &tg);
void XuatTamGiac(TAMGIAC tg, char *thongbao);
float TinhChuVi(TAMGIAC tg);
float TinhDienTich(TAMGIAC tg);

void main()
Bài tập thực hành Cấu trúc dữ liệu và giải thuật

GVHD: Nguyễn Hữu Nhân Trang 10

{
TAMGIAC tg;

NhapTamGiac(tg);
XuatTamGiac(tg, "Toa do ba diem cua Tam giac:\n");

printf("Chu vi Tam giac = %.2f\n", TinhChuVi(tg));
printf("Dien tich Tam giac = %.2f\n", TinhDienTich(tg));
getch();
}

// Dinh nghia ham
void NhapDiem(DIEM &d)
{

printf("Nhap hoanh do x: ");
scanf("%d", &d.x);
printf("Nhap tung do y: ");
scanf("%d", &d.y);
}

void XuatDiem(DIEM d, char *thongbao)
{
printf("%s", thongbao);
printf("(%d, %d)\n", d.x, d.y);
}

float TinhKhoangCach(DIEM d1, DIEM d2)
{
float kq;

int dx = d1.x - d2.x;
int dy = d1.y - d2.y;

kq = sqrt((float)(dx*dx + dy*dy));

return kq;
}

int KiemTraHopLe(TAMGIAC tg)
Bài tập thực hành Cấu trúc dữ liệu và giải thuật

GVHD: Nguyễn Hữu Nhân Trang 11

{

float AB, AC, BC;

AB = TinhKhoangCach(tg.dA, tg.dB);
AC = TinhKhoangCach(tg.dA, tg.dC);
BC = TinhKhoangCach(tg.dB, tg.dC);

if (AB + AC > BC && AB + BC > AC && AC + BC > AB)
return 1;
else
return 0;
}

void NhapTamGiac(TAMGIAC &tg)
{
int hople = 1;

do
{
printf("Nhap toa do Diem A:\n");
NhapDiem(tg.dA);
printf("Nhap toa do Diem B:\n");
NhapDiem(tg.dB);
printf("Nhap toa do Diem C:\n");
NhapDiem(tg.dC);
hople = KiemTraHopLe(tg);
if (!hople)
printf("Tam giac khong hop le! Hay nhap
lai!");
}
while (!hople);

}

void XuatTamGiac(TAMGIAC tg, char *thongbao)
{
printf("%s", thongbao);
XuatDiem(tg.dA, "- Toa do Diem A: ");
XuatDiem(tg.dB, "- Toa do Diem B: ");
XuatDiem(tg.dC, "- Toa do Diem C: ");
Bài tập thực hành Cấu trúc dữ liệu và giải thuật

GVHD: Nguyễn Hữu Nhân Trang 12

}

float TinhChuVi(TAMGIAC tg)
{
float P, AB, AC, BC;

AB = TinhKhoangCach(tg.dA, tg.dB);
AC = TinhKhoangCach(tg.dA, tg.dC);
BC = TinhKhoangCach(tg.dB, tg.dC);
P = AB + AC + BC;

return P;
}

float TinhDienTich(TAMGIAC tg)
{
float S, p, AB, AC, BC;


AB = TinhKhoangCach(tg.dA, tg.dB);
AC = TinhKhoangCach(tg.dA, tg.dC);
BC = TinhKhoangCach(tg.dB, tg.dC);

p = (AB + AC + BC) / 2;
S = sqrt(p * (p - AB) * (p - AC) * (p - BC));

return S;
}

Bài tập thực hành Cấu trúc dữ liệu và giải thuật

GVHD: Nguyễn Hữu Nhân Trang 13

// Diem.cpp : Defines the entry point for the console
application.
//

#include "stdafx.h"


#include <stdio.h>
#include <math.h>
#include <conio.h>

// Khai bao kieu DIEM
struct diem
{
int x; // hoanh do
int y; // tung do

};
typedef struct diem DIEM;

// Nguyen mau ham
void Nhap(DIEM &d);
void Xuat(DIEM d, char *thongbao);
float TinhKhoangCach(DIEM d1, DIEM d2);
DIEM TimDoiXungQuaGoc(DIEM d);
DIEM TimDoiXungQuaOx(DIEM d);
DIEM TimDoiXungQuaOy(DIEM d);

void main()
{
DIEM d1, d2;

Nhap(d1);
Xuat(d1, "Toa do Diem 1: ");

Nhap(d2);
Xuat(d2, "Toa do Diem 2: ");

printf("Khoang cach giua 2 diem = %.2f\n",
TinhKhoangCach(d1, d2));
Bài tập thực hành Cấu trúc dữ liệu và giải thuật

GVHD: Nguyễn Hữu Nhân Trang 14


Xuat(TimDoiXungQuaGoc(d1), "Toa do diem doi xung qua goc
cua Diem 1: ");

Xuat(TimDoiXungQuaOx(d1), "Toa do diem doi xung qua Ox
cua Diem 1: ");
Xuat(TimDoiXungQuaOy(d1), "Toa do diem doi xung qua Oy
cua Diem 1: ");
getch();
}

// Dinh nghia ham
void Nhap(DIEM &d)
{
printf("Nhap hoanh do x: ");
scanf("%d", &d.x);
printf("Nhap tung do y: ");
scanf("%d", &d.y);
}

void Xuat(DIEM d, char *thongbao)
{
printf("%s", thongbao);
printf("(%d, %d)\n", d.x, d.y);
}

float TinhKhoangCach(DIEM d1, DIEM d2)
{
float kq;

int dx = d1.x - d2.x;
int dy = d1.y - d2.y;

kq = sqrt((float)(dx*dx + dy*dy));


return kq;
}

DIEM TimDoiXungQuaGoc(DIEM d)
{
Bài tập thực hành Cấu trúc dữ liệu và giải thuật

GVHD: Nguyễn Hữu Nhân Trang 15

DIEM kq;

kq.x = -d.x;
kq.y = -d.y;

return kq;
}

DIEM TimDoiXungQuaOx(DIEM d)
{
DIEM kq;

kq.x = d.x;
kq.y = -d.y;

return kq;
}

DIEM TimDoiXungQuaOy(DIEM d)
{

DIEM kq;

kq.x = -d.x;
kq.y = d.y;

return kq;
}


Bài tập thực hành Cấu trúc dữ liệu và giải thuật

GVHD: Nguyễn Hữu Nhân Trang 16

// DaThuc.cpp : Defines the entry point for the console
application.
//

#include "stdafx.h"


#include <stdio.h>
#include <math.h>
#include <conio.h>

#define MAX 100

// Khai bao kieu DATHUC
// anx^n + an-1x^n-1 + + a1x + a0
struct dathuc
{

int n;
float a[MAX];
};
typedef struct dathuc DATHUC;

// Nguyen mau ham
void KhoiTaoDaThucRong(DATHUC &dt);
void Nhap(DATHUC &dt);
void Xuat(DATHUC dt, char *thongbao);
DATHUC Tong(DATHUC dt1, DATHUC dt2);
DATHUC Hieu(DATHUC dt1, DATHUC dt2);
DATHUC Tich(DATHUC dt1, DATHUC dt2);
DATHUC DaoHamCap1(DATHUC dt);
DATHUC DaoHamCapk(DATHUC dt, int k);
float TinhGiaTri(DATHUC dt, float x0);

void main()
{
DATHUC dt1, dt2;

Nhap(dt1);
Xuat(dt1, "Da thuc 1: ");
Bài tập thực hành Cấu trúc dữ liệu và giải thuật

GVHD: Nguyễn Hữu Nhân Trang 17


Nhap(dt2);
Xuat(dt2, "Da thuc 2: ");


Xuat(Tong(dt1, dt2), "Da thuc 1 + Da thuc 2 = ");
Xuat(Hieu(dt1, dt2), "Da thuc 1 - Da thuc 2 = ");
Xuat(Tich(dt1, dt2), "Da thuc 1 * Da thuc 2 = ");

Xuat(DaoHamCap1(dt1), "Dao ham cap 1 cua Da thuc 1 = ");

int k;
printf("Nhap k: ");
scanf("%d", &k);
Xuat(DaoHamCapk(dt1, k), "Dao ham cap k cua Da thuc 1 =
");

float x0;
printf("Nhap x0: ");
scanf("%f", &x0);
printf("Gia tri cua da thuc 1 tai x0 = %.2f la %.2f\n",
x0, TinhGiaTri(dt1, x0));
}

// Dinh nghia ham
void KhoiTaoDaThucRong(DATHUC &dt)
{
dt.n = 0;

for (int i=0; i<MAX; i++)
dt.a[i] = 0;
}

void Nhap(DATHUC &dt)
{

KhoiTaoDaThucRong(dt);

printf("Nhap bac cua da thuc: ");
scanf("%d", &dt.n);

Bài tập thực hành Cấu trúc dữ liệu và giải thuật

GVHD: Nguyễn Hữu Nhân Trang 18

float temp;
for (int i=dt.n; i>=0; i )
{
printf("Nhap he so a%d: ", i);
scanf("%f", &temp);
dt.a[i] = temp;
}

while (dt.n>0 && dt.a[dt.n] == 0)
dt.n ;
}

void Xuat(DATHUC dt, char *thongbao)
{
printf("%s", thongbao);

for (int i=dt.n; i>0; i )
if (dt.a[i] != 0)
printf("%.2fx^%d + ", dt.a[i], i);

printf("%.2f\n", dt.a[0]);

}

DATHUC Tong(DATHUC dt1, DATHUC dt2)
{
DATHUC kq;
KhoiTaoDaThucRong(kq);

if (dt1.n > dt2.n)
kq.n = dt1.n;
else
kq.n = dt2.n;

for (int i=0; i<=kq.n; i++)
kq.a[i] = dt1.a[i] + dt2.a[i];

while (kq.n>0 && kq.a[kq.n] == 0)
kq.n ;

Bài tập thực hành Cấu trúc dữ liệu và giải thuật

GVHD: Nguyễn Hữu Nhân Trang 19

return kq;
}

DATHUC Hieu(DATHUC dt1, DATHUC dt2)
{
DATHUC kq;
KhoiTaoDaThucRong(kq);


if (dt1.n > dt2.n)
kq.n = dt1.n;
else
kq.n = dt2.n;

for (int i=0; i<=kq.n; i++)
kq.a[i] = dt1.a[i] - dt2.a[i];

while (kq.n>0 && kq.a[kq.n] == 0)
kq.n ;

return kq;
}

DATHUC Tich(DATHUC dt1, DATHUC dt2)
{
DATHUC kq;
KhoiTaoDaThucRong(kq);

kq.n = dt1.n + dt2.n;

int i, j;
for (i=0; i<=dt1.n; i++)
for (j=0; j<=dt2.n; j++)
kq.a[i+j] = kq.a[i+j] + dt1.a[i] * dt2.a[j];

while (kq.n>0 && kq.a[kq.n] == 0)
kq.n ;

return kq;

}
Bài tập thực hành Cấu trúc dữ liệu và giải thuật

GVHD: Nguyễn Hữu Nhân Trang 20


DATHUC DaoHamCap1(DATHUC dt)
{
DATHUC kq;
KhoiTaoDaThucRong(kq);

kq.n = dt.n - 1;

for (int i=kq.n; i>=0; i )
kq.a[i] = dt.a[i+1] * (i+1);

return kq;
}

DATHUC DaoHamCapk(DATHUC dt, int k)
{
DATHUC kq = dt;

for (int i=0; i<k; i++)
kq = DaoHamCap1(kq);

return kq;
}

float TinhGiaTri(DATHUC dt, float x0)

{
float kq = 0;

for (int i=dt.n; i>=0; i )
kq = kq + dt.a[i] * pow(x0, i);

return kq;
}



Bài tập thực hành Cấu trúc dữ liệu và giải thuật

GVHD: Nguyễn Hữu Nhân Trang 21

DANH SÁCH LIÊN KẾT
// DeMoDSLK.cpp : Defines the entry point for the console
application.
//


#include "stdafx.h"
#include <conio.h>
#include <stdio.h>
#include <string.h>
#include <io.h>
#include <iostream>
struct data
{
int x;

};
typedef struct data DATA;
struct node
{
DATA info;
struct node*pNext;
};
typedef struct node NODE;
struct list
{
NODE*pHead;
NODE*pTail;
};
typedef struct list LIST;

int CompareData(DATA info1, DATA info2);

void InitList(LIST &l);

bool IsEmptyList(LIST l);

void PrintList(LIST l, char *str);

NODE* CreateNode(DATA info);
Bài tập thực hành Cấu trúc dữ liệu và giải thuật

GVHD: Nguyễn Hữu Nhân Trang 22


NODE* GetNodePointer(LIST l, DATA info);


NODE* GetNodePointer(LIST l, int index);

int GetNodeIndex(LIST l, NODE*p);

NODE* GetPreviousNodePointer(LIST l);

void AddHead(LIST &l);

NODE* AddHead(LIST &l, DATA info);

void AddTail(LIST &l);

NODE* AddTail(LIST &l, DATA info);

void AddAfter(LIST &l, NODE*q);

NODE* AddAfter(LIST &l, NODE*q, DATA info);

void AddBefore(LIST &l, NODE*q);

NODE* AddBefore(LIST &l, NODE*q, DATA info);

void AddAscendingList(LIST &l);

NODE* AddAscendingList(LIST &l, DATA info);

DATA RemoveHead(LIST &l);

DATA RemoveTail(LIST &l);


DATA RemoveAfter(LIST &l, NODE*q);

bool RemoveNode(LIST &l, DATA info);

void RemoveAll(LIST &l);

Bài tập thực hành Cấu trúc dữ liệu và giải thuật

GVHD: Nguyễn Hữu Nhân Trang 23

// 01. Hàm so sánh 2 biến kiểu cấu trúc cho trước
// Đầu vào: biến cấu trúc (info1) và biến cấu trúc (info2)
// Đầu ra: 0 (bằng nhau), -1 (info1 nhỏ hơn info2), 1 (info1
lớn hơn info2)
int CompareData(DATA info1, DATA info2)
{
if(info1.x<info2.x)
return -1;
if(info1.x>info2.x)
return 1;
return 0;
}
// 02. Hàm khởi tạo DSLK (rỗng)
// Đầu vào: tham chiếu đến DSLK cẩn khởi tạo (1)
// Đầu ra: Không có
void InitList(LIST &l)
{
l.pHead=NULL;
l.pTail=NULL;

}
//03. Hàm kiểm tra DSLK tro trước có phải là DSLK rổng hai
không?
// Đầu vào: DSLK cần kiểm tra (1)
// Đầu ra: DSLK rỗng hay không (true/false)
bool IsEmptyList(LIST l)
{
if(l.pHead==NULL)
return true;
else
return false;
}
// 04. Hàm in DSLK cho trước
// Đầu vào: DSLK cần in (1) kèm theo chuổi thông báo (str)
// Đầu ra: Không có
void PrintList(LIST l, char *str)
{
NODE *p = l.pHead;

printf("\n Danh sach lk can in:");
Bài tập thực hành Cấu trúc dữ liệu và giải thuật

GVHD: Nguyễn Hữu Nhân Trang 24

while (p != NULL)
{
printf("\n",p->info.x );
p = p->pNext;
}
}

// 05. Hàm tạo một node mới với dữ liệu cho trước
// Đầu vào: Dữ liệu của nút (info)
// Đầu ra: Con trỏ đến nút đó (trả về NULL nếu không tạo
được)
NODE*CreateNode(DATA info)
{
NODE*p=new NODE;
if(p!=NULL)
{
p->info=info;
p->pNext=NULL;
}
return p;
}
// 06. Hàm tìm nút đầu tiên trong DSLK cho trước có dữ liệu
cho trước
// Đầu vào: DSLK (l), dữ liệu của nút cần tìm (info)
// Đầu ra: Con trỏ đến nút tìm được (trả về NULL nếu
không tìm được)
NODE* GetNodePointer(LIST l, DATA info)
{
NODE *p = l.pHead;

while (p != NULL && CompareData(p->info, info) != 0)
p = p->pNext;

return p;
}
// 07. Hàm tìm nút có chỉ số (bắt đầu từ 0) cho trước
// Đầu vào: DSLK (l), chỉ số của nút cần lấy (index)

// Đầu ra: Con trỏ đến nút tìm được (trả về NULL nếu
không tìm được)
NODE* GetNodePointer(LIST l, int index)
Bài tập thực hành Cấu trúc dữ liệu và giải thuật

GVHD: Nguyễn Hữu Nhân Trang 25

{
int curIndex = 0;
NODE *p = l.pHead;

while (p != NULL && curIndex < index)
{
p = p->pNext;
curIndex++;
}

return p;
}
// 08. Hàm xác định vị trí của một nút cho trước trong DSLK
cho trước
// Đầu vào: DSLK (l), con trỏ đến nút cần xác định vị trí
(pNode)
// Đầu ra: Thứ tự của nút cho trước (trả về -1 nếu nút
này không có trong DSLK)
int GetNodeIndex(LIST l)
{
NODE *p = l.pHead;
int pos = 0;


if (IsEmptyList(l))
return -1;

while (p != NULL && p != p)
{
pos++;
p = p->pNext;
}

if (p == p)
return pos;
else
return -1;
}
// 09. Hàm xác định con trỏ đến nút đứng trước của một nút
cho trước trong DSLK

×