我正在处理我的Linked List项目。但是当我尝试解决算术级数测试时,我从Visual Studio 2015得到了这个警告:
抛出未处理的异常:读取访问冲突。 q是nullptr。
我的代码:
struct NODE
{
int info;
NODE *pNext;
NODE *pPrev;
};
struct LIST
{
NODE *pHead;
NODE *pTail;
};
void Init(LIST &l)
{
l.pHead = NULL;
l.pTail = NULL;
}
NODE *getNode(int x)
{
NODE *p = new NODE;
if (p == NULL)
return NULL;
p->info = x;
p->pNext = NULL;
p->pPrev = NULL;
return p;
}
void AddTail(LIST &l, NODE *p)
{
if (l.pHead == NULL)
l.pHead = l.pTail = p;
else
{
p->pPrev = l.pTail;
l.pTail->pNext = p;
l.pTail= p;
}
}
int isEmpty(LIST l)
{
if (l.pHead == NULL)
return 1;
return 0;
}
int testArithmetic(LIST &l)
{
int flag = 0;
int d = l.pHead->pNext->info - l.pHead->info;
NODE *p = l.pHead;
while( p != NULL)
{
NODE *q = p->pNext;
if (q->info - p->info == d)
flag = 1;
p = p->pNext;
}
if (flag == 0)
return 0;
return 1;
}
你能给我一些建议来解决这个问题吗?谢谢。
答案 0 :(得分:1)
while( p != NULL)
{
NODE *q = p->pNext;
if (q->info - p->info == d)
flag = 1;
p = p->pNext;
}
您测试p
,然后解除引用q = p->pNext
,而不测试它是否为NULL。您可以通过记住列表中的最后一个已知访问值(并从第二个元素开始)来尝试检查进展是否为算术。
答案 1 :(得分:1)
这是一个建议:
根据定义,要测试列表中的值是否形成算术级数,您需要验证连续项的每个对是否会产生相同的差异。
所以你需要:
但是,请记住,要正确处理列表的尾部,以防您选择测试后继者 - 列表中的最后一项没有![/ p>