01/10/2018, 10:48

Xóa node trong linked list

em có làm một bài quản lý sinh viên sử dụng Linked List thế này

#include <iostream>
#include <iomanip>
#include <string.h>
#include <stdlib.h>
#include <fstream>
#include <stdio.h>

using namespace std;

typedef struct sinhvien
{
    char name[30];
    char account[10];
    char subject[10];
    int score;
} STUDENT;

typedef struct node
{
    STUDENT sSV;
    struct node *pNext;
} NODE;

typedef struct list
{
    NODE *pHead;
    NODE *pTail;
} LIST;

void KhoiTaoDS(LIST *l)
{
    l->pHead = NULL;
    l->pTail = NULL;
}

NODE *KhoiTaoNODE(STUDENT sv)
{
    NODE *p;
    p = new NODE;

    if(p == NULL)
    {
        cout << "Cap phat bo nho khong thanh cong";
    }
    strcpy(p->sSV.name, sv.name);
    strcpy(p->sSV.account, sv.account);
    strcpy(p->sSV.subject, sv.subject);
    p->sSV.score = sv.score;

    p->pNext = NULL;

    return p;
}

void ThemDau(LIST *l, NODE *p)
{
    if(l->pHead == NULL)
    {
        l->pHead = l->pTail = p;
    }
    else
    {
        p->pNext = l->pHead;
        l->pHead = p;
    }
}

void ThemCuoi(LIST *l, NODE *p)
{
    if(l->pHead == NULL)
    {
        l->pHead = l->pTail = p;
    }
    else
    {
        l->pTail->pNext = p;
        l->pTail = p;
    }
}

void InDS(LIST l)
{
    cout << setw(30) << left << "Name" << setw(10) << left << "Account" << setw(10) << left << "Subject" << setw(5) << left << "Score" << endl;
    for(NODE *i = l.pHead; i != NULL; i = i->pNext)
    {
        cout << setw(30) << left << i->sSV.name;
        cout << setw(10) << left << i->sSV.account;
        cout << setw(10) << left << i->sSV.subject;
        cout << setw(5) << left << i->sSV.score;
        cout << "
";
    }
}

void TimScore(LIST l, int score)
{
    for(NODE *i = l.pHead; i != NULL; i = i->pNext)
    {
        if(i->sSV.score == score)
        {
            cout << "Name: " << i->sSV.name << "
";
            cout << "Account: " << i->sSV.account << "
";
            cout << "Subject: " << i->sSV.subject << "
";
            cout << "Score: " << i->sSV.score << "
";
            cout << "

";
        }
    }
}

void XoaSinhVien(LIST *l, char acc[10])
{
    if(l->pHead == NULL)
    {
        cout << "Khong ton tai danh sach
";
    }
    else
    {
        for(NODE *i = l->pHead; i != NULL; i = i->pNext)
        {
            if(strcmp(i->pNext->sSV.account,acc) == 0)
            {
                NODE *d;
                d = i->pNext;
                i->pNext = d->pNext;

                delete d;
            }
            else
            {
                cout << "Khong ton tai Account nay";
            }
        }
    }
}

void NhapDanhSachSinhVien(LIST *l)
{
    int n;
    cout << "Nhap so luong sinh vien: ";
    cin >> n;

    for(int i = 1; i <= n; i ++)
    {
        STUDENT a;

        cout << "
Nhap thong tin cho sinh vien thu " << i << "
";
        cout << "Name: ";
        fflush(stdin);
        gets(a.name);

        cout << "Account: ";
        fflush(stdin);
        gets(a.account);

        cout << "Subject: ";
        fflush(stdin);
        gets(a.subject);
        do
        {
        cout << "Score: ";
        cin>>a.score;
        }
        while(a.score<0||a.score>10);

        NODE *p = KhoiTaoNODE(a);
        ThemCuoi(l, p);
    }
    cout << "

";
}

void LuuFile(LIST l)
{
    ofstream outfile;

    outfile.open("STUDENT.LOG");

    outfile << setw(30) << left << "Name" << setw(10) << left << "Account" << setw(10) << left << "Subject" << setw(5) << left << "Score" << endl;
    for(NODE *i = l.pHead; i != NULL; i = i->pNext)
    {
        outfile << setw(30) << left << i->sSV.name;
        outfile << setw(10) << left << i->sSV.account;
        outfile << setw(10) << left << i->sSV.subject;
        outfile << setw(5) << left << i->sSV.score;
        outfile << "
";
    }

}

int main()
{
    LIST l;
    KhoiTaoDS(&l);

    int a;


    do
    {
        cout << "*********************************************
";
        cout << "*            STUDENT MANAGEMENT             *
";
        cout << "*********************************************

";
        cout << "
1. INSERT STUDENT";
        cout << "
2. DELETE STUDENT";
        cout << "
3. SEARCH STUDENT BASE ON SCORE";
        cout << "
4. SHOW STUDENT INFORMATION";
        cout << "
5. SAVE STUDENT INFORMATION";
        cout << "

6. EXIT

";


        cin >> a;

        switch(a)
        {
        case 1:
        {
            NhapDanhSachSinhVien(&l);
            cout << "

";
            break;
        }
        case 2:
        {
            char acc[10];

            cout << "Ban muon xoa Account nao: ";
            fflush(stdin);
            gets(acc);

            XoaSinhVien(&l,acc);

            cout << "
";

            break;
        }
        case 3:
        {
            int score;

            cout << "Nhap diem ban muon tim: ";
            cin >> score;

            TimScore(l, score);

            break;
        }
        case 4:
        {
            InDS(l);
            cout << "

";
            break;
        }
        case 5:
        {
            LuuFile(l);
            cout << "Luu thanh cong vao file STUDENT.LOG
";
            break;
        }
        case 6:
        {
            break;
        }
        default:
        {
            cout << "
Moi ban nhap lai
";
        }
        }
    }
    while(a != 6);

    return 0;
}

thế nhưng phần xóa một node bị lỗi và em không biết sửa thế nào.
mọi người giúp em với
em cảm ơn

Henry viết 12:52 ngày 01/10/2018

Bạn muốn được hỗ trợ gì thì nên đề cập ở topic.

nghia viết 12:58 ngày 01/10/2018
for(NODE *i = l->pHead; i != NULL; i = i->pNext)
        {
            if(strcmp(i->pNext->sSV.account,acc) == 0)
            {
                NODE *d;
                d = i->pNext;
                i->pNext = d->pNext;

                delete d;
            }
            else
            {
                cout << "Khong ton tai Account nay";
            }
        }

sai rồi! bạn cần tìm node cần tìm rồi mới xóa nó chứ vừa tìm mà nếu node đó không phải thì thông báo là sau!

Bài liên quan
0