下面的代码有什么问题

时间:2015-01-26 09:02:07

标签: c adjacency-list

下面的邻接列表表示

1---2--3-4
2---1--5
3---4--1
4---1--3
5---2--4

打印邻接列表后,它没有输出。谁能解释一下是什么问题。下面的代码是邻接列表中无向图的简单实现。

#include<stdio.h>
#include <stdlib.h>

#define maxNode 5

typedef struct Node
{
  int vertexNum;
  struct Node *next;
} Node;

typedef struct List
{
  int n;
  struct List *head;
} List;

List *adjlist[maxNode] = { 0 };

void printList ();

void addNode (int source, int destination);

int
main ()
{

/* init our graph nodes */
  int i = 1;
  for (i; i <= maxNode; i++)
    {
      adjlist[i] = (List *) malloc (sizeof (List));
      adjlist[i]->head = NULL;
    }
  addNode (1, 2);
  addNode (1, 3);
  addNode (1, 4);
  addNode (2, 1);
  addNode (2, 5);
  addNode (3, 4);
  addNode (3, 1);
  addNode (4, 1);
  addNode (4, 3);
  addNode (5, 2);
  addNode (5, 4);

  printList ();

  return 0;
}

void
addNode (int source, int destination)
{
  Node *src = (Node *) malloc (sizeof (Node));
  src->vertexNum = source;

  Node *dest = (Node *) malloc (sizeof (Node));
  dest->vertexNum = destination;

  /* now source and destination is an edge */
  /* then it should be listed in list */
  adjlist[source] = src;
  adjlist[source]->head = NULL;
  src->next = NULL;

  List *tmp = adjlist[source];
  while (tmp->head != NULL)
    tmp = tmp->head;

  tmp->next = dest;
  dest->next = NULL;


}

void
printList ()
{
  int i = 1;
  for (i = 1; i <= maxNode; ++i)
    {
      Node *p = adjlist[i]->head;
      printf ("Adjacency list for vetex %d\n", i);
      while (p)
    {
      printf ("%d ", p->vertexNum);
      p = p->next;
    }
      printf ("\n");
    }

}

1 个答案:

答案 0 :(得分:0)

修复如下

#include <stdio.h>
#include <stdlib.h>

#define maxNode 5+1 //0 : dummy

typedef struct Node {
    int vertexNum;
    struct Node *next;
} Node;

typedef struct List{
    int n;//unused
    Node *head;
} List;

List *adjlist[maxNode] = { 0 };

void printList(void);

void addNode(int source, int destination);

int main(void){
    int i;
    for (i = 1; i <= maxNode; i++){
        adjlist[i] = (List *)malloc(sizeof(List));
        adjlist[i]->head = NULL;
    }
    addNode (1, 2);
    addNode (1, 3);
    addNode (1, 4);
    addNode (2, 1);
    addNode (2, 5);
    addNode (3, 4);
    addNode (3, 1);
    addNode (4, 1);
    addNode (4, 3);
    addNode (5, 2);
    addNode (5, 4);

    printList();

    //deallocate
    return 0;
}

void addNode(int source, int destination){
    if(adjlist[source]->head == NULL){
        Node *src = (Node *)malloc(sizeof(Node));
        src->vertexNum = source;
        src->next = NULL;
        adjlist[source]->head = src;
    }

    Node *dest = (Node *)malloc(sizeof(Node));
    dest->vertexNum = destination;
    dest->next = NULL;


    Node *tmp = adjlist[source]->head;
    while (tmp->next != NULL)
        tmp = tmp->next;

    tmp->next = dest;
}

void printList(void){
    int i;
    for (i = 1; i <= maxNode; ++i){
        Node *p = adjlist[i]->head;
        printf ("Adjacency list for vetex %d\n", i);//adjlist[i]->n ?
        while (p){
            printf ("%d ", p->vertexNum);
            p = p->next;
        }
        printf ("\n");
    }
}