2015-06-20 2 views
-3

Я пытался преобразовать этот код из C++ в C. Он должен найти цикл Эйлера графика, но здесь это не очень важно. Моя проблема в том, что я не знаю, почему я получаю эти компиляционные ошибки.Преобразование из C++ в c

код в C++:

#include <iostream> 
#include <iomanip> 

using namespace std; 

// Typy danych 

struct dlistEl 
{ 
     dlistEl *next,*prev; 
    int v; 
}; 

// Zmienne globalne 

int m,n;      // Liczba krawędzi i wierzchołków 
char **graf;     // Dynamiczna macierz sąsiedztwa 
bool * visited;     // Tablica odwiedzin 


void addC(int x, dlistEl *p) 
{ 
    dlistEl * r; 

    r = new dlistEl; 
    r->v = x; 
    r->next = p->next; 
    if(r->next) r->next->prev = r; 
    r->prev = p; 
    p->next = r; 
} 

// Procedura usuwa z listy element wskazywany przez p 
//--------------------------------------------------- 
void remC(dlistEl *p) 
{ 
    if(p->next) p->next->prev = p->prev; 
    if(p->prev) p->prev->next = p->next; 
    delete p; 
} 

// Rekurencyjna funkcja dodająca do listy nowy cykl 
// v - wierzchołek startowy i końcowy cyklu 
// w - wierzchołek bieżący 
// p - referencja do wskazania punktu wstawiania na liście 
//-------------------------------------------------------- 
bool DFSaddCycle(int v, int w, dlistEl * & p) 
{ 
    int u; 

    visited[w] = true;   // Oznaczamy v jako odwiedzony 
    addC(w,p);     // Dodajemy w do cyklu 
    p = p->next;     // p wskazuje dodany element 
    for(u = 0; u < n; u++)  // Przeglądamy sąsiadów w 
    if(graf[w][u]) 
    { 
     if(u == v)    // Cykl znaleziony? 
     { 
     addC(v,p);    // Zamykamy cykl na liście C 
     do 
     { 
      graf[p->v][p->next->v] = 0; // Usuwamy krawędzie cyklu 
      if(p->v == v) return true; 
      p = p->prev;   } while(true); 
     } 
    if(!visited[u] && DFSaddCycle(v,u,p)) return true; 
    } 
    p = p->prev;     // Z listy usuwamy w 
    remC(p->next); 
    return false; 
} 

// ********************** 
// *** PROGRAM GŁÓWNY *** 
// ********************** 

int main() 
{ 
    int i,j,v1,v2; 
    dlistEl *C,*p; 

    cin >> n >> m;    // Czytamy liczbę wierzchołków i krawędzi 

    // Tworzymy tablice dynamiczne 

    graf = new char * [n]; 
    visited = new bool [n]; 
    for(i = 0; i < n; i++) 
    { 
    graf[i] = new char [n]; 
    for(j = 0; j < n; j++) graf[i][j] = 0; 
    } 

    // Odczytujemy definicje krawędzi grafu 

    for(i = 0; i < m; i++) 
    { 
    cin >> v1 >> v2; 
    graf[v1][v2] = 1; 
    } 

    C = new dlistEl;    // Tworzymy listę z wierzchołkiem v1 
    C->v = v1; 
    C->next = NULL; 
    C->prev = NULL; 

    for(p = C; p; p = p->next) // Przeglądamy listę C 
    for(i = 0; i < n; i++)  // Szukamy sąsiadów 
     if(graf[p->v][i]) 
     { 
     for(j = 0; j < n; j++) visited[j] = false; 
     DFSaddCycle(p->v,i,p); 

    cout << endl; 

    // Wyświetlamy zawartość listy C, czyli pełny cykl Eulera 

    for(p = C; p; p = p->next) cout << setw(3) << p->v; 

    cout << endl; 

    // Usuwamy zmienne dynamiczne 

    p = C; 
    while(p) 
    { 
    p = C->next; 
    remC(C); 
    C = p; 
    } 

    for(i = 0; i < n; i++) delete [] graf[i]; 

    delete [] graf; 
    delete [] visited; 

    return 0; 
} 

А вот код в C:

#include<stdio.h> 
#include<stdlib.h> 
#pragma warning(disable: 4996) 

typedef enum { true = 1, false = 0 } bool; 



struct dlistEl 
{ 
    struct dlistEl *next, *prev; 
    int v; 
}; 



int m, n;      // Liczba krawędzi i wierzchołków 
char **graf;     // Dynamiczna macierz sąsiedztwa 
bool * visited;     // Tablica odwiedzin 

void addC(int x, struct dlistEl *p) 
{ 
    struct dlistEl * r; 

    r = (struct dlistEL *)malloc(sizeof(struct dlistEL)); 
    r->v = x; 
    r->next = p->next; 
    if (r->next) r->next->prev = r; 
    r->prev = p; 
    p->next = r; 
} 

void remC(struct dlistEl *p) 
{ 
    if (p->next) p->next->prev = p->prev; 
    if (p->prev) p->prev->next = p->next; 
    free(p); 
} 

bool DFSaddCycle(int v, int w, struct dlistEl * & p) 
{ 
    int u; 

    visited[w] = true;   // Oznaczamy v jako odwiedzony 
    addC(w, p);     // Dodajemy w do cyklu 
    p = p->next;     // p wskazuje dodany element 
    for (u = 0; u < n; u++)  // Przeglądamy sąsiadów w 
     if (graf[w][u]) 
     { 
      if (u == v)    // Cykl znaleziony? 
      { 
       addC(v, p);    // Zamykamy cykl na liście C 
       do 
       { 
        graf[p->v][p->next->v] = 0; // Usuwamy krawędzie cyklu 
        if (p->v == v) return true; 
        p = p->prev; 
       } while (true); 
      } 
      if (!visited[u] && DFSaddCycle(v, u, p)) return true; 
     } 
    p = p->prev;     // Z listy usuwamy w 
    remC(p->next); 
    return false; 
} 

int main() 
{ 
    int i,j,v1,v2; 
    struct dlistEl *C,*p; 

    scanf("%d %d", n, m);   // Czytamy liczbę wierzchołków i krawędzi 

    // Tworzymy tablice dynamiczne 

    graf =(char **)malloc(sizeof(char *)*n); 
    visited =(bool *)malloc(sizeof(bool)*n); 
    for(i = 0; i < n; i++) 
    { 
    graf[i] =(char *)malloc(sizeof(char)*n); 
    for(j = 0; j < n; j++) graf[i][j] = 0; 
    } 

    // Odczytujemy definicje krawędzi grafu 

    for(i = 0; i < m; i++) 
    { 
     printf("podaj def krawedzie grafu: \n"); 
     scanf("%d %d", v1, v2); 
    graf[v1][v2] = 1; 
    } 

    C = (struct dlistEL *)malloc(sizeof(struct dlistEL)); 
    C->v = v1; 
    C->next = NULL; 
    C->prev = NULL; 

    for(p = C; p; p = p->next) // Przeglądamy listę C 
    for(i = 0; i < n; i++)  // Szukamy sąsiadów 
     if(graf[p->v][i]) 
     { 
     for(j = 0; j < n; j++) visited[j] = false; 
     DFSaddCycle(p->v,i,p); 
     } 

    printf("\n"); 

    // Wyświetlamy zawartość listy C, czyli pełny cykl Eulera 

    for (p = C; p; p = p->next) printf(" %d", p->v); 

    printf("\n"); 

    // Usuwamy zmienne dynamiczne 

    p = C; 
    while(p) 
    { 
    p = C->next; 
    remC(C); 
    C = p; 
    } 

    for(i = 0; i < n; i++) free(graf[i]); 

    free(graf); 
    free(visited); 

    return 0; 
} 

Когда я пытаюсь скомпилировать программу, написанную на C он говорит:

error: invalid application of 'sizeof' to incomplete type 'struct dlistEL'|

error: expected ';', ',' or ')' before '&' token|

error: invalid application of 'sizeof' to incomplete type 'struct dlistEL'|

+0

Возможно, вам понадобится 'typedef struct', чтобы использовать его по имени. –

+2

Не создавайте собственный тип 'bool' в C. Используйте' stdbool.h'. Не нажимайте на/из 'void *' в C, как используется 'malloc()' & friends (отличается от C++!). Не запрещайте предупреждения для каждого файла, но только там, где они на самом деле появляются (и только если хорошо подумали, а не так, как они вас раздражают). 'sizeof (char) является _defined_ равным 1 стандартом; нет смысла его использовать. – Olaf

ответ

3

I думаю, проблемы

  1. В коде

    bool DFSaddCycle(int v, int w, struct dlistEl * & p) 
    

    вы можете захотеть изменить что

    bool DFSaddCycle(int v, int w, struct dlistEl * p) 
    

    Там нет проходят по ссылке в C. Это только указатели, которые вы можете использовать.

  2. Вы ошибаетесь в имени структуры.

    malloc(sizeof(struct dlistEL)); //uppercase 
    

    должен быть

    malloc(sizeof(struct dlistEl)); //lowercase 
    
  3. и, наконец, do not cast the return value of malloc().

1

Это struct dlistEL или struct dlistEl?

struct dlistEL /* ends with uppercase L */ 
struct dlistEl /* ends with lowercase L */ 
+0

Абсолютно ..... все. :-) Вы не возражаете, если я добавлю это к моему ответу тоже? –

+1

Я не против @SouravGhosh ... но нет необходимости суммировать все ответы в одном ответе. Формат Stack Overflow достаточно хорош для нескольких разных идей в нескольких разных ответах. – pmg

+0

сэр, я также считал, что раньше я использовал ссылку на предыдущие ответы и добавлял мои, но потом кто-то проголосовал и сказал мне: «Это не полный ответ, вы должны написать свой собственный, если другой ответ будет удален , никто не может знать, на что вы указываете ». –

Смежные вопросы