Bài tập này chủ yếu ôn lại kiến thức về cách cài đặt stack bằng danh sách liên kết trong C/C++. Hãy đảm bảo rằng bạn đã đọc hiểu được bài “Cài đặt stack bằng danh sách liên kết” trước khi vào phần này!

1.Yêu cầu đề bài quản lý hàng hóa bằng stack

Trên ngôn ngữ C/C++, viết chương trình thực hiện yêu cầu sau:

Khai báo cấu trúc date gồm các thông tin: ngày, tháng, năm.

struct date
{
    int ngay, thang, nam;
};

Khai báo cấu trúc loại hàng hóa bao gồm các thông tin: Mã hàng hóa, tên hàng hóa, ngày xuất hàng (kiểu ngày/tháng/năm), ví dụ 10/10/2000), giá xuất hàng đi (đơn vị triệu đồng):

struct hang
{
    char ID[6];
    char ten[256];
    date ngay_xuat;
    float gia_xuat;
};

1 : Viết các hàm nhập vào từ bàn phím giá trị của một biến cấu trúc hàng hóa, hiển thị lên màn hình.

2 : Nhập vào một số nguyên dương n, sử dụng cấu trúc dữ liệu ngăn xếp (stack) nhập vào một chồng hàng gồm n hàng hóa thông qua hàm Push của stack

3: Hiển thị lên màn hình thông tin các hàng hóa trong chồng hàng có giá xuất hàng (trường gia_xuat) > 1.0.

4: Xuất kho chồng hàng hóa của stack thông qua hàm Pop và ghi lại thông tin hàng hóa mỗi khi xuất hàng cho đến hết hàng vào một file text là hanghoa.txt theo cách ghi như sau :

Giá trị các phần của chồng hàng theo từng dòng (mỗi hàng hóa 1 dòng, mỗi giá trị trường cấu trúc hàng hóa cách nhau 1 dấu tab, tức kí tự ‘\t’)

Ví dụ :

001 TV1 10/09/2019 20

002 TV2 10/09/2019 6

2.Xử lý yêu cầu đề bài bằng stack cài đặt bằng danh sách liên kết

#include <stdio.h>
#include <stdlib.h>
struct date{
    int ngay, thang, nam;
};
typedef struct date DATE;
struct hang
{
    char ID[6];
    char ten[256];
    DATE ngay_xuat;
    float gia_xuat;
};
typedef struct hang HANG;

struct node{
    HANG data;
    node *next;
};
typedef struct node NODE;

struct stack{
    NODE *top;  
};  
typedef struct stack STACK;

void Init(STACK &s){
    s.top = NULL;
}   
int IsEmpty(STACK s){
    if (s.top == NULL){
        return 1;
    }
    return 0; 
}

NODE* CreateNode (HANG x) {
    NODE *p;
    p = new NODE;
    if (p==NULL) {
        printf ("KHONG DU BO NHO!");
        return NULL;
    }
    p->data=x;
    p->next=NULL;
    return p;
}

void Push(STACK &s, HANG x){
    NODE *NewNode = CreateNode(x);
    if (NewNode != NULL){
        if (IsEmpty(s)){
            s.top = NewNode;
        }
        else{
            NewNode->next = s.top;
            s.top = NewNode;
        }
    }
}

void Input(STACK &s, int n){
    for(int i = 0; i < n; i++){
        HANG x;
        printf("NHAP MA: ");
        fflush(stdin);
        gets(x.ID);
        printf("NHAP TEN: ");
        fflush(stdin);
        gets(x.ten);
        printf("NHAP NGAY SAN XUAT \n");
        printf("NGAY: ");
        scanf("%d", &x.ngay_xuat.ngay);
        printf("THANG: ");
        scanf("%d", &x.ngay_xuat.thang);
        printf("NAM: ");
        scanf("%d", &x.ngay_xuat.nam);
        printf("NHAP GIA XUAT: ");
        scanf("%f", &x.gia_xuat);
        printf("\n \n");
        Push(s,x);
    }
}   

void Output(STACK s){
    NODE *p;
    for(p = s.top; p != NULL; p=p->next){
        printf("%s\t %s\t %d/%d/%d\t %f\n", p->data.ID, p->data.ten, p->data.ngay_xuat.ngay, p->data.ngay_xuat.thang, p->data.ngay_xuat.nam, p->data.gia_xuat);
    }
}   

void KiemTraGiaXuat(STACK s){
    NODE *p;
    for(p = s.top; p != NULL; p=p->next){
        if(p->data.gia_xuat > 1){
            printf("%s\t %s\t %d/%d/%d\t %f\n", p->data.ID, p->data.ten, p->data.ngay_xuat.ngay, p->data.ngay_xuat.thang, p->data.ngay_xuat.nam, p->data.gia_xuat);
        }
    }
}

HANG Pop (STACK &s){
    NODE *p;
    HANG x;
    if (!IsEmpty(s)){
        p = s.top;
        s.top = p->next;
        x = p->data;
        delete p;
        return x;
    }
}

void XuatHangHoa(STACK &s){
    FILE *fp;
    fp = fopen("hanghoa.txt", "a");
    for(NODE *p = s.top; p!= NULL; p=p->next){
        HANG x = Pop(s);
        fprintf(fp,"%s\t %s\t %d/%d/%d\t %f\n", x.ID, x.ten, x.ngay_xuat.ngay, x.ngay_xuat.thang, x.ngay_xuat.nam, x.gia_xuat);
    }
    fclose(fp);
}
int main(){
    STACK s;
    Init(s);
    int n;
    printf("NHAP VAO SO LUONG HANG HOA: ");
    scanf("%d", &n);
    Input(s, n);
    printf("DANH SACH HANG HOA VUA NHAP\n");
    Output(s);
    printf("\nDANH SACH HANG HOA CO GIA XUAT HANG LON HON 1.0\n");
    KiemTraGiaXuat(s);
    XuatHangHoa(s);
    printf("\nDANH SACH HANG HOA SAU KHI XUAT VAO FILE HANGHOA.TXT\n");
    Output(s);
}