简体   繁体   中英

Reading in to Linked-List not Working correctly C++

I have been stuck on this problem for hours will someone please help.

The input is in the following format

5
1 2  9.0
1 3 12.0
2 4 18.0
2 3  6.0
2 5 20.0
3 5 15.0
0
1 5

The first number is the number of vertexes in the graph. Then next lines up to 0 are the edges of the graph. With the first and second numbers being the vertexes and the third being how far the edge is between them. Trying to read in the data and store the edges into there locations in the List adjacency for that vertex. This example would make a graph with five vertexes with edges from 1 to 2&3. 2 to 4&3&1 etc also stores opposites EX. 2 1 9.0. It is not storing the data correctly. When reading in each new data for each vertex overwrites the previous data. It is storing the data in multiple listCells because when printed out i get

1 3 12.000
1 3 12.000
2 5 20.000
2 5 20.000
2 5 20.000
2 5 20.000
3 5 15.000
3 5 15.000
3 5 15.000

So it is the write number of cells just wrong information.

#include <cstdio>
using namespace std;
int tracing= 1;

struct ListCell
{
   ListCell* next;
   int vertex;
   double weight;

   ListCell(int v, double w, ListCell* nxt)
   {
      vertex = v;
      weight = w;
      next = nxt;
   }
};

typedef ListCell* List;

struct Vertex
{
   bool signaled;
   long distance;
   List adjacency;    
};

struct Graph
{
   int     numVertices;
   Vertex* vertexInfo;

   Graph(int n)
   {
      numVertices = n;
      vertexInfo  = new Vertex[n+1];
      for(int i = 1; i <= n; i++)
      {
         vertexInfo[i].signaled = false;
      }
   }
};

//==============================================================
//                   tail
//==============================================================
// 
//==============================================================

   List tail(List L)
   {
      return L->next;
   }
//==============================================================
//                   isEmpty
//==============================================================
// 
//==============================================================

   bool isEmpty(List L)
   {
      return L == NULL;
   }
//==============================================================
//                   readIn
//==============================================================
// 
//==============================================================

Graph readIn()
{
   int g;
   int p1;
   int p2;
   float edge;
   scanf("%i ", &g);

   Graph myGraph(g);
   scanf("%i", &p1);
   while(p1 != 0)
   {
      scanf("%i", &p2);
      scanf("%f", &edge);

      if(tracing >0)
      {
         printf("Edge from %i to %i is %5.3f\n", p1, p2, edge);
      }

      myGraph.vertexInfo[p1].adjacency = new ListCell 
      (p2,edge,myGraph.vertexInfo[p1].adjacency);


      myGraph.vertexInfo[p2].adjacency = new ListCell
      (p1, edge, myGraph.vertexInfo[p2].adjacency);

      scanf("%i", &p1);
   }
   return myGraph;
}

//==============================================================
//                   printOut
//==============================================================
// 
//==============================================================

void printOut(Graph myGraph)
{  
   int n;
   int length = myGraph.numVertices;
   float d;
   List p;

   printf("There are %i vertices.\n", length);
   printf("The edges are as follows. \n\n");
   for(int i=1; i<=length; i++)
   {
      p= myGraph.vertexInfo[i].adjacency;
      for(p=p; !isEmpty(p); p=tail(p))
      {
         n = myGraph.vertexInfo[i].adjacency -> vertex;
         d = myGraph.vertexInfo[i].adjacency -> weight; 
         if(i<n)
         {
            printf("%i %i %7.3f \n",i,n,d);
         }
      }
   }
}
//==============================================================
//                   main
//==============================================================

int main(int argc, char** argv)
{
   Graph myGraph = readIn();
   printOut(myGraph);
   return 0;
}

There is a lot wrong with your code. The first thing and probably the most glaring is this:

myGraph.vertexInfo[p1].adjacency = new ListCell 
   (p2,edge,myGraph.vertexInfo[p1].adjacency);

you call this in the input loop. Look at your first vertex you input (1). You input this twice, one time for "1 2 9.0", and again for "1 3 12.0". The variable p1 doesn't change (it remains at 1), but you're overwriting the first input with the second input.

So you not only have an error in the input, you have a memory leak since you're creating a ListCell dynamically, and overwriting the previous dynamically allocated ListCell.

Maybe an array is not what you should use as a vertexInfo. Maybe it should be a map of vertex to vertices/distances:

std::map<int, std::vector<std::pair<int,double>>>

where the key is the vertex, and the inner vector is a vector of all the adjacent vertices and distances (each one represented as a pair).

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM