我真的不知道该怎么做才能解决此问题。 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':找不到标识符
答案 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);