Проверьте, образует ли двусвязный список арифметическую прогрессию - PullRequest
0 голосов
/ 20 мая 2018

Я работаю с моим проектом 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 голосов
/ 23 мая 2018

Вот совет:
На основе определения, чтобы проверить, составляют ли значения в списке арифметическую прогрессию, вы должны проверить, если каждая пара из последовательных элементовсделайте то же самое.

Так что вам нужно:

  1. проверить, есть ли в списке хотя бы одна такая пара, т.е. в списке есть хотя бы два элемента;
  2. вычислить и сохранить разницу между ними;
  3. , а затем просмотрите остальную часть списка и проверьте, имеет ли каждый элемент такую ​​же разницу со своим преемником (или предшественником, если хотите), который вы вычислили на первом шаге.

Однако не забудьте правильно обработать хвост списка, если вы решите проверить преемника - последний элемент в списке его не имеет!

0 голосов
/ 20 мая 2018
while( p != NULL)
{
    NODE *q = p->pNext;
    if (q->info - p->info == d)
        flag = 1;
    p = p->pNext;
}

Вы проверяете на p, но затем разыменовываете q = p->pNext без проверки, является ли оно NULL или нет.Вы можете попытаться проверить, является ли последовательность арифметической, запомнив последнее известное посещенное значение в списке (и начиная со второго элемента).

...