Skip to content

Instantly share code, notes, and snippets.

@mylons
Created November 1, 2011 14:53
Show Gist options
  • Save mylons/1330690 to your computer and use it in GitHub Desktop.
Save mylons/1330690 to your computer and use it in GitHub Desktop.
combines ranges assuming a sorted array by start position
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int start;
int end;
} range_t;
range_t* band(range_t* ranges, int num_ranges) {
range_t* bands = NULL;
range_t* bands_ptr = NULL;
range_t* cur = ranges;
int start = -1;
int end = -1;
int make_band = 0;
int make_band = 0;
int counter = 0;
//init bands
bands = (range_t*)malloc(num_ranges * sizeof(range_t));
bands_ptr = bands;
bands_ptr++;
while (counter < num_ranges) {
if (start == -1) {
start = cur->start;
end = cur->end;.
}
else if ( (cur->start < start) && (cur->end > start) ) {
start = cur->start;
if (cur->end > end) {
end = cur->end;
}
make_band = 0;
}
else if ( (cur->end > end ) && ( cur->start < end ) ) {
end = cur->end;
if (cur->start < start) {
start = cur->start;
}
make_band = 0;
}
else if( ( cur->start > start ) && ( cur->end < end ) ) {
make_band = 0;
}
else {
make_band = 1;
}
if (make_band) {
bands_ptr->start = start;
bands_ptr->end = end;
bands_ptr++;//advance pointer
//reset start and end
start = cur->start;
end = cur->end;
}
cur++;
counter++;
}
return bands;
}
void print_ranges(range_t* ranges) {
range_t* blah = ranges;
int i = 0;
for(i = 0; i < 7; i++, blah++) {
printf("range start:%d end:%d\n", blah->start, blah->end);
}
}
range_t* make_ranges() {
range_t* ranges = (range_t*)malloc(7 * sizeof(range_t));
ranges[0].start = 0;
ranges[0].end = 50;
ranges[1].start = 15;
ranges[1].end = 75;
ranges[2].start = 100;
ranges[2].end = 300;
ranges[3].start = 125;
ranges[3].end = 250;
ranges[4].start = 175;
ranges[4].end = 200;
ranges[5].start = 325;
ranges[5].end = 400;
ranges[6].start = 330;
ranges[6].end = 400;
print_ranges(ranges);
return ranges;
}
int main(int argc, char* argv[]) {
range_t* ranges = NULL;
range_t* bands = NULL;
range_t* cur = NULL;
int i = 0;
ranges = make_ranges();
bands = band(ranges, 7);
cur = bands;
while(i < 7) {
if (cur){
printf("%d start: %d end: %d\n", i, cur->start, cur->end);
}
cur++;
i++;
}
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment