Đăng Nhập

Vui lòng khai báo chính xác tên truy cập và mật khẩu!

Quên mật khẩu?

    Chuyển ma trận thành ds liên kết

      Admin
      Admin

      Giới tính : Nam

      Đến từ : TPHCM

      Ngày Tham gia : 03/04/2011

      Tổng số bài gửi : 2292

      #1

       Tue Oct 11, 2011 8:34 pm

      Chuyển ma trận thành ds liên kết
      đây là bài toán chuyển ma trận thành ds với điều kiện bạn phải nhâp mt từ file

      Code:

      program matran;
      uses crt;
      type
       tro=^nut;
       nut=record
        dinh:integer;
        next:tro;
       end;
       
      var
       b:array[1..100] of nut;
       a:array[1..50,1..50] of integer;
       c:array[1..50,1..50] of integer;
       i,j,n:integer;
       p,q,r:tro;
      begin
       clrscr;
      {------------------Nhap ma tran cua do thi--------}
      n:=5;
      textcolor(white);
      writeln('Nhap ma tran:');
      for i:=1 to n do
       for j:=1 to n do
        begin
        writeln('a[',i,',',j,']= ');readln(a[i,j]);
        end;
      writeln('Ma tran vua nhap la:');
      for i:=1 to n do
       begin
        for j:=1 to n do
        write(a[i,j]:4);
        writeln;
        writeln;
       end;
       {---------------------------------------------}
        for i:=1 to n do
        b[i].dinh:=i;

       {---------Chuyen doi ma tran sang danh sach------}
       for i:=1 to n do
        begin
        q:=b[i].next;;
        for j:=1 to n do
          if a[i,j]<>0 then
          begin
            new(p);
            p^.dinh:=b[j].dinh;
            p^.next:=b[i].next;
            b[i].next:=p;
          end;
        end;
        writeln('Chuyen doi thanh cong!');
        writeln;
        writeln;
        {-----kiem tra viec chuyen doi--------------}
        writeln('Mo hinh cua danh sach');
        writeln;
        writeln;
        for i:=1 to n do
        begin
          r:=b[i].next;
          textcolor(red);write('[',i,']');textcolor(white);
          while r<>nil do
          begin
            textcolor(green); write('->');textcolor(white);
            write(r^.dinh:2);
            r:=r^.next;
          end; textcolor(red);
          write('->NIL');textcolor(white);
          writeln;
        end;
        {-------Chuyen tu danh sach sang ma tran:---------}

        for i:= 1 to n do
        for j:=1 to n do
          c[i,j]:=0;
        for i:= 1 to n do
        begin
          q:=b[i].next;
          while q<>nil do
          begin
            c[i,q^.dinh]:=1;
            q:=q^.next;
          end;
        end; 
        writeln('Ma tran vua Chuyen doi la:');
        writeln;
        writeln;
        for i:=1 to n do
        begin
          for j:=1 to n do 
          write(c[i,j]:4);
          writeln;
          writeln;
        end;         
      readln;
      end. 
      Xếp
      root

      Giới tính : Nữ

      Tuổi : 32

      Đến từ : HCM

      Ngày Tham gia : 13/06/2011

      Tổng số bài gửi : 380

      #2

       Tue Oct 11, 2011 8:41 pm

      Mình xin nêu cách chuyển từ ma trận thưa sang dạng danh sách liên kết :
      Bước 1: Tạo 1 struct : A (đặt thế nào tùy bạn) gồm 3 trường : int ChiSo , int GiaTri và 1 con trỏ : A * link = null.

      Bước 2: Tạo 1 cái mảng 1 chiều B có số phần tử bằng số hàng của ma trận thưa (có thể cấp phát động hoặc fix cứng, tùy). Trong đó mỗi phần tử của mảng B là 1 con trỏ ,trỏ đến kiểu A. Mỗi một phần tử B[i] có nhiệm vụ trỏ vào phần tủ đầu của 1 danh sách liên kết đơn
      Khai báo bằng cách fix cứng như sau : A * B[100] ;//mặc đinh là số hàng của ma trận thưa < 100

      Bước 3: cho các phần tử của mảng B trỏ vào null;
      Tạo thêm 1 con trỏ A *p; // để duyệt các danh sách đơn

      Bước 4: Duyệt ma trận thưa theo từng hàng.Trong mỗi hàng ta cho p = null và duyệt từng phần tử của hàng đó.Câu lệnh như sau :
      Mã:

      for(i = 0; i < n; i++)
      {
      p = null;
      for(j = 0; j < m; j++)
      {
      ............
      }
      }

      Trong mỗi một lần duyệt phần tử.Ta kiểm tra xem phần tử đó có = 0 hay không.Nếu nó == 0 thì không làm gì cả.Nếu nó khác 0 thì cho p trỏ vào phần tử cuối cùng của danh sách liên kết đơn mà B[i] đang trỏ đến .Tạo 1 phần tử thuộc kiểu A và gắn nó vào cuối của danh sách liên kết tại hàng j .Cuối cùng là gán trường GiaTri của phần tử mới gắn vào dslk = phần tử mà ta đang duyệt.,còn trường ChiSo của nó = j
      Cụ thể như sau :
      //đây là khối lệnh bên trong 2 vòng for mà tớ vừa viết ở trên
      Mã:

      ....
      if ( matranthua[i][j] != 0 )
      {
      //kiểm tra danh sách mà B[i] đang trỏ đến có phần tử nào chưa
      if(B[i] == NULL)
      {
      B[i] = (A *)malloc(1,sizeof(A));
      B[i]->GiaTri = matranthua[i][j];
      B[i]->ChiSo = j;
      }
      else
      {
      //cho p trỏ vào phần tử cuối của dslk mà B[i] đang trỏ
      while(p->link != NULL)
      {
      p = p->link;
      }

      //tạo 1 phần tử mới đồng thời gắn nó vào dslk
      p->link = (A *)malloc(1,sizeof(A));
      //cho p trỏ đến phần tử mới tạo và khởi tạo giá trị cho phần tử đó
      p = p->link;
      p->GiaTri = matranthua[i][j];
      p->ChiSo = j;
      }
      }
      ...


      Bước 5: Hết rồi.Ngồi mà test lỗi Chuyển ma trận thành ds liên kết 24
      Lưu ý tất cả code mà tớ viết ở bên trên chỉ là giả mã .Chuyển ma trận thành ds liên kết 8. Chúc thành công
      Admin
      Admin

      Giới tính : Nam

      Đến từ : TPHCM

      Ngày Tham gia : 03/04/2011

      Tổng số bài gửi : 2292

      #3

       Wed Oct 12, 2011 11:03 am

      Code:
      #include<iostream>
      #include<conio.h>
      using namespace std;
      string readFile(char *ten){
      FILE *ffile;
      char ch;
      string st="";
      ffile=fopen(ten,"rb");
      if(!ffile)cout<<"error";
      else{
      while(!feof(ffile)){
      ch=fgetc(ffile);
      st+=ch;
      }}
      fclose(ffile);
      return st;
      }
      int main(){
      cout<<readFile("test.txt");
      getch();
      return 0;
      }
      #4