01/10/2018, 01:10

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("
Nhap thong tin sv moi : ");
	Nhap1Sv(a);
	NODE *p = GetNode(a);
	printf("
Nhap 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("
-------Mang sau khi them---------- ");
	for (NODE *k = l.Head; k != NULL; k = k->next)
	{
		printf("
--------------");
		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!!!

rogp10 viết 03:21 ngày 01/10/2018

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

Luc Tran Ngoc Thao viết 03:23 ngày 01/10/2018

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?

Luc Tran Ngoc Thao viết 03:23 ngày 01/10/2018

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

Người bí ẩn viết 03:26 ngày 01/10/2018
if (l.Head == p)

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)

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
}

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 !

Luc Tran Ngoc Thao viết 03:12 ngày 01/10/2018

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 ???

Người bí ẩn viết 03:13 ngày 01/10/2018

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

Mà bạn có thể giải thích giúp mình cái lỗi trên k ???

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

if (l.Head == p)

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 !

//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
}

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 ?

Luc Tran Ngoc Thao viết 03:23 ngày 01/10/2018

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
Cảm ơn bạn lần nữa:wink:

Luc Tran Ngoc Thao viết 03:25 ngày 01/10/2018

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");
	}
}


rogp10 viết 03:19 ngày 01/10/2018

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.

Luc Tran Ngoc Thao viết 03:11 ngày 01/10/2018

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

rogp10 viết 03:26 ngày 01/10/2018

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

Luc Tran Ngoc Thao viết 03:15 ngày 01/10/2018

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

VHT viết 03:20 ngày 01/10/2018

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

Bài liên quan
0