grcreatl.cpp

来自「经典c++程序的实现」· C++ 代码 · 共 90 行

CPP
90
字号
// Create a graph -- Adjacency list
#include <stdio.h>
#include <iostream.h>
#include <assert.h>
#include <stdlib.h>
#include <ctype.h>

#include "..\..\include\book.h"

#define LINELEN 80

#include "..\..\include\grlist.h"

char* getl(char* buffer, int n, FILE* fid) {
  char* ptr;
  ptr = fgets(buffer, n, fid);
  while ((ptr != NULL) && (buffer[0] == '#'))
    ptr = fgets(buffer, n, fid);
  return ptr;
}

// Create a graph from file
bool createGraph(Graph& G, FILE* fid) {
  char buffer[LINELEN+1]; // Line buffer for reading
  bool undirected;  // TRUE if graph is undirected, FALSE if directed
  int i;
  int v1, v2, weight;
  Edge curr;

  if (getl(buffer, LINELEN, fid) == NULL) // Unable to get number of vertices
{ cout << "Unable to read number of vertices\n";
    return FALSE;
}
  G.numVertex = atoi(buffer);
  if (getl(buffer, LINELEN, fid) == NULL) // Unable to get graph type
{ cout << "Unable to read graph type\n";
    return FALSE ;
}
  if (buffer[0] == 'U')
    undirected = TRUE;
  else if (buffer[0] == 'D')
    undirected = FALSE;
  else {
    cout << "Bad graph type: |" << buffer << "|\n";
    return FALSE;
  }

  // Create space
  G.Mark = new bool[G.n()];
  G.list = new Edge [G.n()];
  for (i=0; i< G.n(); i++) // Initialize matrix
    G.list[i] = NULL;

  // Read in edges
  G.numEdge = 0;
  while (getl(buffer, LINELEN, fid) != NULL) {
    v1 = atoi(buffer);
    i = 0;
    while (isdigit(buffer[i])) i++;
    while (buffer[i] == ' ') i++;
    v2 = atoi(&buffer[i]);
    while (isdigit(buffer[i])) i++;
    if (buffer[i] == ' ') { // There is a weight
      while (buffer[i] == ' ') i++;
      weight = atoi(&buffer[i]);
    }
    else weight = 1;
    // Put the edge on the list
    G.numEdge++;
    if (((curr = G.list[v1]) == NULL) || (v2 < curr->v2))
      G.list[v1] = new EdgeLink(v1, v2, weight, curr);
    else {
      while ((curr->next != NULL) && (curr->next->v2 < v2))
         curr = curr-> next;
      curr->next = new EdgeLink(v1, v2, weight, curr->next);
    }
    if (undirected) {// Put in edge in other direction
      G.numEdge++;
      if (((curr = G.list[v2]) == NULL) || (v1 < curr->v2))
        G.list[v2] = new EdgeLink(v2, v1, weight, curr);
      else {
        while ((curr->next != NULL) && (curr->next->v2 < v1))
           curr = curr-> next;
        curr->next = new EdgeLink(v2, v1, weight, curr->next);
      }
    }
  }
  return TRUE;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?