#include #include #include struct link { char *a; char *b; int count; }; struct link **get_links(char ***data) { int i,j,k=0; for(i=0;data[i];i++) { for(j=0;data[i][j];j++) { k++;//this is overkill because I can't remove dedups that won't need //new space allocated. } } struct link **link=calloc(k+1,sizeof(struct link *)); for(i=0;data[i];i++) { for(j=0;data[i][j+1];j++) { for(k=0;link[k];k++) { if(!strcmp(link[k]->a,data[i][j]) && !strcmp(link[k]->b,data[i][j+1]) || !strcmp(link[k]->b,data[i][j]) && !strcmp(link[k]->a,data[i][j+1])) { break; } } if(!link[k]) { link[k]=malloc(sizeof(struct link)); link[k]->a=strdup(data[i][j]); link[k]->b=strdup(data[i][j+1]); link[k]->count=1; } else { link[k]->count++; } } } return link; } char *recurse_readline(int chars); char **recurse_readfile(int lines) { char **malloced; char *line=recurse_readline(0); if(feof(stdin)) { malloced=malloc(sizeof(char *) * (lines+1)); malloced[lines]=0; return malloced; } malloced=recurse_readfile(lines+1); malloced[lines]=line; return malloced; } char *recurse_readline(int chars) { char *malloced; short in=fgetc(stdin); if(in == '\n' || in == -1) { malloced=malloc(chars+2); malloced[chars]='\n'; malloced[chars+1]=0; return malloced; } malloced=recurse_readline(chars+1); malloced[chars]=in; return malloced; } char ***lines_to_data(char **lines) { char ***data; int i,j,k,n,m; for(i=0;lines[i];i++); data=malloc(sizeof(char **) * i+1); data[i]=0; for(i=0;lines[i];i++) { k=0; for(j=0;lines[i][j];j++) { if(lines[i][j]==' ' || lines[i][j] == '\n' || lines[i][j] == '\0') k++; } data[i]=malloc(sizeof(char *) * k+1); data[i+1]=0; data[i][k]=0; } for(i=0;lines[i];i++) { k=0; n=0; for(j=0;lines[i][j];j++) { if(lines[i][j]==' ' || lines[i][j]=='\n' || lines[i][j]=='\0') { data[i][n]=strndup(lines[i]+k,j-k); data[i][n][j-k]=0; n++; k=j+1; } } } return data; } int main() { int i,j; char **lines; char ***data; struct link **link; lines=recurse_readfile(0); /* for(i=0;lines[i];i++) { printf("lines[%d]=\"%s\"\n",i,lines[i]); }*/ data=lines_to_data(lines); /* for(i=0;data[i];i++) { for(j=0;data[i][j];j++) { printf("data[%d][%d]='%s'\n",i,j,data[i][j]); } printf("\n"); } */ link=get_links(data); //printf("//graph generated by paths-to-edges to DOT format\n"); //printf("graph anonet {\n"); for(i=0;link[i];i++) { //printf("%s -> %s (%d)\n",link[i]->a,link[i]->b,link[i]->count); //printf("%s -- %s;\n",link[i]->a,link[i]->b,link[i]->count); printf("%s %s\n",link[i]->a,link[i]->b); } //printf("}\n"); return 0; }