首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >E0020标识符"pop“未定义

E0020标识符"pop“未定义
EN

Stack Overflow用户
提问于 2019-06-03 00:50:44
回答 1查看 443关注 0票数 -2

我真的不知道我需要做什么来解决这个问题。我使用的是Visual。关闭预编译头,sdl检查关闭。任务是“找到图中距离顶点较远的顶点”。

主文件:

代码语言:javascript
复制
#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:

代码语言:javascript
复制
#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:

代码语言:javascript
复制
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':未找到标识符

EN

回答 1

Stack Overflow用户

发布于 2019-06-03 01:06:19

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

代码语言:javascript
复制
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);
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56417036

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档