E0020标识符“ pop”未定义

时间:2019-06-02 16:50:43

标签: c++ queue push pop

我真的不知道该怎么做才能解决此问题。 Iam使用Visual。关闭预编译头,关闭sdl。任务是“找到距顶点后退距离的图的顶点”

主文件:

#include "Header.h"
int main()
{
    int start, length, number;
    char file1[] = "data.txt";
    char file2[] = "result.txt";
    queue **graph = NULL;
    input(&number, &start, &length, &graph, file1);
    queue *buffer = new queue({ NULL, NULL });
    search(&number, &start, &length, &graph, &buffer);
    output(&buffer, file2, start, length);
    system("PAUSE");
}

Header.h:

#include <stdio.h>
#include <windows.h>
#include "vertex.h"

//ввод
void input(int *number, int *start, int *lenght, queue ***graph, char file[])
{
    int v1, v2;
    char c;
    FILE*  in = fopen(file, "r");
    if (in)
    {
        fscanf(in, "%d %d %d\n", number, start, lenght); //считывается количество вершин, начальная вершина, длина пути и определяется ориентированный ли граф
        *graph = new queue*[*number];   //область, куда будет записываться список смежности 
        for (int i = 0; i < *number; i++)
            (*graph)[i] = new queue({ NULL, NULL });

        for (int i = 0; i < *number; i++)       //ввод списка смежности
        {
            fscanf(in, "%d", &v2);  //считывание строки
            fscanf(in, "%c", &c);   //проверка есть ли элементы

            while (c != '\n')
            {
                if (fscanf(in, "%d", &v1)) //считывание граничащих вершин
                {
                    push((*graph)[v2], v1);
                    push((*graph)[v1], v2);
                }
                fscanf(in, "%c", &c);   //проверка есть ли еще элементы
            }
        }
        fclose(in);
    }
}

//вывод
void output(queue **buffer, char text[], int start, int length)
{
    FILE *out = fopen(text, "w");
    if (!(*buffer)->begin)
    {
        fprintf(out, "От вершины %d нет вершин на пути длинной %d", start, length);
        return;
    }
    while ((*buffer)->begin)            //выводятся все элементы очереди
    {
        int a;
        pop(*buffer, a);
        fprintf(out, "%d ", a);
    }
    fclose(out);
}

void step(int* numE, int* numO, bool** odd, queue ***graph, queue** qu)
{
    while (*numE > 0)       //Элементы будут добавляться пока не пройдут все
    {               //элементы добавленные на прошлом шагу
        int n;
        pop(*qu, n);            //Элемент из очереди
        vertex* d = (*graph)[n]->begin; //Обход граничащих с n элементов
        while (d != NULL)       //Пока не пройдут все граничущие элементы
        {
            if (!(*odd)[d->value])
            {
                push(*qu, d->value);        //В очередь граничащего элемен-та
                (*odd)[d->value] = true;    //ставим флажок добавленный элемент     
                (*numO)++;
            }
            d = d->next;        //Переход к следующему граничащему элементу
        }
        (*numE)--;
    }

}

//поиск вершин у связного графа
void search(int *number, int *start, int *length, queue ***graph, queue **comp)
{
    bool* even = new bool[*number];     //Массив для хранения вершин на четном ходу
    bool* odd = new bool[*number];  //Массив для хранения вершин на нечетном ходу 
    bool flag = false;          //Флажок на проверку изолированную вершину
    int numO = 1, numE = 0;     //Количество добавленных элементов во время прошлого хода
    queue* qu = new queue({ NULL, NULL });// записываются новые элементы
    for (int i = 0; i < *number; i++)   //Обнуление массивов
    {
        odd[i] = 0;
        even[i] = 0;
    }
    push(qu, *start);           //Добавление стартового элемента
    odd[*start] = true;
    for (int j = 0; j < *length; j++)
    {
        if (j % 2)
        {
            if (!numE)  break;
            step(&numE, &numO, &odd, graph, &qu);
        }
        else
        {
            if (!numO)
                break;
            step(&numO, &numE, &even, graph, &qu);
            if (!flag && numE)      //если было добавление, то убираем флажок 
                flag = true;
        }

    }
    if (*length % 2)
    {
        for (int i = 0; i < *number; i++)
            if (even[i])
                push(*comp, i);
    }
    else
        if (flag || *length == 0)
            for (int i = 0; i < *number; i++)
                if (odd[i])
                    push(*comp, i);

}

vertex.h:

struct vertex
{
    int value; vertex *next;
};

struct queue
{
    vertex *begin; vertex *end;
};

void input(int *number, int *start, int *lenght, queue ***graph, char file[]);
void output(queue **buffer, char text[], int start, int length);
void step(int* numE, int* numO, bool** odd, queue ***graph, queue** qu);
void search(int *number, int *start, int *length, queue ***graph, queue **comp);

E0020标识符“ pop”未定义 E0020标识符“推”未定义 C3861'推':找不到标识符 C3861'pop':找不到标识符

1 个答案:

答案 0 :(得分:-1)

好的,我只是忘记实现弹出和推送功能。 vertex.h:

struct vertex
{
    int value; vertex *next;
};

struct queue
{
    vertex *begin; vertex *end;
};

void push(queue* &p, int elem)
{

    vertex *temp = new vertex({ elem, NULL });
    if (!p->begin)
    {
        p->begin = temp;
        p->end = temp;
    }
    else
    {
        p->end->next = temp;
        p->end = p->end->next;

    }

}

void pop(queue* &p, int &elem)
{
    if (!p->begin) return;
    vertex *temp = p->begin;
    elem = p->begin->value;
    p->begin = p->begin->next;
    if (!p->begin)
        p->end = NULL;
    delete temp;
}

void input(int *number, int *start, int *lenght, queue ***graph, char file[]);
void output(queue **buffer, char text[], int start, int length);
void step(int* numE, int* numO, bool** odd, queue ***graph, queue** qu);
void search(int *number, int *start, int *length, queue ***graph, queue **comp);