Đếm trong linked list có bao nhiêu phần tử có giá trị = k

Em có học CTDL và GT thì thấy em cho đề như sau:

Em đang tập học về danh sách liên kết đơn nhưng thấy khá khó học vì nó dùng cón trỏ khá nhiều. Sau khi xem trên mạng và code theo thì em có tạo được cái dslk đơn nhưng đến cái câu 3 kia thì em chưa rõ cách code như nào. Có phải là mình sẽ duyệt từ đầu đến cuối cái danh sách rồi so sánh cái data trong Node với k. Nếu bằng thì tăng biến đếm lên rồi cout ra đúng k ạ. Nhưng em code chả ra. Mọi người xem giúp em với ạ gần đến hạn nộp rồi mà chưa biết làm =((.

#include <iostream>

using namespace std;
struct node {
    int data;
    struct node * pNext;
};
typedef struct node NODE;
struct list {
    NODE * pHead;
    NODE * pTail;
};
typedef struct list LIST;

void KhoiTao(LIST & l) {
    l.pHead = NULL;
    l.pTail = NULL;
}
NODE * KhoiTaoNODE(int x) {
    NODE * p = new NODE;
    if (p == NULL) {
        cout << "Khong du bo nho de cap phat!" << endl;
        return NULL;
    }
    p - > data = x;
    p - > pNext = NULL;
    return p;
}
void ThemVaoDau(LIST & l, NODE * p) {
    if (l.pHead == NULL) {
        l.pHead = l.pTail = p;
    } else {
        p - > pNext = l.pHead;
        l.pHead = p;
    }
}
void ThemVaoCuoi(LIST & l, NODE * p) {
    if (l.pTail == NULL) {
        l.pHead = l.pTail = p;
    } else {
        l.pTail - > pNext = p;
        l.pTail = p;
    }
}
void XuatDanhSach(LIST l) {
    for (NODE * k = l.pHead; k != NULL; k = k - > pNext) {
        cout << "\t" << k - > data << "  ";
    }
}
int DemSoK(LIST & l) {
    int dem = 0;
    int k;
    cout << "Nhap k:";
    cin >> k;
    for (NODE * p = l.pHead; p != NULL; p = p - > pNext) {
        if (k == p - > data) {
            dem++;
        }
    }
    return dem;
}
void Menu(LIST & l) {
    int choice;
    do {
        system("cls");
        cout << "1.Tao danh sach so " << endl;
        cout << "2.Xuat danh sach so" << endl;
        cout << "3.Them mot phan tu vao dau danh sach" << endl;
        cout << "4.Them mot phan tu vao cuoi danh sach" << endl;
        cout << "5.Nhap vao mot so k va dem xem trong day co bao nhieu so co gia tri = k" << endl;
        cout << "6.Kiem tra trong day co 3 so chan dung canh nhau hay khong (neu co thi in ra)" << endl;
        cout << "7.Sap xep danh sach theo thu tu tang dan" << endl;
        cout << "8.Xoa tat ca cac so nguyen to trong danh sach" << endl;
        cout << "9.Xoa tat ca cac so co gia tri trung nhau trong danh sach, chi giu lai 1 so" << endl;
        cout << "Ban chon: ";
        cin >> choice;
        switch (choice) {
        case 1:
            {
                int x;
                cout << "Nhap so:";
                cin >> x;
                NODE * p = KhoiTaoNODE(x);
                ThemVaoCuoi(l, p);
            }
            break;
        case 2:
            {
                cout << "\tXuat danh sach lien ket" << endl;
                XuatDanhSach(l);
                cout << endl;
                system("pause");
            }
            break;
        case 5:
            {
                int d = DemSoK(l);
                cout << "Co " << d << "so co gia tri bang k";
            }
            break;
        }
    } while (choice != 9);

}
int main() {
    LIST l;
    KhoiTao(l);
    Menu(l);
    return 0;
}

Chả ra là thế nào? Kết quả không chính xác? Khi đến chỗ đó nó không chạy?

2 Likes

Không in ra được anh ạ mà cũng có thể code em sai.

Bạn nhập từng giá trị, rồi xuất danh sách vẫn ra đúng? Nhưng khi chọn 5. Nhập k và đếm thì nó chẳng in ra gì luôn à?

4 Likes

Mình chạy thử mã của bạn trên Online GDB rồi. Kết quả đúng!

Tuy vậy, bạn nên viết toán tử con trỏ -> liền nhau, không có khoảng cách. Không phải là - >. Trên Online GDB nó báo lỗi chỗ này.

Dòng in ra, bạn xuống dòng nhé:


                int d = DemSoK(l);
                cout << "Co " << d << "so co gia tri bang k" << endl; // endl
4 Likes

Kiểu này qua tới bài cây nhị phân là thấm :smiley: phần cân bằng cây.

4 Likes

Làm sao để kiểm tra được 3 số chẵn đứng cạnh nhau nhỉ các anh?

Biến đếm. Biến lưu tạm cho NODE.
Cho chạy từ đầu danh sách. Nếu gặp số chẵn thì tăng biến đếm lên 1, lưu tạm NODE khi gặp số chẵn đầu; nếu là lẻ đưa về 0. Khi nào biến đếm == 3 thì in ra từ NODE tạm đến đủ 3 phần tử tiếp theo.

4 Likes

lưu tạm NODE khi gặp số chẵn đầu là lưu như nào anh nhỉ?

Là chỉ lưu khi gặp số chẵn thứ nhất (dựa vào biến đếm), các số chẵn tiếp theo (nếu có, thứ 2, thứ 3) thì không lưu. Vì như thế bạn sẽ có thể gọi -> pNext từ số 1 -> 2 -> 3.

3 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?