测试双向链表是否形成算术级数

时间:2018-05-20 06:44:12

标签: c++ pointers data-structures linked-list

我正在处理我的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;
}

你能给我一些建议来解决这个问题吗?谢谢。

2 个答案:

答案 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)

这是一个建议:
根据定义,要测试列表中的值是否形成算术级数,您需要验证连续项的每个是否会产生相同的差异。

所以你需要:

  1. 测试列表中是否至少有一个这样的对,即列表中至少有两个项目;
  2. 计算并存储它们之间的差异;
  3. 然后遍历列表的其余部分并测试每个项目是否与您在第一步中计算的后继者(或前任,如果您愿意)产生相同的差异。
  4. 但是,请记住,要正确处理列表的尾部,以防您选择测试后继者 - 列表中的最后一项没有![/ p>