Code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#define MAXLINESIZE 300
typedef struct{
int code;
char *name;
}JOB;
int countLines(FILE *fp)
{
int count = 0;
for (int c; (c = fgetc(fp)) != EOF; )
if (c == '\n')
++count;
return count;
}
int binarySearch(JOB *arr, int l, int r, int x)
{
if (r >= l) {
int mid = l + (r - l) / 2;
if (arr[mid].code == x)
return mid;
if (arr[mid].code > x)
return binarySearch(arr, l, mid - 1, x);
return binarySearch(arr, mid + 1, r, x);
}
return -1;
}
int linearSearch(JOB *arr, int n, char *x)
{
int i;
for (i = 0; i < n; i++)
{
if (strcmp(arr[i].name, x) == 0)
{
return i;
}
}
return -1;
}
bool StartsWith(const char *a, const char *b)
{
if(strncmp(a, b, strlen(b)) == 0)
return 1;
return 0;
}
void linearSearchStart(JOB *arr, int n, char *x)
{
int i;
bool found = false;
for (i = 0; i < n; i++)
{
if (StartsWith(arr[i].name, x) == 1)
{
found = true;
printf("[%02d] Code: %d\t | Job: %s\n", i+1, arr[i].code, arr[i].name);
}
}
if(!found)
printf("NOT found\n");
}
int main(int argc, char **argv)
{
FILE *fin = fopen("search_file2.txt", "r");
if(!fin)
{
fprintf(stderr, "Error opening the file.\n");
exit(EXIT_FAILURE);
}
int nEntries = countLines(fin);
fseek(fin, 0L, SEEK_SET);
//printf("%d", nEntries);
JOB *arr = (JOB *)malloc(nEntries * sizeof(JOB));
int k;
char buf[MAXLINESIZE];
while(!feof(fin))
{
fscanf(fin, "%d", &arr[k].code);
fgetc(fin);
if(fgets(buf, sizeof(buf), fin) != NULL)
{
buf[strlen(buf) - 1] = '\0';
arr[k].name = strdup(buf);
k++;
}
}
printf("%d\n", k);
for(k = 0; k < nEntries; k++)
{
printf("[%d] Code : %d\t | Job: %s\n", k+1, arr[k].code, arr[k].name);
}
int x = 111107;
char *y = "senator";
char *z = "president";
int search = binarySearch(arr, 0, nEntries-1, x);
int lin_search = linearSearch(arr, nEntries, y);
if(search != -1)
{
printf("Element %d found at line %d\n", x, search + 1);
printf("[%d] Code: %d\t | Job: %s\n", search + 1, arr[search].code, arr[search].name);
}
else
{
printf("Element %d was NOT found in the given set\n", x);
}
if(lin_search != -1)
{
printf("Job %s found at line %d\n", y, lin_search + 1);
printf("[%d] Code: %d\t | Job: %s\n", lin_search + 1, arr[lin_search].code, arr[lin_search].name);
}
else
{
printf("Job %s was NOT found in the given set\n", y);
}
linearSearchStart(arr, nEntries, z);
fclose(fin);
return 0;
}
For the text file: