Code không in ra kết quả

//7.Viet ham chen 1 node sinh vien vao danh sach lien ket
//7.1.1. Chen sau
void AddTail(LIST &l, NODE *p)
{
	if (l.Head == NULL)
	{
		l.Head = l.Tail = p;
	}
	else
	{
		p->prev = l.Tail;
		l.Tail->next = p;
		l.Tail = p;
	}
}

//7.1.2 Chen truoc
void AddHead(LIST &l, NODE *p)
{
	if (l.Head == NULL)
	{
		l.Head = l.Tail = p;
	}
	else
	{
		p->next = l.Head;
		l.Head->prev = p;
		l.Head = p;
	}
}

//7.2. Ham duyet danh sach
NODE* Search(LIST l, int masv)
{
	NODE *p = l.Head;	//cho node p duyet mang tu node dau
	while (p != NULL)	//duyet cho den khi het danh sach
	{
		if (p->info.masv != masv)	//neu masv bang vs ma sv nhap vao
		{
			p = p->next;	//neu k tro toi node tiep theo
		}
	}
	return p;	//return p
}

//7.3. Chen vao trc q
void AddBeforeq(LIST &l, NODE *p, NODE *q)//p la node ms, q la node sau p
{
	//kiem tra cac tr.hop dac biet
	if (l.Head == NULL)
		return;
	if (l.Head == p)
		AddHead(l, p);
	
	//xac dinh node trc p
	NODE *left = q->prev;

	//gan node moi vao node trai left
	p->prev = left;
	left->next = p;

	//gan node ms vao node ben phai q
	p->next = q;
	q->prev = p;
}

//7.4. ham chen in ra ds
void Chen1SV(LIST &l)
{
	int y;
	sv a;
	printf("\nNhap thong tin sv moi : ");
	Nhap1Sv(a);
	NODE *p = GetNode(a);
	printf("\nNhap ma sinh vien can tim de chen vo truoc: ");
	scanf_s("%d", &y);
	NODE *q = Search(l, y);
	if (q != NULL)
	{
		AddBeforeq(l, p, q);
	}
	printf("\n-------Mang sau khi them---------- ");
	for (NODE *k = l.Head; k != NULL; k = k->next)
	{
		printf("\n--------------");
		Xuat1SV(k->info);
	}
}

Ai giúp e với e sắp tới hạn nộp bài r. Em cảm ơn!!!

(cứ tưởng là dslk đơn, sr)

Là sao bạn?? Trong bài giảng cô mình cũng làm thế mà tham khảo mấy code trên mạng cũng tương tự v
Bạn chỉ ra cho mình lỗi sai ở đâu v?

Ai giúp e với mai e nộp bài r

Mình chưa hiểu phép so sánh này lắm. Bạn muốn thêm 1 node vào trước node q thì sao lại so sánh node đầu danh sách với node p ? (vì lúc này node p làm gì có trong danh sách)

Hàm này dùng để làm gì vậy bạn ?
Nếu để tìm kiếm 1 node (masv) có trong list hay không thì code wrong rồi ! Và fix lại như sau:

//7.2. Ham duyet danh sach
NODE* Search(LIST l, int masv)
{
	NODE *p = l.Head;	//cho node p duyet mang tu node dau
	while (p != NULL)	//duyet cho den khi het danh sach
	{
		if (p->info.masv != masv)	//neu masv bang vs ma sv nhap vao
		{
			p = p->next;	//neu k tro toi node tiep theo
		}
                else
                {
                        return p;
                }
	}
	return NULL;
}

P/S: Tên các tham số trong hàm chèn node bạn nên để tên dễ hiểu một chút, chứ đặt tên p q … thì người đọc code họ khó hiểu đấy. Có một số chỗ trong code comment thừa nữa !

2 Likes

Cảm ơn bạn nhiều lắm lắm lắm!!! Có nhiêu đây mà mình làm mãi k ra, ức chế mấy ng` nay ~~~ <3<3<3
Mà bạn có thể giải thích giúp mình cái lỗi trên k ???

Code bạn chạy ổn chưa ?

Như đã nói ở post trên:

Chỗ này nên sửa thành if (l.Head == q) vì bản thân node p là node thêm vào nên nó chưa hề tồn tại trong list => phép so sánh if (l.Head == p) là vô nghĩa.
Nếu bạn nhập vị trí thêm là vị trí đầu thì có thể sẽ bị lỗi !

Còn cái hàm này, trong vòng lặp while bạn chỉ xét điều kiện là nếu mã số cho trước (tham số masv) khác với mã số của node đang xét thì cho node p trỏ đến node tiếp theo, vậy nếu nó trùng thì xử lý làm sao ?
Cho nên mình mới xét thêm điều kiện else là nếu trùng thì lập tức return node p về luôn (do kiểu trả về của hàm SearchNODE *). Còn không tìm thấy thì return NULL; và dưới hàm Chen1SV, q nhận giá trị NULL nên hàm AddBeforeq(...) sẽ không được gọi.
Có thể vì điều này mà code bạn không xuất ra được kết quả ! Tuy nhiên để hiểu rõ hơn vì sao sai thì bạn nên debug nhé, VS mạnh nhất ở trình debug mà sao không tận dụng ?

1 Like

Rồi bạn!! mình đã sửa p lại thành q, tại trong lúc làm mình vừa làm theo slide of cô + theo ý mình nên có sự nhầm lẫn (.). H thì mình hiểu sao nó k xuất ra kết quả r :grinning:
Cảm ơn bạn lần nữa:wink::wink:

Bạn ơi, phiền bạn coi này giúp mình cái này nữa đc k v?? Mình lại gặp lỗi tương tự trên. Mình có hỏi 1 anh thì ảnh nói là code mình chạy trên codeblock đc nhưng khi qua Visual thì lại lỗi. Cảm ơn bạn nhiều !!

//10. Viết hàm xóa một node sinh viên có tên x được tìm thấy trong danh sách (x là tham số truyền vào).
//10.1. Xoa dau
void DeleteHead(LIST &l)
{
	NODE *p;
	if (l.Head != NULL)
	{
		p = l.Head;
		l.Head->next->prev = NULL;
		l.Head = l.Head->next;
		delete p;
	}
}

//10.2. Tim sinh vien theo ten
NODE* Search_Ten(LIST l, char ten[11])
{
	NODE *p = l.Head;	//cho p duyet mang tu node dau
	while (p != NULL)
	{
		if (strcmp(p->info.hoten, ten) == 0)	//neu 2 chuoi trung nhau
		{
			return p;
		}
		else
			p = p->next;
	}
	return NULL;	//khong tim thay
}

//10.3. Ham xoa 1 node 
void DeleteNode (LIST &l, NODE *p)
{
	NODE *left, *right;

	//xet cac truong hop dac biet
	if (p == NULL)
		return;
	if (p==l.Head)
		DeleteHead(l);
	else
	{
		//xac dinh node can xoa
		left = p->prev;
		right = p->next;

		//xoa node
		left->next = right;
		if (right != NULL)
			right->prev = left;

		//tach node ra khoi ds
		delete p;
	}
}

//10.4. Bat dau xoa
void Xoa1SV(LIST &l)
{
	char ten[11];	//khai bao ten can xoa
	printf("\nNhap ten can xoa: ");		
	scanf_s("%s", &ten);

	NODE *p = Search_Ten(l, ten);	//cho p quan li node tim dc
	if (p != NULL)
	{
		DeleteNode(l, p);		// xoa neu tim dc
	}
	else
	{
		printf("\nKhong tim thay sv");
	}
}


Cái này đúng là chỉ có VS hay bị thôi. Giờ bạn build hẳn ra exe (tức là release mode đó), tắt VS rồi chạy lên xem có bị gì ko. Với lại bạn gõ giống y test hình thứ 2 ấy.

1 Like

tắt VS r sao chạy bạn !!!:joy:

“Release Mode” chứ ko phải Debug đâu.

1 Like

Được r bạn ơi, cảm ơn nhiều nhe!!:blush:

bà lên tận đây tìm cơ à :smile:

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