can't free() and program terminate.
Code:
#include <stdio.h>
#include <stdlib.h>
#define min_range 0
#define max_range 20
typedef struct {
int k;
int s;
int f;
}sfType;
void exchangeSF(sfType *sf1, sfType *sf2)
{
sfType t = *sf1;
*sf1 = *sf2;
*sf2 = t;
}
void quicksort(sfType *sf, int p, int r)
{
int q;
if (p < r) {
q = partition(sf, p, r);
quicksort(sf, p, q-1);
quicksort(sf, q+1, r);
}
}
int partition(sfType *sf, int p, int r)
{
int i, j;
i = p-1;
for (j = p; j < r; j++) {
if (sf[j].f <=sf[r].f) {
i++;
exchangeSF(&sf[i], &sf[j]);
}
}
i++;
exchangeSF(&sf[i], &sf[r]);
return i;
}
void generation(sfType *sf, int n)
{
FILE *fData;
int i;
srand(time(NULL));
for (i = 0; i < n; i++) {
sf[i].k = i;
sf[i].s = rand()%(max_range-min_range)+min_range;
sf[i].f = rand()%(max_range-sf[i].s)+(sf[i].s+1);
}
fData = fopen("activity-selection.dat", "wt");
fprintf(fData, "%d\n", n);
for (i = 0; i < n; i++) {
if (i % 10 == 0) fprintf(fData, "\n");
fprintf(fData, "%d ", sf[i].s);
}
fprintf(fData, "\n");
for (i = 0; i < n; i++) {
if (i % 10 == 0) fprintf(fData, "\n");
fprintf(fData, "%d ", sf[i].f);
}
fclose(fData);
}
void RecursiveActivitySelector(sfType *sf, int *index, int *w, int i, int j)
{
int m;
m = i+1;
while ((m < j) && (sf[m].s < sf[i].f))
m++;
if (m < j) {
index[*(w++)] = sf[m].k;
RecursiveActivitySelector(sf, index, w, m, j);
}
}
void GreedyActivitySelector(sfType *sf, int *index, int *w, int n)
{
int i, j;
i = 0;
*w = 1;
index[0] = sf[0].k;
for (j = 1; j < n; j++)
if (sf[j].s > sf[i].f) {
index[*(w++)] = sf[j].k;
i = j;
}
}
void outputData(sfType *sf, int *indexR, int *indexG, int r, int g, int n)
{
FILE *fData;
int i;
fData = fopen("ActivitySelection.out", "wt");
fprintf(fData, "Using Dynamic Programming:\n");
for (i = 0; i <= r; i++) {
fprintf(fData, "%d ", sf[indexR[i]].s);
if (i % 10 == 0) fprintf(fData, "\n");
}
for (i = 0; i <= r; i++) {
fprintf(fData, "%d ", sf[indexR[i]].f);
if (i % 10 == 0) fprintf(fData, "\n");
}
fprintf(fData, "\nUsing Greedy Alogrithm:\n");
for (i = 0; i <= g; i++) {
fprintf(fData, "%d ", sf[indexG[i]].s);
if (i % 10 == 0) fprintf(fData, "\n");
}
for (i = 0; i <= g; i++) {
fprintf(fData, "%d ", sf[indexG[i]].f);
if (i % 10 == 0) fprintf(fData, "\n");
}
fclose(fData);
}
int main()
{
int *indexR, *indexG;
int r, g, i, n;
sfType *sf;
printf("n = ");
scanf("%d", &n);
sf = malloc(n*sizeof(*sf));
indexR = malloc(n*sizeof(*indexR));
indexG = malloc(n*sizeof(*indexG));
for (i = 0; i < n; i++) {
indexR[i] = 0;
indexG[i] = 0;
}
generation(sf, n);
quicksort(sf, 0, n);
r = 0;
g = 0;
RecursiveActivitySelector(sf, indexR, &r, 0, n);
GreedyActivitySelector(sf, indexG, &g, n);
printf("asdfasd\n");
outputData(sf, indexR, indexG, r, g, n);
free(sf);
free(indexR);
free(indexG);
return 0;
}
Why was the program terminated at RecursiveActivitySelector(sf, indexR, &r, 0, n) and GreedyActivitySelector(sf, indexG, &g, n) ??? Sometime GCC said that "free(): invalid pointer 0x804a018!".