Thứ Bảy, ngày 26 tháng 12 năm 2009

// // Leave a Comment

Danh sách liên kết

Phần code sau thao tác với con trỏ, trong bài toán đọc dữ liệu từ 1 file trên ổ cứng, và in ra kết quả ra một file khác. Công việc tưởng chừng như vô bổ này lại rất nhiều vẫn đề !! Vấn đề thứ nhât: Đọc các thông tin trên file không phải là các số mà là các các kí tự kiệu “char”. Vấn đề thứ 2: dùng cấu trúc dữ liệu kiểu con trỏ để làm việc. Các file cs tên là “dataFile1.txt” và “dataFile2.txt” cần được tạo ra.


////////////////////////


#include<iostream>

#include”string.h”

#include<fstream>//thư viện này là cần thiết khi làm việc với các file dữ liệu


using namespace std;


//node là cấu trúc của một nút trong danh sách (link)



struct Node {

char HoTen[25];

char QueQuan[30];

int Diem;

Node *Next; //một trường chứa địa chỉ được đặt tên là ‘next’

};


class SinhVien {

Node *Ptr;

int Total;

public:

SinhVien(){Ptr=NULL; Total = 0;}

void NhapDS(char *nameFile1);

void InDS(char *nameFile2);


};

//chuong trinh chinh

void main() {

SinhVien QLSV;

cout<<”\nDang lay du lieu va tu fie”;

QLSV.NhapDS(“D:\\dataFile1.txt”);

cout<<”Dang ghi danh sach SV: “;


QLSV.InDS(“D:\\dataFile2.txt”);

cout<<”\nDone”;

}

//cai dat cac ham

void SinhVien::NhapDS(char *nameFile1) {

Node *P,*P1; //khai báo hai con trỏ lúc này nó chưa được cấp phát bộ nhớ đâu


int n = 0;

ifstream dataFile(nameFile1);// ofstream dùng để biết nameFile1 này là để đưa dữ liệu vào. “I” = “In”


//kien tra su dung dan cua file du lieu nhu sau

if(!dataFile.fail()){

——dataFile>>Total;

——dataFile.ignore();//sau khi doc ki tu Total thì trên bộ đệm của bàn phím để lại kí tự enter sẽ làm trôi các


—— do{ //kí tự được đọc vào sau đó dùng hàm ignore() để xoá kí tự enter này.

——P = new Node; //lấy bộ nhớ cho node P đã được khai báo từ lúc nãy.


——//đọc các thông tin từ fiele như sau:

—— dataFile.get(P->HoTen,25);


——dataFile.ignore();

——dataFile.get(P->QueQuan,30);

——dataFile.ignore();

——dataFile>>P->Diem;

——dataFile.ignore();


——P->Next =NULL; //gán trường địa chỉ của nút đầu tiên trong link này là NULL, nhớ không viết là ‘null’.

——if(Ptr ==NULL) //nếu chưa có node nào trong link thì để con trỏ chuyên trỏ đến đầu danh sách này trỏ vào

———Ptr = P; //node đó

——else { ngược lại tìm đến node cuối cùng để thêm P vào link


———P1 = Ptr;

———while(P1->Next!=NULL)

————P1 = P1->Next;

———P1->Next = P;

——}


——n++; //tăng n lên để kiểm tra xem đã cấp phát bộ nhớ bằng số học sinh được định trong file đầu vào chưa

——}while(n!=Total);

}

else{

——exit(1);


——cout<<”\nFile is fail.”;

}

dataFile.close();

}


//ghi ra file

void SinhVien::InDS(char *nameFile2) {

Node *P2;//kha báo con trỏ này để duyệt từ đầu link đến cuối link


P2 = Ptr; //gán con trỏ mới được khai này vào con trỏ luôn trỏ đến đầu link

ofstream dataFile(nameFile2); //ofstream dùng để biết nameFile2 này là để xuất dữ liệu “O” = “Out”

for(int i=1;i<=Total;i++){

——dataFile<<”\nSinh Vien thu “<<i;


——dataFile<<”\nHo Ten SV : “<<P2->HoTen;

——dataFile<<”\nQue Quan SV : “<<P2->QueQuan;

——dataFile<<”\nDiem: “<<P2->Diem;


——P2=P2->Next;

}

dataFile.close();

}

0 comments: