30/09/2018, 18:43

Lỗi hàm xoá Cuối trong danh sach liên kết đơn

#include<iostream>
#include<string>
using namespace std;
struct data
{
	long ma;
	string ten;
	int thuTusv;
};
struct SinhVien
{
	struct data dulieu;
	struct 	SinhVien *pNExt = NULL;
};
typedef SinhVien SVV;
struct List
{
	SVV *pHead = NULL;
	SVV *pTail = NULL;

};
SVV *GetNode(data dulieunhap){
	SVV*p = new SVV;
	p->dulieu = dulieunhap;
	p->pNExt = NULL;
	return p;
}
void AddHead(List &l, SVV *p){
	if (l.pHead == NULL)l.pHead = l.pTail = p;
	else
	{
		p->pNExt = l.pHead;
		l.pHead = p;
	}
}
void AddTail(List &l, SVV*p){
	if (l.pHead == NULL)l.pHead = l.pTail = p;
	else
	{
		l.pTail->pNExt = p;
		l.pTail = p;
	}
}
void Input(List &l){
	int n;
	data dulieu;
	cout << "
Nhap So Luong Sinh Vien : ";
	cin >> n;
	for (int i = 0; i < n; i++)
	{
		cout << "
Nhap Thong Tin Sinh Vien Thu : ";
		cin >> dulieu.thuTusv;
		cout << "
 Nhap MA SInh Vien Thu  " << i + 1 << " : ";
		cin >> dulieu.ma;		cin.ignore();
		cout << "
Nhap Ho va Ten Sinh Vien Thu " << i + 1 << " : ";

		getline(cin, dulieu.ten);
		SVV*p = GetNode(dulieu);
		AddHead(l, p);
	}
}
void outPut(List l){
	int dem = 1;
	for (SVV*p = l.pHead; p != NULL; p = p->pNExt)
	{
		cout << "
THong Tin Sinh Vien Thu : " << p->dulieu.thuTusv;
		cout << "
MA Sinh Vien Thu: " << p->dulieu.ma << endl;
		cout << "
Ho va Ten Sinh Vien Thu: " << p->dulieu.ten << endl;
	}
}
void xoadau(List &l){
	SVV*p = l.pHead->pNExt;
	delete l.pHead;
	l.pHead = p;
}

void xoaCuoi(List &l)
{
	SVV *qxoa, *q;
	for (qxoa = l.pHead; qxoa != l.pTail; qxoa = qxoa->pNExt)
	{
		q = qxoa;
	}
	if (qxoa == l.pHead)
		xoadau(l);
	else
	{
		qxoa = l.pTail;
		q->pNExt = NULL;
		delete[]qxoa;
	}
}
void XoaKhoangsauSVV(List &l, SVV*p){
	for (SVV*g = l.pHead; g != NULL; g = g->pNExt)
	{
		SVV *q = new SVV;
		if (g->dulieu.thuTusv == p->dulieu.thuTusv){
			q = g->pNExt;
			g->pNExt = q->pNExt;
			delete q;
			return;
		}
	}
}
void xoaPhantuThuk(List &l){
	int k;
	cout << "
Nhap Phan Tu Can Xoa Thu : ";
	cin >> k;
	SVV*z = l.pHead;
	for (SVV*p = l.pHead->pNExt; p != NULL; p = p->pNExt)
	{
		if (p->dulieu.thuTusv == k){
			XoaKhoangsauSVV(l, p);
			p = z;
		}
		z = p;
	}
	if (l.pHead->dulieu.thuTusv == k)xoadau(l);
	if (l.pTail->dulieu.thuTusv == k)xoaCuoi(l);
}
void Breakpoint(List &l){
	SVV*p = new SVV;
	while (p != NULL)
	{
		p->pNExt = l.pHead;
		delete p;
		p->pNExt = l.pHead->pNExt;
	}
}
void main(){
	List l;
	Input(l);
	outPut(l);
	xoaPhantuThuk(l);
	Breakpoint(l);
}

------------------- Lỗi ở hàm xoá cuối

Gió viết 20:59 ngày 30/09/2018
  • có nhiều lỗi quá
    Phải xét 3 th:
  • list rỗng phead=ptail=null
  • list 1 nút phead=ptail#null
  • list >1 nút
    Hàm xoá đầu chưa xét phead==NULL mà đã truy cập phead->pnext? Khi phead=ptail thì xoá xong cũng phải gán =Null của node bị xoá
    Tương tự ở hàm xoá cuối
Hoan Sò viết 20:51 ngày 30/09/2018

oke,nhưng nó báo lỗi ở hàm XoakhoangsauSVV lỗi g->pNExt = q->pNExt;

Pham Van Hai viết 20:56 ngày 30/09/2018

Mình dùng g++ (bộ gcc) để build không thấy báo lối gì cả.
Bạn dùng compiler gì? message báo lỗi là gì?

Hoan Sò viết 20:57 ngày 30/09/2018

bạn có hàm xoá phần tử thứ k không.

Pham Van Hai viết 20:56 ngày 30/09/2018

Mình copy full chương trình của bạn và build không lỗi.

Hoan Sò viết 20:49 ngày 30/09/2018

sao mình bị lỗi nhỉ. VD mình nhập số sinh viên cần nhập là 2, thêm vào đầu danh sách và xoá thutusinhvien==1; thì nó bị lỗi , chẳng nhé code sai

Bài liên quan
0