30/09/2018, 21:17
Lỗi con trỏ danh sách liên kết
Mình bị lỗi này không biết sửa.
SinhVienNode * insertAfter(List & l, SinhVienNode * q, SinhVien info)
{
SinhVienNode * p = getNode(info); // Nhận sinh viên
if(p == NULL) // Nếu cấp phát động thất bại
{
return NULL; // Báo thêm thất bại
}
if(q == NULL) // Nếu danh sách rỗng
{
addHead(l, p); // Thêm vào đầu danh sách
}
else
{
p->pNext = q->pNext;
q->pNext = p;
if(l.pTail == q) // Nếu q là sinh viên cuối danh sách
{
l.pTail = p; // Cập nhập lại p là sinh viên cuối danh sách
}
}
return p; // Báo thêm thành công
}
Bài liên quan
p->pNext = q->pNext;
Xem lại dòng code này xem sao. Có thể bạn tạo liên kết sai sai rồi.
thuật toán của bạn thì không thấy sai, rất có thể sai là do mấy cái hàm bạn sử dụng trong thân hàm này như mấy hàm addHead(l,p), bạn có thể đưa cả chương trình lên để xem được không?
Bạn đã khởi tạo danh sách chưa ?
Đây là toàn bộ code của mình, bạn copy chạy thử kiểm soát lỗi giúp mình nhé :D.
Mình chưa quen với Debug để sửa lỗi lắm
#include “stdafx.h”
#include “stdio.h”
#include “conio.h”
#include “iostream”
#define MSSV 9
#define Ho_Ten 30
#define NamSinh 5
struct SinhVien
{
char strMSSV[MSSV];
char strHoTen[Ho_Ten];
char strNamSinh[NamSinh];
float fDiemTrungBinh;
};
struct SinhVienNode
{
SinhVien info;
SinhVienNode * pNext;
};
struct List
{
SinhVienNode * pHead, * pTail;
};
SinhVienNode * getHead(List & l);
// Hàm khởi tạo danh sách
void init(List & l)
{
l.pHead = l.pTail = NULL;
}
// Hàm thiết lập thông tin cho sinh viên
SinhVien setInfo()
{
SinhVien info;
}
// Hàm tạo ra một node sinh viên hoàn chỉnh
SinhVienNode * getNode(SinhVien info)
{
SinhVienNode * p = new SinhVienNode;
}
// Hàm chỉ sắp xếp sinh viên có sẵn vào đầu danh sách
void addHead(List & l, SinhVienNode * p)
{
if(l.pHead == NULL) // Nếu danh sách rỗng
{
l.pHead = l.pTail = p; // p vừa là đầu, vừa là cuối
}
// Hàm chỉ sắp xếp sinh viên có sẵn vào cuối danh sách
void addTail(List & l, SinhVienNode * p)
{
if(l.pHead == NULL) // Nếu danh sách rỗng
{
l.pHead = l.pTail = p; // p vừa là đầu, vừa là cuối
}
// Hàm nhận thông tin sinh viên và sắp xếp vào vị trí đầu danh sách
SinhVienNode * insertHead(List & l, SinhVien info)
{
SinhVienNode * p = getNode(info); // Nhận sinh viên
}
// Hàm nhận thông tin sinh viên và sắp xếp vào vị trí cuối danh sách
SinhVienNode * insertTail(List & l, SinhVien info)
{
SinhVienNode * p = getNode(info); // Nhận sinh viên
}
// Hàm thêm sinh viên vào giữa danh sách
SinhVienNode * insertAfter(List & l, SinhVienNode * q, SinhVien info)
{
SinhVienNode * p = getNode(info); // Nhận sinh viên
}
// Tạo một danh sách
void createList(List & l)
{
int iSoLuong; // Số lượng sinh viên muốn thêm
}
// Hàm tìm sinh viên theo mã số sinh viên
SinhVienNode * searchMSSV(List l, char strMSSV[MSSV])
{
SinhVienNode * p;
}
// Hàm tách sinh viên theo mã số sinh viên
SinhVienNode * getMSSV(List l, char strMSSV[MSSV])
{
SinhVienNode * k = l.pHead;
}
// Hàm tìm điểm trung bình cao nhất
float findMax(List l)
{
float fMax;
}
// Xuất ra thông tin một sinh viên
void showSinhVien(SinhVienNode * p)
{
printf("%s - %s - %s - %.1f", p->info.strMSSV, p->info.strHoTen, p->info.strNamSinh, p->info.fDiemTrungBinh);
}
// Xuất ra danh sách thông tin sinh viên
void showList(List l)
{
printf(“Danh sach thong tin sinh vien”);
}
// Tách sinh viên đầu ra khỏi danh sách
SinhVienNode * getHead(List & l)
{
SinhVienNode * p = NULL;
}
// Tách sinh viên giữa ra khỏi danh sách
SinhVienNode * getAfter(List & l, SinhVienNode * q)
{
SinhVienNode * p = NULL;
}
// Xóa sinh viên
void delSinhVien(SinhVienNode * p)
{
//SinhVien info;
}
// Xóa danh sách
void delList(List & l)
{
SinhVienNode * p;
}
void main()
{
List Lop18TH01;
int iChoise;
int iA;
float fMax;
char strMSSV_Del[MSSV];
char strMSSV_Find[MSSV];
}