các hàm trong danh sách liên kết đơn

1:17 PM |
các hàm trong danh sách liên kết đơn. 

chú ý: chỗ khai báo int x; bôi vàng. do khai ở hàm phía trên nên không đưa vào 1 số hàm phía dưới tránh trùng nhau trong bài này. Nếu dùng hàm đơn lẻ mới sử dụng.

#include <stdio.h>
#include <conio.h>
typedef struct node
{
       int info;
       node *link;
};
// ham xem danh sach lien ket.
void xem(node *f)
{
       node *p=f;
       while(p!=NULL)
       {
              printf("%5d",p->info);
              p=p->link;
       }
}
//Nhap danh sach lien ket don LIFO.
node *nhaplifo(node *f,int n)
{
       node *p;
       for(int i=0;i<n;i++)
       {
              p=new(node);
              printf("\nNhap phan tu:  ");
              scanf("%d",&p->info);
              p->link=f;
              f=p;
       }
       return f;
}
//nhap danh sach lien ket don FIFO.
node *nhapfifo(node *f,node *l,int n)
{
       node *p;
       for(int i=0;i<n;i++)
       {
              p=new(node);
              printf("\nNhap phan tu:  ");
              scanf("%d",&p->info);
              if(f==NULL)
              {
                     f=p;
                     l=p;
              }
              else
              {
                     l->link=p;
                     l=p;
              }
       }
       return f;
}
//ham sap xep day theo thu tu tang dan (khong giam).
void sapxeptang(node *f)
{
       node *p1=f,*p2;
       while(p1->link!=NULL)
       {
              p2=p1->link;
              while(p2!=NULL)
              {
                     if(p1->info>p2->info)
                     {
                           int tg=p1->info;
                           p1->info=p2->info;
                           p2->info=tg;
                     }
                     p2=p2->link;
              }
              p1=p1->link;
       }
}
//ham sap xep theo thu tu giam gian(khong tang)
void sapxepgiam(node *f)
{
       node *p1=f,*p2;
       while(p1->link!=NULL)
       {
              p2=p1->link;
              while(p2!=NULL)
              {
                     if(p1->info<p2->info)
                     {
                           int tg=p1->info;
                           p1->info=p2->info;
                           p2->info=tg;
                     }
                     p2=p2->link;
              }
              p1=p1->link;
       }
}
//tim kiem so x co xuat hien trong danh sach hay khong.
// khong thay thi tra ve NULL.
// thay thi tra ve dia chi dau tien chua x.
node *timkiem1(node *f,int x)
{
       node *p=f;
       while(p!=NULL && p->info!=x) p=p->link;
       return p;
}
//tim kiem so x co xuat hien trong danh sach hay khong.
// khong thay thi tra ve 0.
// tim thay thi tra 1.
int timkiem2(node *f,int x)
{
       node *p=f;
       while(p!=NULL && p->info!=x) p=p->link;
       if (p!=NULL) return 1;
       return 0;
}
//dem so phan tu cua dslk;
//ham tra ve kieu nguyen so phan tu.
int demspt(node *f)
{
       int d=0;
       node *p=f;
       while(p!=NULL)
       {
              d++;
              p=p->link;
       }
       return d;
}
//ddem so phan tu chan trong ds lk.
//Ham tra ve so phan tu chan.
int demchan(node *f)
{
       int d=0;
       node *p=f;
       while(p!=NULL)
       {
              if (p->info%2==0) d++;
              p=p->link;
       }
       return d;
}
//ddem so phan tu le trong ds lk.
//ham tra ve so phan tu le.
int demle(node *f)
{
       int d=0;
       node *p=f;
       while(p!=NULL)
       {
              if (p->info%2!=0) d++;
              p=p->link;
       }
       return d;
}
//dem so phan tu lon hon x.
//ham tra ve so phan tu lon hon x.
int dem(node *f,int x)
{
       int d=0;
       node *p=f;
       while(p!=NULL)
       {
              if(p->info>x) d++;
              p=p->link;
       }
       return d;
}
// tong cac phan tu trong dslk.
//ham tra ve tong cac phan tu.
int sum(node *f)
{
       int s=0;
       node *p=f;
       while(p!=NULL)
       {
              s+=p->info;
              p=p->link;
       }
       return s;
}
//tong cacs phan tu chan trong dslk;
//ham tra ve tong cac phan tu chan.
int tongchan(node *f)
{
       int t=0;
       node *p=f;
       while(p!=NULL)
       {
              if(p->info%2==0) t+=p->info;
              p=p->link;
       }
       return t;
}
//tong cac phan tu le trong dslk
//ham tra ve tong cac phan tu le.
int tongle(node *f)
{
       int t=0;
       node *p=f;
       while(p!=NULL)
       {
              if(p->info%2!=0) t+=p->info;
              p=p->link;
       }
       return t;
}
//tong cac phan tu lon hon x trong dslk
//ham tra ve tong phan tu lon hon x.
int tong(node *f,int x)
{
       int t=0;
       node *p=f;
       while(p!=NULL)
       {
              if(p->info>x) t+=p->info;
              p=p->link;
       }
       return t;
}
//them 1 phan tu vao dau dslk .
node *themdau(node *f)
{
       node *x;
       x=new(node);
       printf("\nNhap phan tu can them vao dau : ");
       scanf("%d",&x->info);
       x->link=f;
       return x;
}
//them mot phan tu vao cuoi dslk.
node *themcuoi(node *f)
{
       node *x;
       x=new(node);
       printf("\nNhap phan tu can them vao cuoi : ");
       scanf("%d",&x->info);
       x->link=NULL;
       if (f==NULL) return x;//neu danh sach rong thi x la phan tu dau tien.
       node *p=f;
       while(p->link!=NULL) p=p->link;// du con tro p chay den cuoi danh sach
       p->link=x;
       return f;
}
//them mot phan tu vao vi tri thu 2 cua dslk.
void them2(node *f)
{
       if (f==NULL) return;//danh sach rong thi khong thuc hien.
       node *x;
       x=new(node);
       printf("\nNhap phan tu can them vao sau vi tri thu nhat : ");
       scanf("%d",&x->info);
       x->link=f->link;
       f->link=x;
}
// them mot phan tu chen vao vi tri thu k.
node *themk(node *f,int k)
{
       node *x,*p=f;
       int d=0;
       x=new(node);
       printf("\nNhap gia tri phan tu can them: ");
       scanf("%d",&x->info);
       if(k==1)
       {
              x->link=f;
              return x;
       }
       while(p!=NULL)
       {
              d++;
              if (d==(k-1)) break;
              p=p->link;
       }
       x->link=p->link;
       p->link=x;
       return f;
}
//them mot phan tu vao sao cho khong lam thay doi sap xep tang dan cua day.
node *them(node *f)
{
       node *x,*p=f;
       x=new(node);
       printf("\nNhap phan tu can them vao : ");
       scanf("%d",&x->info);
       while((p->link!=NULL)&&(p->link->info < x->info)) p=p->link;
       if (p==f)
       {
              x->link=p;
              return x;
       }
       x->link=p->link;
       p->link=x;
       return f;    
}
//xoa mot phan tu dau tien.
node *xoadau(node *f)
{
       if (f==NULL) return f;// ds ronf khong xoa duoc.
       node *p=f;
       f=p->link;
       delete(p);
       return f;
}
//xoa mot phan tu cuoi cung.
node *xoacuoi(node *f)
{
       if (f==NULL) return f;// neu ds rong khong xoa duoc.
       if (f->link==NULL)// neu danh sach chi 1 phan tu
       {
              delete(f);
              return NULL;
       }
       node *p=f;
       while(p->link->link!=NULL) p=p->link;
       delete(p->link);
       p->link=NULL;
       return f;
}
// xoa phan tu thu k.
node *xoak(node *f)
{
       node *p=f,*q;
       int d=1,k;
       printf("\nNhap phan tu thu k can xoa:  ");
       scanf("%d",&k);
       if (f==NULL&&k>0) return f;// neu ds rong khong xoa duoc. va k>0
       if (k==1)
       {
              delete(f);
              return NULL;
       }
       while(p!=NULL)
       {
              q=p;
              p=p->link;
              d++;
              if(d==k)
              {
                     q->link=p->link;
                     delete(p);
                     return f;
              }
       }
       printf("\nGia tri k khong hop le : ");
       return f;
}
//xoa nhung phan tu co gia tri co dinh.
node *xoa(node *f)
{
       node *p=f;
       int x;
       printf("\nNhap gia tri phan tu can loai bo khoi dslk:  ");
       scanf("%d",&x);
       while (p->info==x&&p!=NULL)
       {
              f=xoadau(f);
              p=f;
       }
       while(p->link!=NULL)
       {
              if(p->link->info==x)
              {
                     node *tg=p->link;
                     p->link=p->link->link;
                     delete(tg);
              }
              else
              p=p->link;
       }
       return f;
}
// dao nguoc dslk.
node *Reverse(node *l)
{
     node *p=l,*tg1,*tg2=NULL;
     while (p!=NULL)
     {
           tg1=p;
           p=p->link;
           tg1->link=tg2;
           tg2=tg1;
     }
     return tg1;
}

int main()
{
       node *f=NULL;
       int n;
       //nhap dslk lifo.
       printf("\nNhap so phan tu cua dslk : ");
       scanf("%d",&n);
       f=nhaplifo(f,n);
       // ket thuc .
      
       /*
       node *f=NULL,l=NULL;
       int n;
       //nhap dslk fifo.
       printf("\nNhap so phan tu cua dslk : ");
       scanf("%d",&n);
       f=nhapfifo(f,l,n);
       // ket thuc .
      
       */
      
       // xem danh sach lien ket.
       printf("\nDanh sach vua nhap :  ");
       xem(f);
       //ket thuc.
      
       // sap xep tang.
       printf("\nDanh sach sau khi sap xep tang  :  ");
       sapxeptang(f);
       xem(f);
       // ket thuc
      
       // sap xep giam
       printf("\nDanh sach sau khi sap xep giam  :  ");
       sapxepgiam(f);
       xem(f);
       // ket thuc.
      
       // tim kiem 1.
       // khong thay thi tra ve NULL.
       // thay thi tra ve dia chi dau tien chua x.
       int x;
       printf("\nNhap phan tu can tim kiem  :  ");
       scanf("%d",&x);
       if (timkiem1(f,x)!=NULL) printf("\nTim thay %d trong danh sach lien ket",x);
       else printf("\nKhong tim thay %d trong danh sach lien ket. ",x);
       // ket thuc.
      
       // tim kiem 2.
       // khong thay thi tra ve 0.
       // tim thay thi tra 1.
       //int x;
       printf("\nNhap phan tu can tim kiem  :  ");
       scanf("%d",&x);
       if (timkiem2(f,x)) printf("\nTim thay %d trong danh sach lien ket",x);
       else printf("\nKhong tim thay %d trong danh sach lien ket. ",x);
       // ket thuc.
      
       // dem so phan tu trong ds
       printf("\nSo phan tu trong danh sach :   %d ",demspt(f));
       // ket thuc.
      
       // dem so phan tu chan trong ds
       printf("\nSo phan tu chan trong danh sach :   %d ",demchan(f));
       // ket thuc.
      
       // dem so phan tu le trong ds
       printf("\nSo phan tu le trong danh sach :   %d ",demle(f));
       // ket thuc.
      
       //dem so phan tu lon hon x.
       //int x;
       printf("\ndem so phan tu lon hon x.");
       printf("\nNhap x =  ");
       scanf("%d",&x);
       printf("\nSo phan tu lon hon %d trong ds la  :  %d ",x,dem(f,x));
       //ket thuc.
      
       // tong cac phan tu chan trong dslk.
       printf("\nTong cac phan tu chan trong dslk la   :  %d ",tongchan(f));
       //ket thuc.
      
       // tong cac phan tu le trong dslk.
       printf("\nTong cac phan tu le trong dslk la   :  %d ",tongle(f));
       //ket thuc.
      
       //tong cac phan tu lon hon x trong dslk.
       //int x;
       printf("\ntong cac phan tu lon hon x trong dslk.");
       printf("\nNhap x =  ");
       scanf("%d",&x);
       printf("\nTong cac phan tu lon hon %d trong dslk la   :  %d ",x,tong(f,x));
       //ket thuc.
      
       //them dau.
       f=themdau(f);
       printf("\nDanh sach sau khi them dau : ");
       xem(f);
       //ket thuc.
      
       //them cuoi.
       f=themcuoi(f);
       printf("\nDanh sach sau khi them cuoi : ");
       xem(f);
       //ket thuc.
      
       //them mot phan tu vao vi tri thu 2 cua dslk.
       them2(f);
       printf("\nDanh sach sau khi them vao phan tu thu 2 : ");
       xem(f);
       // ket thuc.
      
       // them mot phan tu chen vao vi tri thu k.
       int k;
       printf("\nNhap vi tri can chen vao:  ");
       scanf("%d",&k);
       f=themk(f,k);
       printf("\nDanh sach sau khi them vi tri thu %d  ",k);
       xem(f);
       // ket thuc.
      
       //them mot phan tu vao sao cho khong lam thay doi sap xep tang dan cua day.
       printf("\nthem mot phan tu vao sao cho khong lam thay doi sap xep tang dan cua day.");
       sapxeptang(f);
       printf("\nDanh sach sau khi sap xep tang :  ");
       xem(f);
       f=them(f);
       printf("\nDanh sach sau khi them   ");
       xem(f);
       // ket thuc.
      
       //xoa 1 phan tu dau dslk.
       f=xoadau(f);
       printf("\nDanh sach sau khi xoa dau la : ");
       xem(f);
       //ket thuc
      
       //xoa 1 phan tu cuoi dslk;
       f=xoacuoi(f);
       printf("\nDanh sach sau khi xoa cuoi   ");
       xem(f);
       //ket thuc.
      
       // xoa phan tu thu k.
       printf("\n  xoa phan tu thu k.");
       f=xoak(f);
       printf("\nDanh sach sau khi xoa   ");
       xem(f);
       //ket thuc.
      
       //xoa nhung phan tu co gia tri co dinh.
       printf("\nxoa nhung phan tu co gia tri co dinh. ");
       f=xoa(f);
       printf("\nDanh sach sau khi xoa   ");
       xem(f);
       //ket thuc.
      
       //dao nguoc dslk
       printf("\nDanh sach lien ket sau khi dao nguoc");
       f=Reverse(f);
       xem(f);
       //ket thuc
       getch();
}

hàm xem danh sách liên kết đơn.

2:37 AM |
Xem danh sách liên kết đơn.
Danhsách liên kết đơn được tạo bởi các ô nhớ chứa dữ liệu cần lưu trữ và được liên kết với nhau thành một danh sách. Mỗi phần tử của danh sách liên kết được chia làm 2 phần. Là phần dữ liệu lưu trữ (data) và phần liên kết(link).
 Ø phần dữ liệu lưu trữ (data).
Phần này có thể chứa các số nguyên, số thực, hoặc tập hợp các số nguyên số thực và các xâu. Tùy thuộc vào mục đích sử dụng.
 Ø phần liên kết(link).
Phần này chứa biến con trỏ. Để lưu trữ vị trí ô nhớ của phần tử tiếp theo cần tham chiếu.

Nhìn sơ qua hình trên ta thấy. Muốn xem danh sách liên kết đơn thì ta phải biết được địa chỉ của phần tử đầu tiên(ta thường hay dùng con trỏ f để lưu) . Sau đó lần theo phần link để đọc các phần tử tiếp theo cho đến khi gặp NULL (dấu hiệu kết thúc danh sách liên kết) thì kết thúc việc xem dslk đơn.
Vậy hàm xem chỉ thực hiện công việc xem đơn thuần nên ta sử dụng hàm kiểu void. Truyền vào hàm con trỏ f chứa địa chỉ ô nhớ phần tử  đầu tiên của danh sách liên kết.
·        void xem(node *f)
và việc xem danh sách liên kết đơn ta phải sử dụng một biến con trỏ trung gian để duyệt từ đầu đến cuối danh sách. ở đây chúng ta sử dụng con trỏ p. Sở dĩ phải dùng biến trung gian bở vì nếu sử dụng con trỏ f thì sẽ làm mất địa chỉ ô nhớ đầu tiên. Dẫn đến không thể dựa vào điểm nào để lần ra danh sách đồng nghĩa với việc mất danh sach liên kết.
·        node *p=f;
Để duyệt từ vị trí đầu tiên đến (vị trí con trỏ f) vị trí cuối cùng ( phần tử có phần link bằng  NULL) của danh sách liên kết ta sử dụng vòng lặp while với điều kiện dừng là (p!=NULL) và mỗi lần lặp thì con trỏ p trỏ lên 1 vùng nhớ của phần tử tiếp theo. (p=p->link;)
Sơ qua thì hàm xem chúng ta xây dựng như sau,
void xem(node *f)
{
     node *p=f;
     while(p!=NULL)
     {
          /*
          phần đọc dữ liệu phần data.
          */
          p=p->link;
     }
}
Từ yêu cầu bài toán mà ta thay đổi phần đọc dữ liệu data sao cho phù hợp.

Ví dụ như phần data chưa mỗi biến info kiểu int.
typedef struct node
{
     int info;
     node *link;
};
// ham xem danh sach lien ket
void xem(node *f)
{
     node *p=f;
     while(p!=NULL)
     {
          printf("%5d",p->info);
          p=p->link;
     }
}

Ví dụ như phần data chưa mỗi biến info kiểu float.
typedef struct node
{
     float info;
     node *link;
};
// ham xem danh sach lien ket
void xem(node *f)
{
     node *p=f;
     while(p!=NULL)
     {
          printf("%5.2f",p->info);
          p=p->link;
     }
}

Các cách đọc dữ liệu cần linh hoạt. phù hợp với yêu cầu bài toán.
Gọi hàm chỉ làm thủ tục đơn giản là xem(f);
Code test thử hàm. c/c++
#include <stdio.h>
#include <conio.h>
typedef struct node
{
     int info;
     node *link;
};
// ham xem danh sach lien ket.
void xem(node *f)
{
     node *p=f;
     while(p!=NULL)
     {
           printf("%5d",p->info);
           p=p->link;
     }
}
//Nhap danh sach lien ket don LIFO.
node *nhaplifo(node *f,int n)
{
     node *p;
     for(int i=0;i<n;i++)
     {
           p=new(node);
           printf("\nNhap phan tu:  ");
           scanf("%d",&p->info);
           p->link=f;
           f=p;
     }
     return f;
}
int main()
{
     node *f=NULL;
     int n;
     printf("\nNhap so phan tu cua dslk : ");
     scanf("%d",&n);
     f=nhaplifo(f,n);
     printf("\nDanh sach vua nhap :  ");
     xem(f);
     getch();
}

Danh sách liên kết, dslk, xem danh sách liên kết, lifo, fifo, cu trúc d liu gii thut. ctdlgt.
Dũng NV. Powered by Blogger.