Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Datastructures in C

Datastructures in C

My presentation on Data structures using C

Karthikeyan A K

November 20, 2012
Tweet

More Decks by Karthikeyan A K

Other Decks in Programming

Transcript

  1. Which of the following is faster? A binary search of

    an ordered set of elements in an array or a sequential search of the elements?
  2. The binary search is faster than the sequential search. The

    complexity of binary search is 'log n' whereas the complexity of a sequential search is 'n'. In a binary search, each time we proceed, we have to deal with only half of the elements of the array compared to the previous one. So the search is faster.
  3. Compiler Design Operating System Database Management System Statistical analysis package

    Numerical Analysis Graphics Artificial Intelligence Simulation
  4. Stack. Because of its LIFO (Last In First Out) property

    it remembers its caller and hence knows where to return to when the function has to return. Recursion makes use of system stack for storing the return addresses of the function calls. Every recursive function has its equivalent iterative (non-recursive) function. Even when such equivalent iterative procedures are written, explicit stack is to be used.
  5. The size of a Tree is the number of nodes

    in the Tree : True (or) False?
  6. True The size denotes the number of nodes, height denotes

    the longest path from leaf node to root node.
  7. Ram is told to sort a set of Data using

    Data structure. He has been told to use one of the following Methods a. Insertion b. Selection c. Exchange d. Linear Now Ram says a Method from the above can not be used to sort. Which is the method?
  8. d. Linear Using insertion we can perform insertion sort, using

    selection we can perform selection sort, and using exchange we can perform bubble sort. But no sorting method is possible using linear method; Linear is a searching method
  9. Ashok is told to manipulate an Arithmetic Expression. What is

    the data structure he will use? a. Linked List b. Tree c. Graph d. Stack
  10. d. Stack Stacks are used to evaluate the algebraic or

    arithmetic expressions using prefix or postfix notations
  11. There are 8,15,13,14 nodes in 4 different trees. Which of

    them could form a full binary tree? a. 8 b. 15 c. 13 d. 14
  12. In general, there are 2n – 1 nodes in a

    full binary tree. By the method of elimination: Full binary tree contains odd number of nodes. So there cannot be a full binary tree with 8 or 14 nodes. With 13 nodes, you can form a complete binary tree but not a full binary tree. Full and complete binary trees are different All full binary trees are complete binary trees but not vice versa
  13. Full binary Tree: A binary tree is a full binary

    tree if and only if: Each non leaf node has exactly two child nodes All leaf nodes have identical path length It is called full since all possible node slots are occupied A B C D E F G
  14. Complete binary Tree: A complete binary tree (of height h)

    satisfies the following conditions: Level 0 to h-1 represent a full binary tree of height h-1 One or more nodes in level h-1 may have 0, or 1 child nodes A B C D E F G H I J K
  15. 21 (null branches) Let’s consider a tree with 5 nodes

    So the total number of null nodes in a binary tree of n nodes is n+1 Null branches
  16. Write an algorithm to detect loop in a linked list.

    You are presented with a linked list, which may have a "loop" in it. That is, an element of the linked list may incorrectly point to a previously encountered element, which can cause an infinite loop when traversing the list. Devise an algorithm to detect whether a loop exists in a linked list. How does your answer change if you cannot change the structure of the list elements?
  17. One possible answer is to add a flag to each

    element of the list. You could then traverse the list, starting at the head and tagging each element as you encounter it. If you ever encountered an element that was already tagged, you would know that you had already visited it and that there existed a loop in the linked list. What if you are not allowed to alter the structure of the elements of the linked list?
  18. The following algorithm will find the loop: a) Start with

    two pointers ptr1 and ptr2. b) Set ptr1 and ptr2 to the head of the linked list. c) Traverse the linked list with ptr1 moving twice as fast as ptr2 (for every two elements that ptr1 advances within the list, advance ptr2 by one element). d) Stop when ptr1 reaches the end of the list, or when ptr1 = ptr2. e) If ptr1 and ptr2 are ever equal, then there must be a loop in the linked list. If the linked list has no loops, ptr1 should reach the end of the linked list ahead of ptr2
  19. The Operation that is not allowed in a binary search

    tree is a. Location Change b. Search c. Deletion d. Insertion
  20. Array is a type of ________________ data structure. a. Non

    Homogenous b. Non Linear c. Homogenous but not Linear d. Both Homogenous and Linear
  21. The address of a node in a data structure is

    called a. Pointer b. Referencer c. Link d. All the above
  22. The minimum number of edges in a connected cycle graph

    on n vertices is ________ a. n b. n + 1 c. n – 1 d. 2n
  23. The total number of passes required in a selection sort

    is a. n + 1 b. n – 1 c. n d. n * n
  24. The node that does not have any sub trees is

    called ___________ a. Null Node b. Zero Node c. Leaf Node d. Empty Node
  25. Linked List is a a. Static Data Structure b. Primitive

    Data Structure c. Dynamic Data Structure d. None of the above
  26. Which data structure is needed to convert infix notation to

    postfix notation. a. Tree b. Linear Linked List c. Stack d. Queue
  27. If every node u in Graph (G) is adjacent to

    every other node v in G, it is called as _____ graph. a. Directed Graph b. Complete Graph c. Connected Graph d. Multi Graph
  28. Bubble sort is an example of a. Selection sort technique

    b. Exchange sort technique c. Quick sort technique d. None of the options
  29. How do you chose the best algorithm among available algorithms

    to solve a problem a. Based on space complexity b. Based on programming requirements c. Based on time complexity d. All the above
  30. Which of the following are called descendants? a. All the

    leaf nodes b. Parents, grandparents c. Root node d. Children, grandchildren
  31. Choose the limitation of an array from the below options.

    a. Memory Management is very poor b. Searching is slower c. Insertion and deletion are costlier d. Insertion and Deletion is not possible
  32. Areas where stacks are popularly used are. a. Subroutines b.

    Expression Handling c. Recursion d. All the above
  33. Use a temp stack Data In into queue Push the

    element into the original stack Data Out from queue Pop all the elements from stack into a temp stack pop out the first element from the temp stack
  34. int compare_linked_lists(struct node *q, struct node *r){ static int flag;

    if((q==NULL ) && (r==NULL)){ flag=1; } else{ if(q==NULL || r==NULL){ flag=0; } if(q->data!=r->data){ flag=0; } else{ compare_linked_lists(q->link ,r->link); } } return(flag); }
  35. Suppose one needs to get to the 6th node from

    the end in the LL. First, just keep on incrementing the first pointer (ptr1) till the number of increments cross n (which is 6 in this case) STEP 1 : 1(ptr1,ptr2) -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8 -> 9 -> 10 STEP 2 : 1(ptr2) -> 2 -> 3 -> 4 -> 5 -> 6(ptr1) -> 7 -> 8 -> 9 -> 10 Now, start the second pointer (ptr2) and keep on incrementing it till the first pointer (ptr1) reaches the end of the LL. STEP 3 : 1 -> 2 -> 3 -> 4(ptr2) -> 5 -> 6 -> 7 -> 8 -> 9 -> 10 (ptr1) So here you have the 6th node from the end pointed to by ptr2!
  36. struct node { int data; struct node *next; }mynode; mynode

    * nthNode(mynode *head, int n /*pass 0 for last node*/) { mynode *ptr1,*ptr2; int count; if(!head) { return(NULL); } ptr1 = head; ptr2 = head; count = 0;
  37. while(count < n) { count++; if((ptr1=ptr1->next)==NULL) { //Length of the

    linked list less than n. Error. return(NULL); } } while((ptr1=ptr1->next)!=NULL) { ptr2=ptr2->next; } return(ptr2); }
  38. // Special case code for the head end void linkedListInsertSorted(struct

    node** headReference, struct node* newNode) { // Special case for the head end if (*headReference == NULL || (*headReference)->data >= newNode->data) { newNode->next = *headReference; The solution is to iterate down the list looking for the correct place to insert the new node. That could be the end of the list, or a point just before a node which is larger than the new node. Let us assume the memory for the new node has already been allocated and a pointer to that memory is being passed to this function.
  39. *headReference = newNode; } else { // Locate the node

    before which the insertion is to happen! struct node* current = *headReference; while (current->next!=NULL && current->next->data < newNode->data) { current = current->next; } newNode->next = current->next; current->next = newNode; } }
  40. // Remove duplicates from a sorted list void RemoveDuplicates(struct node*

    head) { struct node* current = head; if (current == NULL) return; // do nothing if the list is empty // Compare current node with next node while(current->next!=NULL) { As the linked list is sorted, we can start from the beginning of the list and compare adjacent nodes. When adjacent nodes are the same, remove the second one. There's a tricky case where the node after the next node needs to be noted before the deletion.
  41. if (current->data == current->next->data) { struct node* nextNext = current->next->next;

    free(current->next); current->next = nextNext; } else { current = current->next; // only advance if no deletion } } }
  42. #define max(x,y) ((x)>(y)?(x):(y)) struct Bintree { int element; struct Bintree

    *left; struct Bintree *right; }; typedef struct Bintree* Tree; int height(Tree T) { if(!T) return -1; else return (1 + max(height(T->left), height(T->right))) }
  43. struct Bintree { int element; struct Bintree *left; struct Bintree

    *right; }; typedef struct Bintree* Tree; int CheckIdentical( Tree T1, Tree T2 ) { if(!T1 && !T2) // If both tree are NULL then return true return 1;
  44. else if((!T1 && T2) || (T1 && !T2)) //If either

    of one is NULL, return false return 0; else return ((T1->element == T2->element) && CheckIdentical(T1->left, T2-i>left) && CheckIdentical(T1->right, T2->right)); // if element of both tree are same and left and right tree is also same then both trees are same }
  45. mynode *copy(mynode *root) { mynode *temp; if(root==NULL)return(NULL); temp = (mynode

    *) malloc(sizeof(mynode)); temp->value = root->value; temp->left = copy(root->left); temp->right = copy(root->right); return(temp); }
  46. Which of the following are called siblings a. Children of

    the same parent b. All nodes in the given path upto leaf node c. All nodes in a sub tree d. Children, Grand Children
  47. Linked List can grow and shrink in size dynamically at

    __________ . a. Runtime b. Compile time
  48. Data structure using sequential allocation is called a. Linear Data

    Structure b. Non-Linear Data Structure c. Non-primitive Data Structure d. Sequence Data Structure
  49. A linear list in which elements can be added or

    removed at either end but not in the middle is known as a. Tree b. Queue c. Dequeue d. Stack
  50. The average number of key comparisons done in a successful

    sequential search in list of length n is a. n+1/2 b. n-1/2 c. n/2 d. log n
  51. A full binary tree with n leaves contains __________ a.

    nlog2n nodes b. 2^n nodes c. (2n-1) nodes d. n nodes
  52. If a node has positive outdegree and zero indegree, it

    is called a __________. a. Source b. Sink c. outdegree node d. indegree node
  53. The postfix notation for ((A+B)^C-(D-E)^(F+G)) is a. AB + C*DE—FG+^

    b. ^-*+ABC –DE + FG c. ^+AB*C—DE^+FG d. ABC + CDE *-- FG +^
  54. If you are using C language to implement the heterogeneous

    linked list, what pointer type will you use?
  55. The heterogeneous linked list contains different data types in its

    nodes and we need a pointer to connect them. It is not possible to use ordinary pointers for this. So we use void pointer. Void pointer is capable of storing pointer to any type of data (eg., integer or character) as it is a generic pointer type.
  56. A Heap is an almost complete binary tree. In this

    tree, if the maximum level is i, then, upto the (i-1)th level should be complete. At level i, the number of nodes can be less than or equal to 2^i. If the number of nodes is less than 2^i, then the nodes in that level should be completely filled, only from left to right The property of an ascending heap is that, the root is the lowest and given any other node i, that node should be less than its left child and its right child. In a descending heap, the root should be the highest and given any other node i, that node should be greater than its left child and right child.
  57. To sort the elements, one should create the heap first.

    Once the heap is created, the root has the highest value. Now we need to sort the elements in ascending order. The root can not be exchanged with the nth element so that the item in the nth position is sorted. Now, sort the remaining (n-1) elements. This can be achieved by reconstructing the heap for (n-1) elements.
  58. heapsort() { n = array(); // Convert the tree into

    an array. makeheap(n); // Construct the initial heap. for(i=n; i>=2; i--) { swap(s[1],s[i]); heapsize--; keepheap(i); } } makeheap(n) { heapsize=n; for(i=n/2; i>=1; i--) keepheap(i); } keepheap(i) { l = 2*i; r = 2*i + 1; p = s[l]; q = s[r]; t = s[i];
  59. if(l<=heapsize && p->value > t->value) largest = l; else largest

    = i; m = s[largest]; if(r<=heapsize && q->value > m->value) largest = r; if(largest != i) { swap(s[i], s[largest]); keepheap(largest); } }
  60. Implement the bubble sort algorithm. How can it be improved?

    Write the code for selection sort, quick sort, insertion sort.
  61. Bubble sort algorithm void bubble_sort(int a[], int n) { int

    i, j, temp; for(j = 1; j < n; j++) { for(i = 0; i < (n - j); i++) { if(a[i] >= a[i + 1]) { //Swap a[i], a[i+1] } } } }
  62. void bubble_sort(int a[], int n) { int i, j, temp;

    int flag; for(j = 1; j < n; j++) { flag = 0; for(i = 0; i < (n - j); i++) { if(a[i] >= a[i + 1]) { //Swap a[i], a[i+1] flag = 1; } } if(flag==0)break; } } To improvise this basic algorithm, keep track of whether a particular pass results in any swap or not. If not, you can break out without wasting more cycles.
  63. Selection Sort Algorithm void selection_sort(int a[], int n) { int

    i, j, small, pos, temp; for(i = 0; i < (n - 1); i++) { small = a[i]; pos = i; for(j = i + 1; j < n; j++) { if(a[j] < small) { small = a[j]; pos = j; } } temp = a[pos]; a[pos] = a[i]; a[i] = temp; } }
  64. Quick Sort Algorithm int partition(int a[], int low, int high)

    { int i, j, temp, key; key = a[low]; i = low + 1; j = high; while(1) { while(i < high && key >= a[i])i++; while(key < a[j])j--; if(i < j) { temp = a[i]; a[i] = a[j]; a[j] = temp; } else { temp = a[low]; a[low] = a[j]; a[j] = temp; return(j); } } }
  65. void quicksort(int a[], int low, int high) { int j;

    if(low < high) { j = partition(a, low, high); quicksort(a, low, j - 1); quicksort(a, j + 1, high); } } int main() { // Populate the array a quicksort(a, 0, n - 1); }
  66. Insertion Sort Algorithm void insertion_sort(int a[], int n) { int

    i, j, item; for(i = 0; i < n; i++) { item = a[i]; j = i - 1; while(j >=0 && item < a[j]) { a[j + 1] = a[j]; j--; } a[j + 1] = item; } }