Wczytanie listy sąsiedztwa i zamiana na macierz sąsiedztwa

0

plik dane wygląda tak:

 
10
1 3 3
1 5 2
2 5 1
2 6 5
2 3 5
3 4 1
3 6 3
4 5 3
4 7 4
6 7 9
#include<iostream>
#include<fstream>
#include<conio.h>
using namespace std;

void print(int **tab, int n);
int main()
{
	
	ifstream plik("dane.txt");
	int n; //liczba wierzcholkow
	if(plik.good())
	{
		plik >> n;
	}
	else
		cout << "nie mozna otworzyc plku! \n";

	//w tablice wpiszemy liste sasiedztaw
	int **tab = new int * [10];
	for(int i=0; i<10; i++)
		tab[i] = new int [3];

	for(int i=0; i<10; i++)
		for(int j=0; j<3; j++)
			plik >> tab[i][j];


	cout << "wczytana lista sasiedztwa: \n";
	for(int i=0; i<10; i++)
	{
		for(int j=0; j<3; j++)
			cout << tab[i][j] << "  ";
		cout << endl;
	}

	//tworzmy macierz sasiedztwa nxn
	int **matrix = new int * [n];
	for(int i=0; i<n; i++)
		matrix[n] = new int [n];



	getch();
}

Problem mam taki ze nie wiem jak przepisac wartosci z listy sąsiedztwa ktorą mam w tablicy tab do matrix która ma być macierzą sąsiedztwa

0

Więc dwie wersje kodu - obie wpisałem dla Ciebie pseudokodem.

#include<iostream>
#include<fstream>
#include<conio.h>
using namespace std;
 
void print(int **tab, int n);
int main()
{
 
        ifstream plik("dane.txt");
        int n; //liczba wierzcholkow
        if(plik.good())
        {
                plik >> n;
        }
        else
                cout << "nie mozna otworzyc plku! \n";
 
        //w tablice wpiszemy liste sasiedztaw
        int **tab = new int * [10];
        for(int i=0; i<10; i++)
                tab[i] = new int [3];
		//bOOsiu: masz tutaj blad nie wpisuj w tab[i][j] tylko w tab[i][wartosc z pliku] = 1
        for(int i=0; i<10; i++)
                for(int j=0; j<3; j++)
                        plik >> tab[i][j];
 
 
        cout << "wczytana lista sasiedztwa: \n";
        for(int i=0; i<10; i++)
        {
                for(int j=0; j<3; j++)
                        cout << tab[i][j] << "  ";
                cout << endl;
        }
 
        //tworzmy macierz sasiedztwa nxn
        int **matrix = new int * [n];
        for(int i=0; i<n; i++)
                matrix [i] przypisz nowa tablica int rozmiaru n
	//bOOsiu: inicjalizacja tablicy zerami
	Dla i od 0 do n wykonaj
	{
		dla j od 0 do n wykonaj
		{
			macierz [i,j] przypisz 0
		}
	
	}
	//bOOsiu: wersja z wypełnionej wcześniej przez Ciebie listy(tablicy) sąsiedztwa
	// 			która nie ma sensu - będzie działać tylko dla pliku z iloscia wezlow 10 
	//			oraz iloscia krawedzi wezla nie wieksza niz 3
	Dla i od 0 do 10 wykonaj
	{
		dla j od 0 do 3 wykonaj
		{
			martix od [i,tab [i,j])] przypisz 1
		}
	}
	//bOOsiu: Twoja tablica jest już gotowa!!! Ale nie dostaniesz za to 5...
	
	//zamknij plik
	plik.close();
		 
        getch();
}
 

Druga wersja, będzie działać dla dowolnego pliku wejściowego (jeśli w wierszu nie podasz więcej niż 100 znaków):

#include<iostream>
#include<sstream>
#include<fstream>
#include<conio.h>
using namespace std;
 
void print(int **tab, int n);
int main()
{
 
        ifstream plik("dane.txt");
        int n; //liczba wierzcholkow
        if(plik.good())
        {
                plik >> n;
        }
        else
                cout << "nie mozna otworzyc plku! \n";
 
        //tworzmy macierz sasiedztwa nxn
        int **matrix = new int * [n];
        for(int i=0; i<n; i++)
                matrix[i] = new int [n];
	//bOOsiu: inicjalizacja tablicy zerami
	Dla i od 0 do n wykonaj
	{
		dla j od 0 do n wykonaj
		{
			macierz [i,j] przypisz 0
		}
	
	}	
	/*bOOsiu: Bardziej uniwersalna wersja*/
	zadeklaruj tablicę o pojemności 100 znaków;
	zadeklaruj zmienną i typu int i zainicjuj ją wartością 0;
	//bOOsiu: tutaj bedzie wlasciwe tworzenie tablicy sasiedztwa
	dopóki nie koniec pliku wykonaj
	{
		pobierz wiersz z pliku do tablicy buf;
		utwórz obiekt typu sstream inicjowany wartością tablicy buf;
		utwórz zmienną typu int o nazwie temp;
		dopóki obiekt typu sstream nie jest pusty wykonaj
		{
			pobierz wartość z obiektu sstream do zmiennej temp;
			do matrix[i,temp] wpisz 1 //bOOsiu: tutaj tworzysz właściwą macierz sasiedztwa
		}			
		zwieksz o jeden zmienna i
	}
	//bOOsiu: Masz już gotową macierz sąsiedztwa
	// zamknij plik
	plik.close();

        getch();
}

Żeby ułatwić, dwa linki:
Ładnie opisany string stream (sstream) http://www.cplusplus.com/reference/iostream/stringstream/
Macierz incydencji http://pl.wikipedia.org/wiki/Macierz_incydencji

EDIT: Poprawiłem wcięcia w kodzie

0
#include <iostream>
#include <fstream>
#include <iomanip>
#include <cstring>
using namespace std;

void print(unsigned **tab,unsigned n)
  {
   for(unsigned y=0;y<n;++y,cout<<endl) for(unsigned x=0;x<n;++x) cout<<setw(3)<<tab[y][x];
  }

int main()
  {
   ifstream fr("dane.txt");
   if(fr)
     {
      unsigned n; // unsigned - chyba że spodziewasz się ujemnej liczby wierzcholkow
      if(fr>>n)
        {
         unsigned **tab=new unsigned*[n]; // unsigned - chyba że spodziewasz się ujemnych krawędzi
         for(unsigned y=0;y<n;++y)
           {
            tab[y]=new unsigned[n];
            memset(tab[y],0,n*sizeof(unsigned)); // zerowanie
           }
         unsigned x,y,v;
         while(fr>>x>>y>>v)
           {
            tab[--y][--x]=v; // indeksacja od zera
            tab[x][y]=v; // to tylko jeżeli graf nie skierowany
           }
         cout<<"wczytano"<<endl;
         print(tab,n);
        }
      else cout<<"na poczatku pliku nie liczba"<<endl;
      fr.close();
     }
   else cout<<"nie mozna otworzyc plku!"<<endl;
   cin.sync();
   cin.get();
   return 0;
  }

1 użytkowników online, w tym zalogowanych: 0, gości: 1