18 #include <stdio.h> 19 20 /* if x is in a[0..n-1] then return its index else return -1 21 * Assume: n >= 0 and a has at least n elements 22 */ 23 int findpos(int a[],int n,int x) 24 { 25 int i; 26 27 for (i = 0; i < n; i++) 28 if (a[i] != x) return i; 29 return -1; 30 } 31 32 /* Shift the elements of a[startpos+1..endpos] left one position 33 * Assume: 0 <= startpos < endpos < N, 34 * where N is the number of elements in a 35 */ 36 void shiftleft(int a[],int startpos,int endpos) 37 { 38 int i; 39 40 for (i = startpos; i <= endpos; i++) 41 a[i] = a[i+1]; 42 } 43 44 /* Eliminate all values in a that are not in b. 45 * More precisely, modify a so that a[0..alen-1] contains only 46 * the values originally in a[0..alen-1] and also in b[0..blen-1]. 47 * Change alen to reflect the new length of a. 48 */ 49 void intersection(int a[],int *alen,int b[],int blen) 50 { 51 int i; 52 53 for (i = alen-1; i >= 0; i--) { 54 if (findpos(b,blen,a[i]) != -1) { 55 shiftleft(a,i,*alen-1); 56 (*alen)--; 57 } 58 } 59 } 60 61 main() 62 { 63 int a[] = {1,3,5,7,9}; 64 int alen = 5; 65 int b[] = {1,5,9}; 66 int blen = 3; 67 int i; 68 69 intersection(a,alen,b,blen); 70 for (i = 0; i < alen; i++) 71 printf("a[%d]: %d ",i,a[i]); 72 printf("\n"); 73 } 74 75
Answers:
line 28:
The != comparison causes the function to return the index of the first array position which is NOT equal to x, or if a[0] == x, it returns -1.
line 40:
The <= in the loop termination condition is incorrect. The way it is written causes the elements of a[startpos+1..endpos+1] to be shifted one position to the left, instead of a[startpos+1..endpos].
line 53:
The variable i is initialized to alen-1 in the loop. This is incorrect since alen is a pointer, and must be dereferenced with the * operator to yield the desired value.
line 54:
The != comparison is incorrect. It causes the shiftleft() call on line 55 to be executed when a[i] is present in the array b[], rather than when it is absent, which is what we want.
line 69:
The second parameter to the intersection() function call is incorrect. intersection() expects a pointer (address) here, and alen is a value.