What is an adjacency list in graph representation?
An adjacency list is a way to represent a graph where each node stores a list of its neighboring nodes. It saves space by only storing edges that exist.
Click to reveal answer
beginner
How does an adjacency list differ from an adjacency matrix?
An adjacency list stores neighbors for each node in lists, using less space for sparse graphs. An adjacency matrix uses a 2D array to store edge presence, using more space.
Click to reveal answer
intermediate
In C, what data structure is commonly used to implement an adjacency list?
A common approach is to use an array of pointers, where each pointer points to a linked list of neighbors for that vertex.
Click to reveal answer
beginner
Why is adjacency list preferred for sparse graphs?
Because it only stores existing edges, it uses less memory and is faster to iterate over neighbors compared to adjacency matrix which stores all possible edges.
Click to reveal answer
intermediate
What is the time complexity to find all neighbors of a vertex using adjacency list?
It is O(k), where k is the number of neighbors of that vertex, since we directly access the list of neighbors.
Click to reveal answer
What does each element in an adjacency list represent?
AA graph color
BA matrix row
CA vertex and its neighbors
DAn edge weight
✗ Incorrect
Each element in an adjacency list stores a vertex and a list of its neighboring vertices.
Which data structure is commonly used to store neighbors in C adjacency lists?
AArray of arrays
BStack
CQueue
DLinked lists
✗ Incorrect
Linked lists are used to store neighbors dynamically for each vertex.
What is the main advantage of adjacency lists over adjacency matrices?
AFaster edge lookup
BLess memory for sparse graphs
CSimpler to implement
DSupports weighted graphs only
✗ Incorrect
Adjacency lists use less memory when the graph has fewer edges.
How do you add an edge from vertex u to vertex v in an adjacency list?
AAdd v to u's neighbor list
BSet matrix[u][v] = 1
CAdd u to v's neighbor list
DIncrement edge count
✗ Incorrect
In adjacency lists, adding an edge means adding the destination vertex to the source vertex's neighbor list.
What is the space complexity of adjacency list for a graph with V vertices and E edges?
AO(V + E)
BO(V^2)
CO(E^2)
DO(V)
✗ Incorrect
Adjacency list stores vertices and edges separately, so space is proportional to vertices plus edges.
Explain how an adjacency list represents a graph and why it is efficient for sparse graphs.
Think about how you would list friends for each person instead of a big table.
You got /3 concepts.
Describe how you would implement an adjacency list in C using arrays and linked lists.
Imagine each vertex has a pointer to a chain of neighbors.
You got /3 concepts.
Practice
(1/5)
1. What does an adjacency list represent in graph data structures?
easy
A. A list where each vertex stores its adjacent vertices
B. A matrix showing connections between vertices
C. A list of all vertices without edges
D. A list of edges only without vertices
Solution
Step 1: Understand adjacency list concept
An adjacency list stores each vertex and the vertices it connects to directly.
Step 2: Compare with other representations
Unlike adjacency matrix, adjacency list focuses on neighbors per vertex, not a full matrix.
Final Answer:
A list where each vertex stores its adjacent vertices -> Option A
Quick Check:
Adjacency list = vertex with neighbors [OK]
Hint: Adjacency list stores neighbors per vertex, not full matrix [OK]
Common Mistakes:
Confusing adjacency list with adjacency matrix
Thinking it stores only edges without vertices
Assuming it lists vertices without connections
2. Which of the following is the correct C syntax to declare an adjacency list for a graph with 5 vertices using an array of pointers to linked lists?
easy
A. int* adjList[5];
B. int adjList[5][5];
C. struct Node adjList[5];
D. struct Node* adjList[5];
Solution
Step 1: Understand adjacency list declaration
Adjacency list uses array of pointers to linked list nodes, so 'struct Node* adjList[5];' is correct.
Step 2: Check other options
int adjList[5][5]; is adjacency matrix, C is array of structs (not pointers), A is array of int pointers (not nodes).
Final Answer:
struct Node* adjList[5]; -> Option D
Quick Check:
Array of pointers to nodes = correct adjacency list declaration [OK]
Hint: Adjacency list uses array of pointers to node structs [OK]
Common Mistakes:
Using 2D array instead of array of pointers
Declaring array of structs instead of pointers
Using int pointers instead of node pointers
3. Given the following adjacency list representation code snippet for a graph with 3 vertices (0,1,2):
Edges 0->1 then 0->2 are added at head, so list is 2 -> 1 -> NULL.
Step 2: Understand print loop
Prints vertices in order from head: 2 then 1, then NULL.
Final Answer:
2 -> 1 -> NULL -> Option C
Quick Check:
Last inserted edge appears first in adjacency list [OK]
Hint: New nodes added at head, so last added appears first [OK]
Common Mistakes:
Assuming order is insertion order instead of reversed
Printing vertex 0 itself in adjacency list
Confusing NULL print format
4. Consider this buggy code snippet to add an edge from vertex u to v in an adjacency list:
void addEdge(struct Node* adjList[], int u, int v) {
struct Node* newNode = malloc(sizeof(struct Node));
newNode->vertex = v;
newNode->next = NULL;
adjList[u] = newNode;
}
What is the main problem with this code?
medium
A. It overwrites existing adjacency list for vertex u, losing previous edges
B. It does not allocate memory for newNode
C. It sets newNode->next incorrectly to itself
D. It does not assign vertex v to newNode
Solution
Step 1: Analyze pointer assignment
Setting adjList[u] = newNode overwrites old list head, losing previous edges.
Step 2: Check linked list linking
newNode->next is NULL, so no link to old list; old edges lost.
Final Answer:
It overwrites existing adjacency list for vertex u, losing previous edges -> Option A
Quick Check:
Overwriting head pointer loses old adjacency list [OK]
Hint: Always link new node to old head to keep edges [OK]
Common Mistakes:
Not linking new node to existing list
Forgetting to allocate memory
Incorrectly setting next pointer
5. You have a directed graph with 4 vertices (0 to 3). You want to represent it using adjacency lists and add edges: - 0 -> 1 - 0 -> 2 - 1 -> 2 - 2 -> 0 - 2 -> 3 - 3 -> 3
Which data structure and insertion method correctly represents this graph in C?
hard
A. Use 2D int array; set 1 for edges and 0 otherwise
B. Use array of pointers to Node structs; insert new nodes at head linking to old list
C. Use array of Node structs; overwrite each vertex's list on insertion
D. Use array of int pointers; store vertex numbers without linking
Solution
Step 1: Choose correct data structure
Adjacency list uses array of pointers to linked nodes for each vertex.
Step 2: Insert edges properly
Insert new nodes at head, linking to previous list to keep all edges.
Step 3: Check other options
Use 2D int array; set 1 for edges and 0 otherwise is adjacency matrix, C overwrites lists losing edges, D lacks linking.
Final Answer:
Use array of pointers to Node structs; insert new nodes at head linking to old list -> Option B
Quick Check:
Array of pointers + head insertion = correct adjacency list [OK]
Hint: Use pointers array and link new nodes at head to keep edges [OK]
Common Mistakes:
Using adjacency matrix instead of list
Overwriting adjacency list on insertion
Not linking nodes properly
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.