CS13002 Programming and Data Structures

Section 3/C, Spring 2003--2004

Assignment 6 : Solution


The program

#include <stdio.h>

#define GRAPH_SIZE 20

typedef struct {
   int noOfNodes;
   char *label;
   int **data;
} adjMat;

struct _node {
   char label;
   struct _node *next;
};
typedef struct _node node;

adjMat newAdjMat ( int n )
{
   int i, j;
   adjMat M;

   if (n <= 0) {
      M.noOfNodes = 0;
      M.label = NULL;
      M.data = NULL;
   } else {
      M.noOfNodes = n;
      M.label = (char *)malloc(n*sizeof(char));
      M.data = (int **)malloc(n*sizeof(int *));
      for (i=0; i<n; ++i) {
         M.label[i] = i + 'A';
         M.data[i] = (int *)malloc(n*sizeof(int));
         M.data[i][i] = 0;
         for (j=0; j<n; ++j) if (j!=i) M.data[i][j] = rand() & 1;
      }
   }
   return(M);
}

void printAdjMat ( adjMat M )
{
   int i, j;

   printf("   ");
   for (i=0; i<M.noOfNodes; ++i) printf(" %c ",M.label[i]);
   printf("\n");
   for (i=0; i<M.noOfNodes; ++i) {
      printf(" %c ",M.label[i]);
      for (j=0; j<M.noOfNodes; ++j) printf("%2d ",M.data[i][j]);
      printf("\n");
   }
}

node *newLL ( int n )
{
   node *head = NULL, *curr;
   int i, j;

   if (n > 0) {
      head = (node *)malloc(n*sizeof(node));
      for (i=0; i<n; ++i) {
         curr = head + i;
         curr->label = i + 'a';
         for (j=0; j<n; ++j) if ((i!=j)&&(rand()&1)) {
            curr->next = (node *)malloc(sizeof(node));
            curr = curr->next;
            curr->label = j + 'a';
         }
         curr->next = NULL;
      }
   }
   return(head);
}

void printLL ( node *head , int n )
{
   int i, j;
   node *curr;

   for (i=0; i<n; ++i) {
      curr = head + i;
      printf("Label : %c. Links to :", curr->label);
      while (curr->next != NULL) {
         curr = curr->next;
         printf(" %c ", curr->label);
      }
      printf("\n");
   }
}

node *adjMatToLL ( adjMat M )
{
   node *head = NULL, *curr;
   int i, j, n;

   n = M.noOfNodes;
   if (n > 0) {
      head = (node *)malloc(n*sizeof(node));
      for (i=0; i<n; ++i) {
         curr = head + i;
         curr->label = M.label[i];
         for (j=0; j<n; ++j) if (M.data[i][j]) {
            curr->next = (node *)malloc(sizeof(node));
            curr = curr->next;
            curr->label = M.label[j];
         }
         curr->next = NULL;
      }
   }
   return(head);
}

adjMat LLToAdjMat ( node *head , int n )
{
   adjMat M;
   int i, j, done;
   node *curr;

   if (n > 0) {
      M.noOfNodes = n;
      M.label = (char *)malloc(n*sizeof(char));
      M.data = (int **)malloc(n*sizeof(int *));
      for (i=0; i<n; ++i) M.label[i] = head[i].label;
      for (i=0; i<n; ++i) {
         curr = head + i;
         M.data[i] = (int *)calloc(n,sizeof(int));
         while (curr->next != NULL) {
            curr = curr->next;
            j = done = 0;
            while ((j<n)&&(!done)) {
               if (curr->label == M.label[j]) {
                  M.data[i][j] = 1;
                  done = 1;
               } else ++j;
            }
            if (!done) fprintf(stderr,"Unknown label %c...\n",curr->label);
         }
      }
   } else {
      M.noOfNodes = 0;
      M.label = NULL;
      M.data = NULL;
   }
   return(M);
}

int main ()
{
   adjMat M;
   node *head;

   srand((unsigned int)time(NULL));

   M = newAdjMat(GRAPH_SIZE);
   printf("Generating random adjacency matrix :\n");
   printAdjMat(M);
   head = adjMatToLL(M);
   printf("The corresponding linked list :\n");
   printLL(head,GRAPH_SIZE);
   printf("-----------------------------------------------------\n");

   head = newLL(GRAPH_SIZE);
   printf("Generating random linked list :\n");
   printLL(head,GRAPH_SIZE);
   M = LLToAdjMat(head,GRAPH_SIZE);
   printf("The corresponding adjacency matrix :\n");
   printAdjMat(M);
   printf("-----------------------------------------------------\n");
}

Output

Generating random adjacency matrix :
    A  B  C  D  E  F  G  H  I  J  K  L  M  N  O  P  Q  R  S  T
 A  0  0  0  0  0  0  0  1  1  1  0  0  1  0  1  1  0  1  0  1
 B  0  0  0  1  0  1  1  1  0  1  0  0  0  0  0  0  1  1  0  0
 C  0  1  0  0  0  0  1  1  1  1  0  0  0  0  0  0  0  1  1  1
 D  1  1  1  0  1  1  0  0  0  1  1  0  1  1  0  0  1  0  1  0
 E  0  0  0  0  0  1  0  0  1  0  1  0  1  0  1  1  0  1  1  0
 F  1  0  1  1  1  0  0  1  1  1  0  0  1  0  1  1  0  0  1  0
 G  1  1  1  1  0  1  0  1  1  1  0  0  1  1  0  0  0  0  0  0
 H  1  1  0  0  0  0  1  0  1  0  1  0  0  0  1  1  1  0  0  0
 I  1  0  0  0  1  1  0  0  0  0  0  0  0  0  0  0  0  0  0  1
 J  0  0  0  0  0  0  0  1  1  0  0  1  0  1  1  0  1  1  0  0
 K  1  0  0  1  0  0  1  0  0  0  0  0  1  0  0  1  0  0  1  0
 L  1  1  0  0  1  0  0  1  1  1  1  0  1  0  1  0  1  1  0  1
 M  1  1  1  1  0  1  1  0  1  1  1  0  0  0  0  0  1  1  0  1
 N  1  0  0  0  1  0  0  1  1  1  0  0  1  0  1  1  0  1  0  0
 O  1  0  1  1  0  0  1  0  1  1  1  0  0  1  0  0  0  0  0  0
 P  0  1  0  0  0  1  1  1  1  0  0  1  0  0  1  0  1  0  1  0
 Q  0  0  1  1  0  1  0  0  0  1  0  0  1  1  0  1  0  1  1  0
 R  1  1  0  1  0  0  1  1  1  1  0  0  1  0  1  1  0  0  1  1
 S  0  1  0  0  1  1  0  0  0  1  1  0  0  0  1  1  1  1  0  0
 T  0  1  1  1  1  1  1  0  0  0  1  1  0  0  0  1  0  1  1  0
The corresponding linked list :
Label : A. Links to : H  I  J  M  O  P  R  T
Label : B. Links to : D  F  G  H  J  Q  R
Label : C. Links to : B  G  H  I  J  R  S  T
Label : D. Links to : A  B  C  E  F  J  K  M  N  Q  S
Label : E. Links to : F  I  K  M  O  P  R  S
Label : F. Links to : A  C  D  E  H  I  J  M  O  P  S
Label : G. Links to : A  B  C  D  F  H  I  J  M  N
Label : H. Links to : A  B  G  I  K  O  P  Q
Label : I. Links to : A  E  F  T
Label : J. Links to : H  I  L  N  O  Q  R
Label : K. Links to : A  D  G  M  P  S
Label : L. Links to : A  B  E  H  I  J  K  M  O  Q  R  T
Label : M. Links to : A  B  C  D  F  G  I  J  K  Q  R  T
Label : N. Links to : A  E  H  I  J  M  O  P  R
Label : O. Links to : A  C  D  G  I  J  K  N
Label : P. Links to : B  F  G  H  I  L  O  Q  S
Label : Q. Links to : C  D  F  J  M  N  P  R  S
Label : R. Links to : A  B  D  G  H  I  J  M  O  P  S  T
Label : S. Links to : B  E  F  J  K  O  P  Q  R
Label : T. Links to : B  C  D  E  F  G  K  L  P  R  S
-----------------------------------------------------
Generating random linked list :
Label : a. Links to : e  g  i  k  l  m  n  r  s
Label : b. Links to : a  c  e  f  h  i  j  k  n  p  q  r  t
Label : c. Links to : e  f  g  h  l  o  q
Label : d. Links to : a  e  g  i  k  l  m  n  p  q  r  s
Label : e. Links to : a  b  c  d  f  g  i  l  n  o
Label : f. Links to : a  c  d  g  h  i  o  p  q  t
Label : g. Links to : a  c  d  e  i  l  m  q  s
Label : h. Links to : a  b  g  i  j  n  p  r  s  t
Label : i. Links to : a  c  e  f  h  l  p  s  t
Label : j. Links to : b  c  e  f  h  i  n  q  r  s
Label : k. Links to : a  h  j  l  n  p  q  r  t
Label : l. Links to : c  d  g  j  s
Label : m. Links to : b  c  d  e  g  h  i  k  l  n  o  s  t
Label : n. Links to : b  e  h  j  l  m  r  s  t
Label : o. Links to : c  e  g  j  k  r  s  t
Label : p. Links to : b  d  f  g  h  i  m  o  q
Label : q. Links to : d  g  h  l  n  o  p
Label : r. Links to : a  b  c  d  e  g  h  i  j  k  l  m  n  o  s  t
Label : s. Links to : a  c  d  e  h  i  k  m  n  o  r
Label : t. Links to : a  c  e  f  h  i  l  m
The corresponding adjacency matrix :
    a  b  c  d  e  f  g  h  i  j  k  l  m  n  o  p  q  r  s  t
 a  0  0  0  0  1  0  1  0  1  0  1  1  1  1  0  0  0  1  1  0
 b  1  0  1  0  1  1  0  1  1  1  1  0  0  1  0  1  1  1  0  1
 c  0  0  0  0  1  1  1  1  0  0  0  1  0  0  1  0  1  0  0  0
 d  1  0  0  0  1  0  1  0  1  0  1  1  1  1  0  1  1  1  1  0
 e  1  1  1  1  0  1  1  0  1  0  0  1  0  1  1  0  0  0  0  0
 f  1  0  1  1  0  0  1  1  1  0  0  0  0  0  1  1  1  0  0  1
 g  1  0  1  1  1  0  0  0  1  0  0  1  1  0  0  0  1  0  1  0
 h  1  1  0  0  0  0  1  0  1  1  0  0  0  1  0  1  0  1  1  1
 i  1  0  1  0  1  1  0  1  0  0  0  1  0  0  0  1  0  0  1  1
 j  0  1  1  0  1  1  0  1  1  0  0  0  0  1  0  0  1  1  1  0
 k  1  0  0  0  0  0  0  1  0  1  0  1  0  1  0  1  1  1  0  1
 l  0  0  1  1  0  0  1  0  0  1  0  0  0  0  0  0  0  0  1  0
 m  0  1  1  1  1  0  1  1  1  0  1  1  0  1  1  0  0  0  1  1
 n  0  1  0  0  1  0  0  1  0  1  0  1  1  0  0  0  0  1  1  1
 o  0  0  1  0  1  0  1  0  0  1  1  0  0  0  0  0  0  1  1  1
 p  0  1  0  1  0  1  1  1  1  0  0  0  1  0  1  0  1  0  0  0
 q  0  0  0  1  0  0  1  1  0  0  0  1  0  1  1  1  0  0  0  0
 r  1  1  1  1  1  0  1  1  1  1  1  1  1  1  1  0  0  0  1  1
 s  1  0  1  1  1  0  0  1  1  0  1  0  1  1  1  0  0  1  0  0
 t  1  0  1  0  1  1  0  1  1  0  0  1  1  0  0  0  0  0  0  0
-----------------------------------------------------

Generating random adjacency matrix :
    A  B  C  D  E  F  G  H  I  J  K  L  M  N  O  P  Q  R  S  T
 A  0  0  1  1  1  1  1  0  1  0  0  0  1  0  1  0  0  1  1  1
 B  0  0  0  0  0  1  1  0  1  1  0  0  0  0  0  1  1  1  0  1
 C  0  0  0  0  0  1  0  1  0  0  1  1  1  1  1  0  0  1  1  0
 D  0  1  0  0  0  1  0  0  0  0  1  0  1  0  0  1  0  0  1  0
 E  0  1  1  1  0  1  0  1  1  0  0  0  0  0  1  0  0  0  1  1
 F  0  1  0  0  0  0  0  1  0  1  1  1  1  1  1  0  0  0  0  1
 G  1  1  1  1  1  1  0  1  0  0  1  1  1  0  0  1  0  0  0  1
 H  0  1  0  0  0  1  1  0  0  0  1  0  1  0  1  1  1  1  0  0
 I  1  0  0  0  1  0  0  1  0  0  0  1  0  1  0  0  1  0  0  0
 J  0  0  1  0  1  1  0  0  0  0  1  1  1  0  1  1  0  1  1  0
 K  0  1  0  1  1  1  1  0  0  1  0  0  0  1  0  1  1  1  0  1
 L  0  1  0  1  0  0  0  1  0  1  0  0  0  1  1  1  0  1  0  1
 M  1  1  0  1  1  1  1  1  1  0  1  0  0  0  0  1  1  0  1  0
 N  1  0  1  1  0  1  1  1  1  0  0  1  1  0  1  1  0  0  1  1
 O  1  0  1  1  0  0  1  1  1  0  1  1  1  1  0  1  1  1  0  0
 P  1  1  0  1  0  1  0  0  1  0  1  0  0  1  1  0  1  1  1  0
 Q  1  1  0  0  0  0  1  1  1  0  1  1  1  1  1  0  0  1  0  0
 R  1  1  1  0  1  1  1  0  0  1  0  0  0  1  1  0  1  0  1  1
 S  1  0  1  0  1  1  1  0  1  1  0  0  0  1  1  1  0  0  0  0
 T  0  0  1  0  0  1  1  1  1  1  0  0  0  0  0  0  1  1  0  0
The corresponding linked list :
Label : A. Links to : C  D  E  F  G  I  M  O  R  S  T
Label : B. Links to : F  G  I  J  P  Q  R  T
Label : C. Links to : F  H  K  L  M  N  O  R  S
Label : D. Links to : B  F  K  M  P  S
Label : E. Links to : B  C  D  F  H  I  O  S  T
Label : F. Links to : B  H  J  K  L  M  N  O  T
Label : G. Links to : A  B  C  D  E  F  H  K  L  M  P  T
Label : H. Links to : B  F  G  K  M  O  P  Q  R
Label : I. Links to : A  E  H  L  N  Q
Label : J. Links to : C  E  F  K  L  M  O  P  R  S
Label : K. Links to : B  D  E  F  G  J  N  P  Q  R  T
Label : L. Links to : B  D  H  J  N  O  P  R  T
Label : M. Links to : A  B  D  E  F  G  H  I  K  P  Q  S
Label : N. Links to : A  C  D  F  G  H  I  L  M  O  P  S  T
Label : O. Links to : A  C  D  G  H  I  K  L  M  N  P  Q  R
Label : P. Links to : A  B  D  F  I  K  N  O  Q  R  S
Label : Q. Links to : A  B  G  H  I  K  L  M  N  O  R
Label : R. Links to : A  B  C  E  F  G  J  N  O  Q  S  T
Label : S. Links to : A  C  E  F  G  I  J  N  O  P
Label : T. Links to : C  F  G  H  I  J  Q  R
-----------------------------------------------------
Generating random linked list :
Label : a. Links to : b  d  e  g  i  l  m  n  o  q  t
Label : b. Links to : a  c  l  n  o  p  q  s  t
Label : c. Links to : a  b  e  g  i  l  m  p  s
Label : d. Links to : e  h  j  k  l  q  r  s
Label : e. Links to : d  f  h  i  m  p  r  s  t
Label : f. Links to : a  e  i  k  l  n  o  s
Label : g. Links to : a  b  k  l  m  p  r  t
Label : h. Links to : d  k  l  o  r  s  t
Label : i. Links to : a  b  d  e  f  g  j  p  s
Label : j. Links to : a  b  c  g  k  l  m  o  q  s
Label : k. Links to : d  e  f  g  i  l  m  n  p  q  s  t
Label : l. Links to : a  b  e  g  h  j  p  q  r
Label : m. Links to : a  b  f  g  h  i  j  q  r
Label : n. Links to : e  i  l  m  o  r  s  t
Label : o. Links to : a  d  f  g  k  n  t
Label : p. Links to : b  c  e  g  h  j  l  n  q  r  s  t
Label : q. Links to : b  c  d  e  j  l  m  r  s  t
Label : r. Links to : b  e  g  h  j  l  m  n
Label : s. Links to : b  c  d  f  g  h  i  n  o  r
Label : t. Links to : a  b  c  d  h  j  k  m  q  r  s
The corresponding adjacency matrix :
    a  b  c  d  e  f  g  h  i  j  k  l  m  n  o  p  q  r  s  t
 a  0  1  0  1  1  0  1  0  1  0  0  1  1  1  1  0  1  0  0  1
 b  1  0  1  0  0  0  0  0  0  0  0  1  0  1  1  1  1  0  1  1
 c  1  1  0  0  1  0  1  0  1  0  0  1  1  0  0  1  0  0  1  0
 d  0  0  0  0  1  0  0  1  0  1  1  1  0  0  0  0  1  1  1  0
 e  0  0  0  1  0  1  0  1  1  0  0  0  1  0  0  1  0  1  1  1
 f  1  0  0  0  1  0  0  0  1  0  1  1  0  1  1  0  0  0  1  0
 g  1  1  0  0  0  0  0  0  0  0  1  1  1  0  0  1  0  1  0  1
 h  0  0  0  1  0  0  0  0  0  0  1  1  0  0  1  0  0  1  1  1
 i  1  1  0  1  1  1  1  0  0  1  0  0  0  0  0  1  0  0  1  0
 j  1  1  1  0  0  0  1  0  0  0  1  1  1  0  1  0  1  0  1  0
 k  0  0  0  1  1  1  1  0  1  0  0  1  1  1  0  1  1  0  1  1
 l  1  1  0  0  1  0  1  1  0  1  0  0  0  0  0  1  1  1  0  0
 m  1  1  0  0  0  1  1  1  1  1  0  0  0  0  0  0  1  1  0  0
 n  0  0  0  0  1  0  0  0  1  0  0  1  1  0  1  0  0  1  1  1
 o  1  0  0  1  0  1  1  0  0  0  1  0  0  1  0  0  0  0  0  1
 p  0  1  1  0  1  0  1  1  0  1  0  1  0  1  0  0  1  1  1  1
 q  0  1  1  1  1  0  0  0  0  1  0  1  1  0  0  0  0  1  1  1
 r  0  1  0  0  1  0  1  1  0  1  0  1  1  1  0  0  0  0  0  0
 s  0  1  1  1  0  1  1  1  1  0  0  0  0  1  1  0  0  1  0  0
 t  1  1  1  1  0  0  0  1  0  1  1  0  1  0  0  0  1  1  1  0
-----------------------------------------------------


Lab home