Code bị Exception thrown: write access violation

Exception thrown: write access violation. l.pTail was nullptr. Mình lỗi ngay dòng này l.pTail->pNext = p; XIN CAO NHÂN GIÚP ĐỠ

#include<iostream>
using namespace std;


struct Node
{
	int Data;
	struct Node* pNext;
};
typedef struct Node NODE;
struct List
{
	NODE* pHead;
	NODE* pTail;
};
typedef struct List LIST;

void Init(LIST& l)
{
	l.pHead = NULL;
	l.pTail = NULL;
}
NODE* GetNode(int x)
{
	NODE* p = new NODE;
	if (p == NULL)
		return NULL;

	p->Data = x;
	p->pNext = NULL;
	return p;
}

void AddHead(LIST& l, NODE* p)
{
	if (l.pHead = NULL)
	{
		l.pHead = l.pTail = p;
	}
	else {
		p->pNext = l.pHead;
		l.pHead = p;
	}
}
void AddTail(LIST& l, NODE* p)
{
	if (l.pHead = NULL)
	{
		l.pHead = l.pTail = p;
	}
	else {
		l.pTail->pNext = p;
		l.pTail = p;
	}
}
void Input(LIST& l)
{
	int n;
	printf("\nban muon nhap bao nhieu so: ");
	scanf_s("%d", &n);
	Init(l);

	for (int i = 1; i <= n; i++)
	{
		int x;
		printf("\nNhap vao bao nhieu node: ");
		scanf_s("%d", &x);
		NODE* p = GetNode(x);
		AddTail(l, p);

	}

}
void OutPut(LIST l)
{
	for (NODE* p = l.pHead; p != NULL; p = p->pNext)
	{
		printf_s("%4d", p->Data);
	}
}

int main()
{
	LIST l;
	Input(l);
	OutPut(l);


	system("pause");
	return 0;

mình có AddTail r đấy bạn

== chứ :unamused:

nhiều chỗ bị như vậy lắm :weary:

compile có thêm flag -Wall ko, có thì nó warn thế này rồi

... warning: suggest parentheses around assignment used as truth value [-Wparentheses]
  if (l.pHead = NULL)
              ^

thêm luôn flag -Werror vào cho biến tất cả warnings thành errors, khỏi compile được thì ko run được, bắt lỗi compile dễ hơn lỗi runtime

6 Likes

Bí kíp để không bị

… là dùng if (NULL = l.pHead)
Thực ra nó là 1 coding style/standard: if (CONST == variable)

3 Likes

cám ơn các bn :heart_eyes: :heart_eyes: :heart_eyes: :heart_eyes: :heart_eyes: :heart_eyes: :heart_eyes:

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