I : GIẢI THUẬT ĐỆ QUY

Bài 1: Viết chương trình xuất n trị đầu tiên của 1 cấp số cộng có số hạng đầu là a (nhập từ bàn phím), công sai r (nhập từ bàn phím). Sử dụng kỹ thuật đệ quy để xây dựng hàm tính trị thứ i của 1 cấp số cộng.

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

int csc(int n,int a,int r)
{ if (n==1) return a;
   return(r+csc(n-1,a,r));
}

void main()
{ int n, a, r, i;
   printf("nhap so hang dau a= "); scanf("%d",&a);
   printf("nhap cong sai r= "); scanf("%d",&r);
   printf("nhap so luong cac phan tu can xuat n= ");
       scanf("%d",&n);
   if (n<=0) printf("so luong cac phan tu can xuat ban nhap ko hop le!");
   for(i=1;i<=n;i++)
         printf("\n tri thu %2d cua csc= %5d",i,csc(i,a,r));
   getch();
}

Bài toán:Viết chương trình nhập vào 1 ma trận a có kích thước mxn,Áp dụng các hàm sắp xếp đã học để thực hiện các công việc sau:
A:sắp xếp các hàng của ma trận theo thứ tự tăng dần;
B:sắp xếp các cột theo thứ tự giảm dần.

#include<conio.h>
#include<stdio.h>
void nhap (int (*a)[10],int m,int n)
{
     int i,j;
     int tg;
     for (i=0;i<m;i++)
         for (j=0;j<n;j++)
         {
            printf("\nnhap phan tu [%d][%d]=",i,j);
            scanf("%d",&tg);a[i][j]=tg;
         }
 }
void xem(int (*a)[10],int m,int n)
{
     int i,j;
     for (i=0;i<m;i++)
    {
         for (j=0;j<n;j++)
         printf("%5d",a[i][j]);
         printf("\n");
    }
}
void tinh(int a[][10],int m,int n)
{
     int i,j,k;
     for(i=0;i<m;i++)
       {
             for(int h=0;h<n-1;h++)
               for(int l=1;l<n;l++)
               {
                       if(a[i][h]>a[i][l])
                       {
                                          int tg;
                                          tg=a[i][h];
                                          a[i][h]=a[i][l];
                                          a[i][l]=tg;
                       }
               }
             }
                                          
}
main()
{
      int a[10][10],m,n;
      printf("nhap vao so hang va cot la : ");
      scanf("%d%d",&m,&n);
      nhap(a,m,n);
      xem(a,m,n);
      tinh(a,m,n);
      printf("xem mang sau khi sap xep\n");
      xem(a,m,n);
      getch();
}          

B:Sắp xếp cột:
Void tinh(int a[][10],int m,int n)
{
Int I,j;
For(j=0;j<n;j++)
{
For(int h=0;h<m-1;h++)
          For(int l=1;l<m;l++)
          {
                   If(a[h][j]>a[l][j])
                   {
                             Int tg;
                             Tg=a[h][j];
                             A[h][j]=a[l][j];
                             A[l][j]=tg;
                   }
          }
}
Bài 2: Cho mảng gồm n phần tử. Viết chương trình có sử dụng hàm đệ quy tính tổng các phần tử của mảng.

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

int tong(int a[],int n)
{ if(n==1) return a[0];
   return (a[n-1]+tong(a,n-1));
}

void main()
{ int a[50], n, i;
   printf("\n nhap so luong phan tu cua mang n= ");
         scanf("%d",&n);
   if (n<=0) printf("so luong phan tu ban nhap ko hop le!");
   else
       { for(i=0;i<n;i++)
             { printf("a[%d]= ",i);
                scanf("%d",&a[i]);
              }
          printf("\n tong= %5d",tong(a,n));
       }
   getch();
}

Bài 3: Cho mảng gồm n phần tử. Viết chương trình có sử dụng hàm đệ quy cho biết giá trị lớn nhất, giá trị nhỏ nhất của mảng.

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

int max(int a[],int n)
{ if(n==1) return a[0];
   if (a[n-1]>max(a,n-1)) return a[n-1];
      return max(a,n-1);
  }

int min(int a[],int n)
{ if(n==1) return a[0];
   if (a[n-1]<min(a,n-1)) return a[n-1];
       return min(a,n-1);
}

void main()
{ int a[50],n,i;
   printf("\n nhap so luong phan tu cua mang n= ");
       scanf("%d",&n);
   if(n<=0) printf("so luong phan tu ban nhap ko hop le!");
   else
     { for(i=0;i<n;i++)
           { printf("a[%d]= ",i);
              scanf("%d",&a[i]);
           }
         printf("\n max= %5d",max(a,n));
         printf("\n min= %5d",min(a,n));
      }
    getch();
}

Bài 4: Cho ma trận có m hàng, n cột. Viết chương trình có sử dụng hàm đệ quy cho biết giá trị lớn nhất, giá trị nhỏ nhất của ma trận.

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

void nhap( int a[][50],int m, int n)
{ int i,j,tg;
   for(i=0;i<m;i++)
     for(j=0;j<n;j++)
         { printf("a[%d][%d]= ",i,j); scanf("%d",&tg);
            a[i][j]=tg;
          }
  }

void xem( int a[][50],int m,int n)
{ int i,j;
   printf("\n xem mang vua nhap:\n");
   for(i=0;i<m;i++)
       { for(j=0;j<n;j++) printf("%5d",a[i][j]);
          printf("\n");
       }
}

int min1( int a[][50], int m,int n)
{ if(n==0) return a[m][n];
   if (a[m][n]<min1(a,m,n-1)) return a[m][n];
      return min1(a,m,n-1);
}

int min( int a[][50], int m, int n)
{ if(m==0) return min1(a,m,n);
   if ( min1(a,m,n)<min(a,m-1,n)) return min1(a,m,n);
       return min(a,m-1,n);
}

int max1(int a[][50],int m,int n)
{ if (n==0)return a[m][n];
   if (a[m][n]>max1(a,m,n-1)) return a[m][n];
       return max1 (a,m,n-1);
 }

int max(int a[][50],int m,int n)
{ if(m==0) return max1(a,m,n);
   If (max1(a,m,n)>max(a,m-1,n)) return max1(a,m,n);
       return max(a,m-1,n);
}
   
void main()
{ int a[50][50],m,n;
   printf("Nhap so cot cua ma tran n = "); scanf("%d",&n);
   printf("Nhap so hang cua ma tran m = "); scanf("%d",&m);
   if ((n<=0)||(m<=0)) printf("so hang so cot ban nhap ko hop le!");
   else
      { nhap(a,m,n);
         xem(a,m,n);
         printf("\n min =  %d",min(a,m-1,n-1));
         printf("\n max =  %d",max(a,m-1,n-1));
       }
   getch();
}

Bài 5: Viết chương trình có sử dụng hàm đệ quy tính xn.

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

float luythua(int x,int n)
{ if(x==0) return 0;
   if(n==0) return 1;
   if(n<0) return (1/(luythua(x,-n-1)*x));
      return luythua(x,n-1)*x;
}

void main()
{ int x,n;
   printf("nhap x va n: "); scanf("%d%d",&x,&n);
   printf("%d^%d=%5.2f",x,n,luythua(x,n));
   getch();
}

Bài 6: Viết chương trình có sử dụng hàm đệ quy để xuất biểu diễn nhị phân của 1 số nguyên.

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

int nhiphan(int n)
{ int d;
  if(n==1)  {printf("%d",n); return 0;}
  d=n%2; n=nhiphan(n/2);
  printf("%d",d); return 0;
}

void main ()
{ int n;
   printf("nhap n= ");scanf("%d",&n);
   printf("\n bieu dien nhi phan cua %d :",n);
   nhiphan(n);
   getch();
}

Bài 7: Viết chương trình có sử dụng hàm đệ quy để xuất ngược 1 dãy kí tự.

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

char xuatnguoc(char s[],int n)
{ if(n==0) return 0;
   putchar(s[n-1]);
   xuatnguoc(s,n-1);
   return 0;
}

main ()
{ char s[50];
   int n;
   printf("nhap xau= "); fflush(stdin); gets(s);
   n=strlen(s);
   if(n==0) return 0;
   printf("\n xuat nguoc cua day ky tu %s la: ",s);
   xuatnguoc(s,n);
   getch();
   return 0;
}

Bài 8: Viết chương trình nhập 1 mảng số nguyên, nhập 1 giá trị x từ bàn phím, tìm vị trí có x cuối cùng trong mảng, sử dụng kĩ thuật đệ quy.

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

void nhap(int a[],int n)
{ int i;
   for(i=0;i<n;i++)
      { printf("a[%d]= ",i); scanf("%d",&a[i]);}
}

void xem(int a[],int n)
{ int i;
   printf("\n xem mang vua nhap:");
   for(i=0;i<n;i++)
         printf("%5d",a[i]);
}

int timx( int a[], int n, int x)
{ if(a[n]==x)
   {printf("\n\n vi tri xuat hien cuoi cung cua %d trong mang la : %d",x,n+1);
     return 0;
   }
 if(n==0)
   { printf("\n\n gia tri %d khong xuat hien trong mang",x);
     return 0;
   }
   return timx(a,n-1,x);
}

void main()
{ int a[50],n,x;
   printf(" nhap so luong phan tu cua mang n = ");
       scanf("%d",&n);
   if(n<=0) printf("so luong phan tu ban nhap ko hop le!");
   else
       { printf(" nhap x = "); scanf("%d",&x);
          nhap(a,n);
    xem(a,n);
    timx(a,n-1,x);
   }
  getch();
}

Bài 9: Viết chương trình nhập 1 ma trận vuông các số nguyên, nhập 1 giá trị x. Tìm vị trí <dòng – cột> có x. Sử dụng kĩ thuật đệ quy.

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

void nhap( int a[][50],int n)
{ int i,j,tg;
   if (n<=0) printf(" so hang so cot ban nhap khong hop le!");
   else
      { for(i=0;i<n;i++)
         for(j=0;j<n;j++)
            { printf("a[%d][%d] = ",i,j);
               scanf("%d",&tg);
               a[i][j]=tg;
            }
         printf("\n\n");
      }
}

void xem( int a[][50],int n)
{ int i,j;
   for(i=0;i<n;i++)
     { for(j=0;j<n;j++)
              printf("%5d",a[i][j]);
        printf("\n");
     }
}

void timx( int a[][50], int i, int n, int x)
{ if(a[i][n]==x)
      { printf("\n vi tri xuat hien : Hang %d - Cot %d",i+1,n+1);
         return ;
      }
   if (n<0) return ;
   timx(a,i,n-1,x);
}

void main()
{ int a[50][50],n,x,i=0;
   printf("nhap so hang so cot n= "); scanf("%d",&n);
   nhap(a,n);
   xem(a,n);
   printf("\n nhap x = ");
   scanf("%d",&x);
   for(i=0;i<n;i++) timx(a,i,n-1,x);
   getch();
}



II : MẢNG
Cho cấu trúc gồm các trường như sau:
     struct sinhvien
      { char hoten[30];
         float diem1,diem2,diem3,diemtb;
      } ;
1.     Viết hàm nhập mảng (nhập nội dung cho các phần tử của mảng).
2.     Cho xem nội dung của mảng.
3.     Đếm xem trong mảng có bao nhiêu sinh viên có điểm trung bình lớn hơn 8.
4.     Bổ sung 1 phần tử vào vị trí k (k nhập từ bàn phím) vào mảng.
5.     Xoá 1 phần tử ở vị trí m của mảng (m nhập từ bàn phím).
6.     Sắp xếp mảng đã cho theo thứ tự tăng dần của điểm trung bình. Biết diemtb=(diem1+diem2+diem3)/3


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

struct sinhvien
{ char hoten[30];
   float d1, d2, d3, dtb;
};

struct sinhvien *nhap( struct sinhvien a[], int n)
{ int i; float tg;
   if (n<=0)
      printf("\n ban phai nhap n lon hon 0 !\n");
  else
      for (i=1;i<=n;i++)
          { printf("nhap thong tin sinh vien thu %d:\n",i);
             printf("nhap ho ten:");
            fflush(stdin); gets(a[i].hoten);
            nhap:printf("nhap diem mon 1:"); scanf("%f",&tg); a[i].d1=tg;
                     printf("nhap diem mon 2:"); scanf("%f",&tg); a[i].d2=tg;
           printf("nhap diem mon 3:"); scanf("%f",&tg); a[i].d3=tg;
                    //neu nhap diem <0 hoac >10 thi phai nhap lai:
                    //su dung nhan va cau lenh goto
             if ((a[i].d1<0)||(a[i].d1>10)||(a[i].d2<0)||(a[i].d2>10)||(a[i].d3<0)||(a[i].d3>10))
     { printf("\n ban nhap diem ko hop le! moi nhap lai!\n");
        goto nhap;
     }
     a[i].dtb=(a[i].d1+a[i].d2+a[i].d3)/3;
    }
   return a;
}

void xem( struct sinhvien a[], int n)
{ int i;
   printf("danh sach sinh vien:\n");
   for(i=1;i<=n;i++)
      { printf("\n %d: %-20s d1=%-5.1f d2=%-5.1f d3=%-5.1f dtb=%-     5.2f",i,a[i].hoten,a[i].d1,a[i].d2,a[i].d3,a[i].dtb);
         printf("\n");
      }
}

int dem( struct sinhvien a[], int n)
{ int i, dem=0;
   for(i=1;i<=n;i++)
      if(a[i].dtb>8) dem++;
   return dem;
}

struct sinhvien *xeptang( struct sinhvien a[],int n)
{ int i,j;
   struct sinhvien tg;
   for (i=1;i<=n;i++)
     for (j=i+1;j<=n;j++)
        if (a[i].dtb>a[j].dtb)
           { tg=a[i];
              a[i]=a[j];
              a[j]=tg;
            }
 return a;
}

struct sinhvien *xepgiam( struct sinhvien a[],int n)
{ int i, j;
   struct sinhvien tg;
   for (i=1;i<=n;i++)
     for (j=i+1;j<=n;j++)
       if (a[i].dtb<a[j].dtb)
           { tg=a[i];
              a[i]=a[j];
              a[j]=tg;
           }
   return a;
}

struct sinhvien *bosung( struct sinhvien a[], int *n, int k)
{ int i; float tg;
   if ((k<=0)||(k>*n+1))
      printf("\n vi tri ban muon bo sung nam ngoai mang!\n");

   else
      { for(i=*n;i>=k;i--) a[i+1]=a[i];
         printf("nhap thong tin sinh vien thu %d:\n",k);
         printf("nhap ho ten:");
         fflush(stdin); gets(a[k].hoten);
         nhap:printf("nhap diem mon 1:"); scanf("%f",&tg); a[k].d1=tg;
                  printf("nhap diem mon 2:"); scanf("%f",&tg); a[k].d2=tg;
                  printf("nhap diem mon 3:"); scanf("%f",&tg); a[k].d3=tg;
          if ((a[i].d1<0)||(a[i].d1>10)||(a[i].d2<0)||(a[i].d2>10)||(a[i].d3<0)||(a[i].d3>10))
       { printf("\n ban nhap diem ko hop le! moi nhap lai!\n");
          goto nhap;
       }
       a[k].dtb=(a[k].d1+a[k].d2+a[k].d3)/3;
      *n=*n+1;
    }
    return a;
}

struct sinhvien *xoa( struct sinhvien a[], int *n, int k)
{ int i;
   if ((k<=0)||(k>*n))
      printf("\n vi tri muon xoa nam ngoai mang!\n");
   else
      {for(i=k;i<=*n;i++)  a[i]=a[i+1];
        *n=*n-1;
      }
   return a;
}

void main()
{ struct sinhvien a[50]; int n, k, x;
   printf("so luong sinh vien can nhap la:");
       scanf("%d",&n);
   nhap(a,n);  xem(a,n);

   printf("\n\n so sinh vien co diem trung binh >8 la: %d",dem(a,n));
   xeptang(a,n);
   printf("\n\n sau khi sap xep tang:\n"); xem(a,n);
   xepgiam(a,n);
   printf("\n\n sau khi sap xep giam:\n"); xem(a,n);
   printf("\n\n nhap vi tri can bo sung:"); scanf("%d",&k);
   bosung(a,&n,k);
   printf("\n\n sau khi bo sung:"); xem(a,n);
   printf("\n\n nhap vi tri can xoa:"); scanf("%d",&x);
   xoa(a,&n,x);
   printf("\n\n sau khi xoa: "); xem(a,n);
   getch();
}


III : DANH SÁCH NỐI ĐƠN
Cho danh sách nối đơn có F trỏ vào phần tử đầu tiên. Hãy viết chương trình thực hiện các công việc sau:
1.     Đếm số lượng phần tử của danh sách.
2.     Bổ sung 1 phần tử vào đầu/cuối danh sách.
3.     Bổ sung 1 phần tử vào vị trí k (biết trước).
4.     Sắp xếp danh sách theo thứ tự tăng dần/giảm dần của trường info.
5.     Tìm vị trí phần tử đầu tiên/cuối cùng có trường info bằng x cho trước ở trong danh sách.
6.     Giả sử danh sách đã được sắp xếp theo thứ tự tăng dần của trường info, viết chương trình chèn vào danh sách một phần tử có trường info bằng x cho trước vào danh sách sao cho vẫn đảm bảo tính tăng dần của trường info ở trong danh sách.
7.     Xoá phần tử đầu tiên/cuối cùng của danh sách.
8.     Xoá phần tử thứ k (biết trước) ra khỏi danh sách.
9.     Ghép 2 danh sách thành 1 danh sách mới.
10.                         Đảo phần tử đầu tiên và phần tử cuối cùng của danh sách (đảo các mối nối, không phải đảo nội dung).

“chương trình thực hiện công việc 1-2-3-4-5”
#include<conio.h>
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>

struct node
{ int info;
   struct node *link;
};

struct node *nhap( struct node *F)
{ struct node *p;
   int tg; char ch;
   do
     { printf("moi nhap phan tu! ");  scanf("%d",&tg);
        p=(struct node*) malloc (1*sizeof(struct node));
        p->info=tg;
        p->link=F;
        F=p;
        printf("nhan phim 1 de tiep tuc nhap danh sach!\n\n ");
        fflush(stdin); ch=getch();
     }
   while (ch=='1');
   return F;
}

void xem( struct node *F)
{ struct node *p=F;
   printf("\n xem danh sach!\n");
   while (p!=NULL)
      { printf("%5d",p->info);
         p=p->link;
      }
   printf("\n\n");
}

int dem( struct node *F)
{ struct node *p=F;
   int dem=0;
   while (p!=NULL)
     { dem++;
        p=p->link;
    }
   return dem;
}

struct node *insert_first( struct node *F, int x)
{ struct node *p;
   p=(struct node*) malloc (1*sizeof(struct node));
   p->info=x;
   if (F==NULL )
     { F=p; p->link=NULL;}
   else
     { p->link=F; F=p;}
   return F;
}

struct node *insert_last( struct node *F, int x, int n)
{ struct node *p, *M;
   int dem=1;
   M=F;
   while ((M!=NULL) && (dem<n))
    { M=M->link;
      dem++;
    }
   p=(struct node*) malloc (1*sizeof(struct node));
   p->info=x;
   p->link=M->link;
   M->link=p;
   return F;
}

struct node *insert( struct node *F, int x, int k)
{ struct node *p, *M;
   int dem=1,n;
   if (k==1) return insert_first(F,x);
   if (k==n) insert_last(F,x,k);
   if ((k<1) || (k>n))
     { printf("\n vi tri ban muon bo sung ko hop le!\n");
        exit(1);
     }
   M=F;
   while ((M!=NULL) && (dem<k-1))
      { M=M->link;
        dem++;
      }
   p=(struct node*) malloc (1*sizeof(struct node));
   p->info=x;
   p->link=M->link;
   M->link=p;
   return F;
}

void trao_doi(int *x, int *y)
{ int tg;
   tg=*x;
   *x=*y;
   *y=tg;
}

struct node *xep_giam( struct node *F)
{ struct node *p, *M;
   p=F;
   while (p!=NULL)
    { M=p->link;
      while (M!=NULL)
        { if (p->info < M->info) trao_doi(&p->info,&M->info);
           M=M->link;
        }
      p=p->link;
    }
  return F;
}

struct node *xep_tang( struct node *F)
{ struct node *p, *M;
   p=F;
   while (p!=NULL)
    { M=p->link;
       while (M!=NULL)
          { if (p->info>M->info) trao_doi(&p->info,&M->info);
             M=M->link;
        }
      p=p->link;
   }
  return F;
}

struct node *timx_dau( struct node *F, int X)
{ struct node *p;
   p=F;int dem=1;
   while (p!=NULL)
     { if (p->info==X)
           { printf("\n vi tri node dau tien co truong info =%d la: %d",X,dem);
                       return 0;
           }
       p=p->link;
       dem++;
    }
   printf("\n danh sach khong chua node co truong info =%d",X);
  return 0;
}

struct node *timx_cuoi( struct node *F,int X)
{ struct node *p;
   p=F;int vitri=0,i=1;
   while (p!=NULL)
      { if (p->info==X) vitri=i;
         i++;
         p=p->link;
      }
   if (vitri==0)  printf("\n danh sach khong chua node co truong info  =%d",X);
   else printf("\n\n vi tri node cuoi cung co truong info =%d la: %d",X,vitri);
   return 0;
}

void main()
{ struct node *F=NULL;clrscr();
   int x,k,n;
   char ch;
   printf("nhap danh sach\n\n");
   F=nhap(F);
   printf("\n\nxem danh sach vua nhap:");
   xem(F);
   do
   { n=dem(F);
     printf("nhan phim 1 de dem danh sach\n\n");
     printf("nhan phim 2 de bo sung mot phan tu vao dau danh sach\n\n");
     printf("nhan phim 3 de bo sung mot phan tu vao cuoi danh sach\n\n");
     printf("nhan phim 4 de bo sung mot phan tu vao vi tri bat ki\n\n");
     printf("nhan phim 5 de sap xep ds theo thu tu giam dan cua truong info\n\n");
     printf("nhan phim 6 de sap xep ds theo thu tu tang dan cua truong info\n\n");    
     printf("nhan phim 7 de tim vi tri phan tu dau tien co truong info =x\n\n");
     printf("nhan phim 8 de tim vi tri phan tu cuoi cung co truong info =x\n\n");
     fflush(stdin); ch=getch();
     switch (ch)
     {case '1': printf("\n\n so phan tu cua danh sach = %d",n); break;
       case '2': printf("\n\n bo sung mot phan tu vao dau danh sach!\n\n");
                   printf("moi nhap phan tu! ");  scanf("%d",&x);
                   F=insert_first(F,x);  xem(F); break;
       case '3': printf("\n\n bo sung mot phan tu vao cuoi danh sach!\n\n");
                   printf("moi nhap phan tu! ");  scanf("%d",&x);
                   F=insert_last(F,x,dem(F));  xem(F); break;
       case '4': printf("\n\n bo sung mot phan tu vao vi tri bat ki cua danh sach!\n\n");
                   printf("nhap vi tri can bo sung k="); scanf("%d",&k);
                   printf("moi nhap phan tu! ");  scanf("%d",&x);
                   F=insert(F,x,k);  xem(F); break;
      case '5': F=xep_giam(F);
                   printf("\n sau khi sap xep giam theo truong info: ");
                   xem(F);  break;
       case '6': F=xep_tang(F);
                   printf("\n sau khi sap xep tang theo truong info: ");
                   xem(F);  break;
       case '7': printf("\n tim node dau tien co truong info = ");
                   scanf("%d",&x);
                   timx_dau(F,x);   break;
       case '8': printf("\n tim node cuoi cung co truong info = ");
                   scanf("%d",&x);
                   timx_cuoi(F,x);   break;
      }
     printf("\n\n nhan phim 1 de tro ve menu! nhan phim bat ki de thoat\n\n");
     fflush(stdin); ch=getch();
    }
   while (ch=='1');
   getch();
}


“chương trình thực hiện công việc 6-7-8-10”
#include<conio.h>
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>

struct node
{ int info;
  struct node *link;
};

struct node *nhap( struct node *F)
{ struct node *p;
  int tg; char ch;
  do
    { printf("moi nhap phan tu! ");  scanf("%d",&tg);
      p=(struct node*) malloc (1*sizeof(struct node));
      p->info=tg;
      p->link=F;
      F=p;
      printf("nhan phim 1 de tiep tuc nhap danh sach!\n\n ");
      fflush(stdin); ch=getch();
    }
  while (ch=='1');
  return F;
}

void xem( struct node *F)
{ struct node *p=F;
  printf("\n xem danh sach!\n");
  while (p!=NULL)
     { printf("%5d",p->info);
       p=p->link;
     }
  printf("\n\n");
}

int dem( struct node *F)
{ struct node *p=F;
  int dem=0;
  while (p!=NULL)
   { dem++;
     p=p->link;
   }
  return dem;
}

void trao_doi(int *x, int *y)
{ int tg;
  tg=*x;
  *x=*y;
  *y=tg;
}


struct node *xep_tang( struct node *F)
{ struct node *p, *M;
  p=F;
  while (p!=NULL)
   { M=p->link;
     while (M!=NULL)
       { if (p->info>M->info) trao_doi(&p->info,&M->info);
           M=M->link;
       }
     p=p->link;
   }
 return F;
}

struct node *chen_tang( struct node *F, int k)
{ struct node *p=F; int dem=1,i=1;
  while (p!=NULL)
    { if (p->info>=k) break;
      p=p->link;
      dem++;
    }
  p=(struct node*) malloc (1*sizeof(struct node));
  p->info=k;
  if (dem==1)
    { if (F==NULL)
           { F=p; p->link=NULL; return F;}
      else
           { p->link=F; F=p; return F;}
    }
  struct node *M=F;
  while ((M!=NULL) && (i<dem-1))
   { M=M->link;
     i++;
   }
  p->link=M->link;
  M->link=p;
  return F;
}

struct node *delete_first( struct node *F,int *n)
{ struct node *p=F;
  if (p==NULL) exit(1);
  F=p->link;
  free(p);  *n=*n-1;
  return F;
}

struct node *delete_last( struct node *F,int *n)
{ struct node *p=F,*M=F;
  if (F==NULL) exit(1);
  while (p->link!=NULL) {M=p; p=p->link;}
  M->link=NULL; free(p);  *n=*n-1;
  return F;
}

struct node *xoapt( struct node *F,int *n,int k)
{ if (k==1) return delete_first(F,n);
  if (k==*n) return delete_last(F,n);
  if ((k<1) || (k>*n))
    { printf("\n vi tri ban muon xoa ko hop le!\n");
      exit(1);
    }
  struct node *M=F; int dem=1;
  while (dem<k)
   { M=M->link;
     dem++;
   }
  struct node *p=F;
  while ((p->link!=M) && (p->link!=NULL)) p=p->link;
  p->link=M->link;
  free(M); *n=*n-1;
  return F;
}

struct node *dao(struct node *F,int n)
{ struct node *p=F, *M;
  int i;
  if (n<=1) return F;
  if (n==2)
    { p=p->link;
      p->link=F;
      F->link=NULL;
      F=p; return F;
    }
  for(i=1;i<n-1;i++) p=p->link;
  M=p; p=p->link;
  M->link=F; p->link=F->link; F->link=NULL; F=p;
  return F;
}

void main()
{ struct node *F=NULL;
  int k;   char ch;
  printf("nhap danh sach\n\n");
  F=nhap(F);
  printf("\n\nxem danh sach vua nhap:");
  xem(F);
  do
  { int n=dem(F);
    printf("nhan phim 1 de sap xep danh sach theo thu tu tang dan cua truong info\n\n");
    printf("nhan phim 2 de chen 1ptu vao ds ma van dam bao tinh tang dan cua truong info \n de lam dieu nay ban phai sap xep ds theo thu tu tang dan cua truong info\n\n");
    printf("nhan phim 3 de xoa phan tu dau tien cua danh sach\n\n");
    printf("nhan phim 4 de xoa phan tu cuoi cung cua danh sach\n\n");
    printf("nhan phim 5 de xoa 1 phan tu bat ki ra khoi danh sach\n\n");
    printf("nhan phim 6 de dao phan tu dau tien va phan tu cuoi cung\n\n");
    fflush(stdin); ch=getch();
    switch (ch)
     {case '1': printf("\n\n danh sach sau khi sap xep tang");
                   F=xep_tang(F); xem(F);  break;
      case '2': printf("\n\n chen 1 pt vao ds van dam bao tinh tang dan cua truong info!\n\n");
                   printf("moi nhap phan tu! ");  scanf("%d",&k);
                   F=chen_tang(F,k);  xem(F); break;
      case '3': printf("\n\n danh sach sau khi xoa phan tu dau tien!\n\n");
                   F=delete_first(F,&n);  xem(F); break;
      case '4': printf("\n\n danh sach sau khi xoa phan tu cuoi cung!\n\n");
                   F=delete_last(F,&n);  xem(F); break;
      case '5': printf("nhap vi tri can xoa k="); scanf("%d",&k);
                   printf("\n\n danh sach sau khi xoa phan tu tai vi tri %d!\n\n",k);
                    F=xoapt(F,&n,k);  xem(F); break;
      case '6': F=dao(F,n);
                   printf("\n\n danh sach sau khi dao phan tu dau tien va phan tu cuoi cung:\n\n ");
                   xem(F);  break;
      }
    printf("\n\n nhan phim 1 de tro ve menu! nhan phim bat ki de thoat\n\n");
    fflush(stdin); ch=getch();
   }
  while (ch=='1');
  getch();
}

“chương trình thực hiện công việc 9”
#include<conio.h>
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>

struct node
{ int info;
  struct node *link;
};

struct node *nhap( struct node *F)
{ struct node *p;
  int tg; char ch;
  do
    { printf("moi nhap phan tu! ");  scanf("%d",&tg);
      p=(struct node*) malloc (1*sizeof(struct node));
      p->info=tg;
      p->link=F;
      F=p;
      printf("nhan phim 1 de tiep tuc nhap danh sach!\n\n ");
      fflush(stdin); ch=getch();
    }
  while (ch=='1');
  return F;
}

void xem( struct node *F)
{ struct node *p=F;
  while (p!=NULL)
     { printf("%5d",p->info);
       p=p->link;
     }
  printf("\n\n");
}

struct node *ghepds( struct node *F1, struct node *F2)
{ struct node *p;
  if (F1==NULL) F1=F2;
  else
   { if (F2==NULL) exit(1);
     p=F1;
     while(p->link!=NULL) p=p->link;
     p->link=F2;
   }
  return F1;
}

void main()
{ struct node *F1=NULL, *F2=NULL;  
  printf("nhap danh sach 1:\n\n");
  F1=nhap(F1);
  printf("\n\nnhap danh sach 2:\n\n");
  F2=nhap(F2);
  printf("\n\nxem danh sach 1:");
  xem(F1);
  printf("\n\nxem danh sach 2:");
  xem(F2);
  F1=ghepds(F1,F2);
  printf("\n\nxem danh sach sau khi ghep ds1 voi ds2:");
  xem(F1);
  getch();
}

Không có nhận xét nào:

Đăng nhận xét