我正在使用我的链表项目。但是当我尝试解决算术级数测试时,我收到了来自Visual Studio 2015的警告:
引发未处理的异常:读取访问冲突。 q 为空。
和我的代码:
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;
}
你能给我一些处理这个问题的建议吗?谢谢。
while( p != NULL)
{
NODE *q = p->pNext;
if (q->info - p->info == d)
flag = 1;
p = p->pNext;
}
您测试p
但随后取消引用q = p->pNext
而不测试它是否为 NULL。您可以尝试通过记住列表中最后一个已知访问的值(并从第二个元素开始(来检查进度是否算术。
这里有一个建议:
根据定义,要测试列表中的值是否形成算术级数,您需要验证每对连续项目是否产生相同的差异。
因此,您需要:
- 测试列表中是否至少有一个这样的对,即列表中至少有两个项目;
- 计算并存储它们之间的差额;
- 然后遍历列表的其余部分,并测试每个项目是否与您在第一步中计算的后续项目(或前置项目,如果您愿意(产生相同的差异。
但是,请记住,要正确处理列表的尾部,以防您选择测试继任者 - 列表中的最后一项没有!