Bài 1. Danh sách đặc

Mô hình

Lý thuyếtopen in new window

Source Code

arrayList.hopen in new window

KHỞI TẠO

#define Max_length 50
typedef struct{
    int Data[Max_length];
    int Size;
}List;

KHỞI TẠO RỖNG

void makeNullList(List *L){
    L->Size = 0;
}

HIỂN THỊ DANH SÁCH

void displayList(List L){
    for (int i = 0; i < L.Size; i++){
        printf("%d ",L.Data[i]);
    }
}

THÊM N PHẦN TỬ TRONG LIST

void InputList(int n,List *L){
    makeNullList(L);
    for(int i = 0; i < n ; i++){
        scanf("%d",&L->Data[i]);
        L->Size++;
    }
}

XOÁ PHẦN TỬ TẠI VỊ TRÍ P TRONG LIST

void deleteListbyPos(int p,List *L){
    for(int i = p; i < L->Size - 1; i++){
        L->Data[i] = L->Data[i+1];
    }
    L->Size--;
}

XOÁ PHẦN TỬ X TRONG LIST

void deleteListbyID(int x, List *L){
    for(int i = 0; i < L->Size; i++){
        if(L->Data[i] == x){
            deleteListbyPos(i,L);
        }
    }
}

TRẢ VỀ VỊ TRÍ ĐẦU TIÊN CỦA X TRONG LIST

int locateList(int x,List L){
    for(int i = 0 ; i < L.Size ; i++){
        if(L.Data[i] == x){
            return i;
        }
    }
    return -1;
}

KIỂM TRA X TRONG LIST

int memberList(int x,List L){
    if(locateList(x,L) != 1){
        return 1;
    }
    return 0;
}

TỐI ƯU DANH SÁCH (`1 2 3` -> `1 2`)

void optimizeList(List *L){
    int  i = 0;
    int j;
    while (i != L->Size){
        j = i + 1;
        while (j != L->Size){
            if(L->Data[i] == L->Data[j]){
                deleteListbyPos(j,L);
            }
            else{
                j++;
            }
        }
        i++;
    }  
}

THÊM X TẠI VỊ TRÍ P TRONG LIST

void insertList(int x,int p,List *L){
    if(L->Size == Max_length){
        printf("Full List!!!");
    }
    else if(p < 0 || p > L->Size){
        printf("Position Invalid!!!");
    }
    else{
        for(int i = L->Size; i >= p ; i--){
            L->Data[i]=L->Data[i-1];
        }
        L->Size++;
        L->Data[p] = x;
    }
}

CHUYỂN DANH SÁCH QUA DANH SÁCH MỚI

void changeList(List L1,List *L){
    for(int i = 0 ; i < L1.Size ; i++){
        insertList(L1.Data[i],L->Size,L);
    }
}

GỘP 2 DANH SÁCH VÀO MỘT

void mergeList(List L1,List L2,List *L){
    changeList(L1,L);
    changeList(L2,L);
}

LỌC PHẦN TỬ CHẲN HOẶC LẺ QUA MỘT DANH SÁCH

void filter_evenNumber(List L1,List *L){
    int k = 0;
    for(int i = 0 ; i < L1.Size; i++){
        if(L1.Data[i] % 2 == 0){
            insertList(L1.Data[i],k,L);
            k++;
        }
    }
}

void filter_oddNumber(List L1,List *L){
    int k = 0;
    for (int i = 0; i < L1.Size; i++){
        if(L1.Data[i] % 2 != 0){
            insertList(L1.Data[i],k,L);
            k++;
        }
    }
}

TÍNH TRUNG BÌNH CÁC PHẦN TỬ TRONG DANH SÁCH

double averageList(List L){
    double result = 0;
    for (int i = 0; i < L.Size; i++){
        result += L.Data[i];
    }
    return result/L.Size;
}

searchList.hopen in new window

TÌM KIẾM TUYẾN TÍNH

// không cần sắp xếp
int linearSearch(int x,List L){
    for (int i = 0; i < L.Size; i++){
        if(L.Data[i] == x){
            return i;
        }
    }
    return 1;
}

TÌM KIẾM NHỊ PHÂN

// cần sắp xếp
int binarySearch(int x,List L){
    int left = 0;
    int right = L.Size - 1;
    int mid;
    while(right >= left){
        mid = left + ((right - left) / 2);
        if(L.Data[mid] == x){
            return mid;
        }
        else if(L.Data[mid] > x){
            right = mid - 1;
        }
        else{
            left = mid + 1;
        }
    }
    return -1;
}

sortList.hopen in new window

HOÁN ĐỔI 2 SỐ

void swap(int *a,int *b){
  int temp = *a;
  *a = *b;
  *b = temp;
}

SẮP XẾP TRỰC TUYẾN

void interchangeSort(List *L){
  for (int i = 0; i < L->Size - 1; i++){
    for (int j = i + 1; j < L->Size; j++){
      if(L->Data[i] > L->Data[j]){
        swap(&L->Data[i],&L->Data[j]);
      }
    }
  }
}

SẮP XẾP CHỌN

void selectionSort(List *L){
  for(int i = 0 ; i < L->Size - 1; i++){
    int min = i;
    for (int j = i + 1; j < L->Size; j++){
      if(L->Data[min] > L->Data[j]){
        min = j;
      }
    }
    if(min != i){
      swap(&L->Data[min],&L->Data[i]);
    }
  }
}

SẮP XẾP NỔI BỌT

void bubbleSort(List *L){
  for (int i = 0; i < L->Size; i++){
    for (int j = L->Size - 1; j >= 0; j--){
      if(j > i){
        if(L->Data[j] < L->Data[j-1]){
          swap(&L->Data[j],&L->Data[j-1]);
        }
      }
    }
  }
}

SẮP XẾP CHÈN

void insertionSort(List *L){
  int x;
  int pos;
  for (int i = 1; i < L->Size; i++){
    pos = i - 1;
    x = L->Data[i];
    while (pos >= 0 && L->Data[pos] > x){
      L->Data[pos + 1] = L->Data[pos];
      pos--;
    }
    L->Data[pos+1] = x;
  }
}

SẮP XẾP CÂY NHỊ PHÂN

void heaplify(int i,int n,List *L){
  while (i <= (n / 2) - 1){
    int left = (2 * i) + 1;
    int right = (2 * i) + 2;
    int max = left;
    if(right < n && L->Data[right] > L->Data[max]){
      max = right;
    }
    if(L->Data[i] < L->Data[max]){
      swap(&L->Data[i],&L->Data[max]);
    }
    i = max;
  }
}

void heapSort(List *L){
  for(int i = (L->Size - 1) / 2; i >= 0 ; i--){
      heaplify(i,L->Size,L);
  }
  for(int i = L->Size - 1 ; i >= 0 ; i--){
    swap(&L->Data[0],&L->Data[i]);
    heaplify(0,i,L);
  }
}

SẮP XẾP SHELL

void shellSort(List *L){
  int x,pos;
  int divide = 2; // có thể thay đổi vách chia
  for(int h = L->Size / divide; h > 0 ; h /= divide){
    for(int i = h ; i < L->Size ; i++){
      x = L->Data[i];
      pos = i - h;
      while (pos >= 0 && L->Data[pos] > x){
        L->Data[pos + h] = L->Data[pos];
        pos -= h;
      }
        L->Data[pos+h] = x;
    }
  }
}

SẮP XẾP NHANH

void quickSort(List *L,int start,int end){
  int pivot = L->Data[(start + end) / 2]; // tuỳ chọn pivot
  int left = start;
  int right = end;
  while(left <= right){
    while(L->Data[left] < pivot){
      left++;
    }
    while(L->Data[right] > pivot){
      right--;
    }
    if(left <= right){
      swap(&L->Data[left],&L->Data[right]);
      left++;
      right--;
    }
  }
  if(right > start){
    quickSort(L,start,right);
  }
  if(left < end){
    quickSort(L,left,end);
  }
}

SẮP XẾP GỘP

void merge(List *L,int left,int mid,int right){
  int n1 = mid - left + 1;
  int n2 = right - mid;
  int M1[n1],M2[n2];
  for (int i = 0; i < n1; i++){
    M1[i] = L->Data[left + i];
  }
  for (int i = 0; i < n2; i++){
    M2[i] = L->Data[mid + 1 + i];
  }
  int i = 0;// mảng R
  int j = 0;// mảng Q
  int k = left;
  while (i < n1 && j < n2){
    if (M1[i] <= M2[j]){
      L->Data[k] = M1[i];
      i++;
    }
    else{
      L->Data[k] = M2[j];
      j++;
      k++;
    }
  }
  while (i < n1){
    L->Data[k] = M1[i];
    i++;
    k++;
  }
  while (j < n2){
    L->Data[k] = M2[j];
    j++;
    k++;
  }
}

void mergeSort(List *L,int start,int end){
  if(start < end){
    int half = start + ((end - start) / 2);
    mergeSort(L,start,half);
    mergeSort(L,half + 1,end);
    merge(L,start,half,end);
  }
}
Cập nhật lúc :
Tác giả: Zenfection, Zenfection