📖 Scenario: Imagine you are helping a city planner who wants to represent roads between different neighborhoods. Some neighborhoods are connected directly by roads, and some are not. You want to help the planner choose the best way to store this road information in a computer.
🎯 Goal: You will create two ways to represent the roads between neighborhoods: one using an adjacency matrix and one using an adjacency list. Then, you will decide which way is better depending on how many roads there are.
📋 What You'll Learn
Create an adjacency matrix for 4 neighborhoods with given roads
Create an adjacency list for the same 4 neighborhoods with the same roads
Count the number of roads using the adjacency matrix
Print the adjacency matrix and adjacency list to compare
💡 Why This Matters
🌍 Real World
City planners, network engineers, and social network analysts use adjacency lists and matrices to represent connections between points or people.
💼 Career
Understanding these representations helps in optimizing storage and speed when working with graphs in software development, data analysis, and network design.
Progress0 / 4 steps
1
Create an adjacency matrix for 4 neighborhoods
Create a 4x4 integer array called adjMatrix initialized with zeros. Then set the following roads (edges) to 1: from neighborhood 0 to 1, from 0 to 2, from 1 to 2, and from 2 to 3.
DSA C
Hint
Think of adjMatrix as a table where rows and columns represent neighborhoods. A 1 means a road exists.
2
Create an adjacency list for the same neighborhoods
Create an array of integer pointers called adjList with size 4. Also create an integer array called adjListSizes with size 4 to store the number of roads for each neighborhood. Initialize the adjacency list with the following roads: neighborhood 0 connects to 1 and 2, neighborhood 1 connects to 2, and neighborhood 2 connects to 3.
DSA C
Hint
Each neighborhood has a list of neighbors it connects to. Use arrays for each list and store their sizes.
3
Count the number of roads using the adjacency matrix
Create an integer variable called roadCount and set it to 0. Use a nested for loop with variables i and j to go through adjMatrix. Increase roadCount by 1 every time you find a 1 in adjMatrix[i][j].
DSA C
Hint
Look at each cell in the matrix. If it is 1, it means a road exists, so add to the count.
4
Print the adjacency matrix and adjacency list
Use printf to print the adjacency matrix in a 4x4 grid format. Then print the adjacency list by showing each neighborhood and its connected neighbors. Finally, print the total number of roads stored in roadCount.
DSA C
Hint
Print the matrix row by row, then print each neighborhood's list of neighbors. Finally, print the road count.
Practice
(1/5)
1. Which data structure is generally better for representing a graph with very few edges compared to the number of vertices?
easy
A. Adjacency List
B. Adjacency Matrix
C. Edge List
D. Incidence Matrix
Solution
Step 1: Understand graph density
A graph with very few edges compared to vertices is called a sparse graph.
Step 2: Choose efficient representation for sparse graphs
Adjacency lists store only existing edges, saving space for sparse graphs, unlike adjacency matrices which use space for all possible edges.
Final Answer:
Adjacency List -> Option A
Quick Check:
Sparse graph = Adjacency List [OK]
Hint: Sparse graph? Use adjacency list for space efficiency [OK]
Common Mistakes:
Choosing adjacency matrix for sparse graphs wastes space
Confusing edge list with adjacency matrix
Thinking adjacency matrix is always better
2. Which of the following is the correct way to declare an adjacency matrix for a graph with 4 vertices in C?
easy
A. int graph[4][4][4];
B. int graph[4];
C. int graph[][] = new int[4][4];
D. int graph[4][4];
Solution
Step 1: Recall C array declaration syntax
In C, a 2D array for 4 vertices is declared as int graph[4][4];
Step 2: Check options for correctness
int graph[4][4]; matches correct syntax; int graph[4]; is 1D array; int graph[][] = new int[4][4]; uses Java syntax; int graph[4][4][4]; is 3D array.
Final Answer:
int graph[4][4]; -> Option D
Quick Check:
C 2D array syntax = int graph[4][4]; [OK]
Hint: C 2D arrays use int name[rows][cols]; syntax [OK]
Common Mistakes:
Using Java or other language syntax in C
Declaring wrong array dimensions
Confusing 1D and 2D arrays
3. Given the following adjacency matrix for a graph with 3 vertices:
What is the output of the code snippet that prints all neighbors of vertex 1?
for (int i = 0; i < 3; i++) {
if (graph[1][i] == 1) {
printf("%d ", i);
}
}
medium
A. 0 2
B. 1 2
C. 0 1
D. 1 0 2
Solution
Step 1: Analyze adjacency matrix row for vertex 1
Row 1 is {1, 0, 1}, meaning edges to vertices 0 and 2.
Step 2: Trace loop printing neighbors
Loop checks graph[1][i] == 1; prints i when true. i=0 and i=2 satisfy condition.
Final Answer:
0 2 -> Option A
Quick Check:
Neighbors of vertex 1 = 0 and 2 [OK]
Hint: Check matrix row for 1s to find neighbors [OK]
Common Mistakes:
Confusing row and column indices
Printing vertex itself as neighbor
Misreading matrix values
4. The following code attempts to create an adjacency list for a graph with 3 vertices but has an error:
int* graph[3];
for (int i = 0; i < 3; i++) {
graph[i] = malloc(sizeof(int));
graph[i][0] = i;
}
What is the main issue?
medium
A. Array size should be 4 instead of 3
B. Using malloc instead of calloc
C. Memory allocated is too small for multiple neighbors
D. graph should be declared as int graph[3][3]
Solution
Step 1: Check memory allocation size
malloc(sizeof(int)) allocates space for only one int, but adjacency list needs space for multiple neighbors.
Step 2: Understand adjacency list needs dynamic size
Allocating only one int is insufficient; should allocate enough space or use dynamic structures like linked lists.
Final Answer:
Memory allocated is too small for multiple neighbors -> Option C
Quick Check:
Insufficient malloc size = Error [OK]
Hint: Allocate enough memory for all neighbors in adjacency list [OK]
Common Mistakes:
Confusing malloc and calloc
Wrong array declaration type
Assuming fixed size adjacency list
5. You have a graph with 1000 vertices and about 10,000 edges. You want to quickly check if an edge exists between any two vertices. Which representation is best and why?
hard
A. Adjacency List, because it uses less memory for sparse graphs
B. Adjacency Matrix, because it allows O(1) edge existence check
C. Edge List, because it is easiest to implement
D. Incidence Matrix, because it stores edges explicitly
Solution
Step 1: Analyze graph size and density
1000 vertices and 10,000 edges means the graph is moderately dense (max edges ~499,500).
Step 2: Consider edge existence check speed
Adjacency matrix allows checking edge existence in O(1) time by direct index access.
Step 3: Compare memory vs speed tradeoff
Though adjacency matrix uses more memory, fast edge check is priority here.
Final Answer:
Adjacency Matrix, because it allows O(1) edge existence check -> Option B
Quick Check:
Fast edge check = Adjacency Matrix [OK]
Hint: Need fast edge check? Use adjacency matrix despite memory [OK]
Common Mistakes:
Choosing adjacency list only for memory without speed need
Ignoring graph density impact
Confusing edge list with adjacency matrix
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.