#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>
//-------------------------------------------------------------------------------------
// CONSTANTS and TYPES
//-------------------------------------------------------------------------------------
struct NODE
{
char *data;
struct NODE *link;
};
typedef enum BOOL { false, true } Boolean;
typedef struct NODE Node;
//-------------------------------------------------------------------------------------
// VARIABLES
//-------------------------------------------------------------------------------------
Node *head = NULL;
int size = 0;
int traversal = 0;
//-------------------------------------------------------------------------------------
// PROTOTYPES
//-------------------------------------------------------------------------------------
// add an element to the beginning of the linked list
Boolean insert( char *new_string );
// empty the list so that we clear all memory and can start a fresh list
void clearList();
// tells us whether or not the given string is in the list
Boolean search( char *target );
// starts a list traversal by getting the data at top
char * firstItem();
// gets the data at the current traversal node and increments the traversal
char * nextItem();
//-------------------------------------------------------------------------------------
// FUNCTIONS
//-------------------------------------------------------------------------------------
void validateNode( Node *node )
{
}
Boolean insert( char *new_string )
{
Node *new;
Boolean isInserted = false;
new
= ( Node
* )malloc( sizeof(Node
) );
//if( head == NULL)
// head = ( Node* )malloc( sizeof( Node ) );
new->data = new_string;
//printf("%s\n", new->data);
new->link = head;
validateNode( new );
head = new;
validateNode( head );
size++;
isInserted = true;
//printf("%s\n", head->data);
return isInserted;
}//insert
void clearList()
{
Node
*curr
= ( Node
* )malloc( sizeof( Node
) );
Node
*next
= ( Node
* )malloc( sizeof( Node
) );
curr = head;
validateNode(curr);
while ( curr != NULL )
{
next = curr->link;
curr = next;
}
size = 0;
}//clearList
Boolean search( char *target )
{
Boolean isFound = false;
Node
*curr
= ( Node
* )malloc( sizeof( Node
) );
curr = head;
if( head != NULL )
//printf("%d ", strcmp( curr->data, target ) );
//validateNode( curr );
while ( curr
!= NULL
&& strcmp( curr
->data
, target
) != 0 ) {
curr = curr->link;
}
if ( curr != NULL)
{
validateNode( curr );
if ( strcmp( curr
->data
, target
) != 0 ) {
isFound = true;
//printf("%s ", curr->data);
}
}
return isFound;
}
char * firstItem()
{
char * temp = NULL;
//printf("\n1\n");
validateNode( head );
if ( head != NULL )
temp = head->data;
//printf("%s", temp);
return temp;
}
char * nextItem()
{
char* temp = NULL;
Node
* curr
= ( Node
* )malloc( sizeof( Node
) ); curr = head;
//int i = 0;
if ( traversal < size )
{
for( int i = 0; i < traversal && curr != NULL; i++ )
{
curr = curr->link;
}
temp = curr->data;
traversal++;
}
return temp;
}
// read from standard input, tokenize and insert words into a linked list
// note that we must ensure that there are no duplicates in our list
void loadFile()
{
#define LINE_SIZE 256
char input[LINE_SIZE];
char *token = NULL;
//printf("3");
while ( fgets( input
, LINE_SIZE
, stdin
) ) {//printf("1");
// parse the data into separate elements
token
= strtok( input
, " \t\n" ); while ( token )
{ //printf("2");
if ( !search( token ) ){
insert( token );
}
token
= strtok( NULL
, " \t\n" ); }
}
}
// print the contents of the linked list to standard output
void printConcordance()
{
char *theWord = firstItem();
while ( theWord )
{
// printf( "%s\n", theWord );
theWord = nextItem();
}
}
void print()
{
Node *curr;
curr
= ( Node
* )malloc( sizeof( Node
) ); curr = head;
validateNode( curr );
while( curr )
{
// printf("%s\n", curr->data );
curr = curr->link;
}
}
int main( int argc, char *argv[] )
{
//printf("%s\n", head->data);
loadFile();
//printf("%s\n", head->data);
//printConcordance();
print();
clearList();
return EXIT_SUCCESS;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8YXNzZXJ0Lmg+CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gQ09OU1RBTlRTIGFuZCBUWVBFUwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCgoKc3RydWN0IE5PREUKewoJY2hhciAqZGF0YTsKCXN0cnVjdCBOT0RFICpsaW5rOwp9OwoKdHlwZWRlZiBlbnVtIEJPT0wgeyBmYWxzZSwgdHJ1ZSB9IEJvb2xlYW47CnR5cGVkZWYgc3RydWN0IE5PREUgTm9kZTsKCgoKCgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gVkFSSUFCTEVTCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKCU5vZGUgKmhlYWQgPSBOVUxMOwoJaW50IHNpemUgPSAwOwoJaW50IHRyYXZlcnNhbCA9IDA7Ci8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBQUk9UT1RZUEVTCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKLy8gYWRkIGFuIGVsZW1lbnQgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGlua2VkIGxpc3QKQm9vbGVhbiBpbnNlcnQoIGNoYXIgKm5ld19zdHJpbmcgKTsKLy8gZW1wdHkgdGhlIGxpc3Qgc28gdGhhdCB3ZSBjbGVhciBhbGwgbWVtb3J5IGFuZCBjYW4gc3RhcnQgYSBmcmVzaCBsaXN0CnZvaWQgY2xlYXJMaXN0KCk7Ci8vIHRlbGxzIHVzIHdoZXRoZXIgb3Igbm90IHRoZSBnaXZlbiBzdHJpbmcgaXMgaW4gdGhlIGxpc3QKQm9vbGVhbiBzZWFyY2goIGNoYXIgKnRhcmdldCApOwovLyBzdGFydHMgYSBsaXN0IHRyYXZlcnNhbCBieSBnZXR0aW5nIHRoZSBkYXRhIGF0IHRvcApjaGFyICogZmlyc3RJdGVtKCk7Ci8vIGdldHMgdGhlIGRhdGEgYXQgdGhlIGN1cnJlbnQgdHJhdmVyc2FsIG5vZGUgYW5kIGluY3JlbWVudHMgdGhlIHRyYXZlcnNhbApjaGFyICogbmV4dEl0ZW0oKTsKCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBGVU5DVElPTlMKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgl2b2lkIHZhbGlkYXRlTm9kZSggTm9kZSAqbm9kZSApCgl7CgkJYXNzZXJ0KCBub2RlICE9IE5VTEwgKTsKCQlhc3NlcnQoIG5vZGUtPmRhdGEgIT0gTlVMTCk7CQoJfQoKQm9vbGVhbiBpbnNlcnQoIGNoYXIgKm5ld19zdHJpbmcgKQp7CglOb2RlICpuZXc7CglCb29sZWFuIGlzSW5zZXJ0ZWQgPSBmYWxzZTsKCgluZXcgPSAoIE5vZGUqICltYWxsb2MoIHNpemVvZihOb2RlKSApOwoJYXNzZXJ0ICggbmV3ICE9IE5VTEwgKTsKCQoJYXNzZXJ0KCBuZXdfc3RyaW5nICE9IE5VTEwgKTsKCQoJLy9pZiggaGVhZCA9PSBOVUxMKQoJLy8JaGVhZCA9ICggTm9kZSogKW1hbGxvYyggc2l6ZW9mKCBOb2RlICkgKTsKCQluZXctPmRhdGEgPSAoIGNoYXIqICltYWxsb2MoIHN0cmxlbiggbmV3X3N0cmluZyApICk7CgkJbmV3LT5kYXRhID0gbmV3X3N0cmluZzsKCQkvL3ByaW50ZigiJXNcbiIsIG5ldy0+ZGF0YSk7CgkJYXNzZXJ0KCBzdHJjbXAoIG5ldy0+ZGF0YSwgbmV3X3N0cmluZykgPT0gMCApOwoJCQoJCW5ldy0+bGluayA9IGhlYWQ7CgkJdmFsaWRhdGVOb2RlKCBuZXcgKTsKCQkKCQloZWFkID0gbmV3OwoJCXZhbGlkYXRlTm9kZSggaGVhZCApOwoJCQoJCXNpemUrKzsKCQkKCQlpc0luc2VydGVkID0gdHJ1ZTsKCS8vcHJpbnRmKCIlc1xuIiwgaGVhZC0+ZGF0YSk7CgkKCXJldHVybiBpc0luc2VydGVkOwoKfS8vaW5zZXJ0Cgp2b2lkIGNsZWFyTGlzdCgpCnsKCU5vZGUgKmN1cnIgPSAoIE5vZGUqICltYWxsb2MoIHNpemVvZiggTm9kZSApICk7Cglhc3NlcnQgKCBjdXJyICE9IE5VTEwgKTsKCQoJTm9kZSAqbmV4dCA9ICggTm9kZSogKW1hbGxvYyggc2l6ZW9mKCBOb2RlICkgKTsKCWFzc2VydCAoIG5leHQgIT0gTlVMTCApOwoJCgljdXJyID0gaGVhZDsKCXZhbGlkYXRlTm9kZShjdXJyKTsKCgl3aGlsZSAoIGN1cnIgIT0gTlVMTCApCgkJewoJCQluZXh0ID0gY3Vyci0+bGluazsKCQkJZnJlZShjdXJyKTsKCQkJY3VyciA9IG5leHQ7CgkJfQoJCXNpemUgPSAwOwp9Ly9jbGVhckxpc3QKCkJvb2xlYW4gc2VhcmNoKCBjaGFyICp0YXJnZXQgKQp7CgoJQm9vbGVhbiBpc0ZvdW5kID0gZmFsc2U7CglOb2RlICpjdXJyID0gKCBOb2RlKiApbWFsbG9jKCBzaXplb2YoIE5vZGUgKSApOwoJYXNzZXJ0ICggY3VyciAhPSBOVUxMICk7CgkKCWN1cnIgPSBoZWFkOwoJaWYoIGhlYWQgIT0gTlVMTCApCgkvL3ByaW50ZigiJWQgIiwgc3RyY21wKCBjdXJyLT5kYXRhLCB0YXJnZXQgKSApOwoJLy92YWxpZGF0ZU5vZGUoIGN1cnIgKTsKCQoJd2hpbGUgKCBjdXJyICE9IE5VTEwgJiYgc3RyY21wKCBjdXJyLT5kYXRhLCB0YXJnZXQgKSAhPSAwICkKCQl7CgkJCWN1cnIgPSBjdXJyLT5saW5rOwoJCX0KCQoJaWYgKCBjdXJyICE9IE5VTEwpCgl7CgkJdmFsaWRhdGVOb2RlKCBjdXJyICk7CgkJaWYgKCBzdHJjbXAoIGN1cnItPmRhdGEsIHRhcmdldCApICE9IDAgKQoJCXsKCQkJaXNGb3VuZCA9IHRydWU7CgkJCS8vcHJpbnRmKCIlcyAgICIsIGN1cnItPmRhdGEpOwoJCX0KCX0KCQoJcmV0dXJuIGlzRm91bmQ7Cn0KCmNoYXIgKiBmaXJzdEl0ZW0oKQp7CgljaGFyICogdGVtcCA9IE5VTEw7CgkvL3ByaW50ZigiXG4xXG4iKTsKCXZhbGlkYXRlTm9kZSggaGVhZCApOwoJCglpZiAoIGhlYWQgIT0gTlVMTCApCgkJdGVtcCA9IGhlYWQtPmRhdGE7CgkvL3ByaW50ZigiJXMiLCB0ZW1wKTsKCQkKCXJldHVybiB0ZW1wOwp9CgpjaGFyICogbmV4dEl0ZW0oKQp7CgljaGFyKiB0ZW1wID0gTlVMTDsKCU5vZGUqIGN1cnIgPSAoIE5vZGUqICltYWxsb2MoIHNpemVvZiggTm9kZSApICk7Cglhc3NlcnQgKCBjdXJyICE9IE5VTEwgKTsKCWN1cnIgPSBoZWFkOwoJLy9pbnQgaSA9IDA7CglpZiAoIHRyYXZlcnNhbCA8IHNpemUgKQoJewoJCWZvciggaW50IGkgPSAwOyBpIDwgdHJhdmVyc2FsICYmIGN1cnIgIT0gTlVMTDsgaSsrICkKCQkJewoJCQkJY3VyciA9IGN1cnItPmxpbms7CgkJCX0KCgkJdGVtcCA9IGN1cnItPmRhdGE7CgkJdHJhdmVyc2FsKys7Cgl9CgoJcmV0dXJuIHRlbXA7Cn0KLy8gcmVhZCBmcm9tIHN0YW5kYXJkIGlucHV0LCB0b2tlbml6ZSBhbmQgaW5zZXJ0IHdvcmRzIGludG8gYSBsaW5rZWQgbGlzdAovLyBub3RlIHRoYXQgd2UgbXVzdCBlbnN1cmUgdGhhdCB0aGVyZSBhcmUgbm8gZHVwbGljYXRlcyBpbiBvdXIgbGlzdAp2b2lkIGxvYWRGaWxlKCkKewojZGVmaW5lIExJTkVfU0laRSAyNTYKICBjaGFyIGlucHV0W0xJTkVfU0laRV07CiAgY2hhciAqdG9rZW4gPSBOVUxMOwovL3ByaW50ZigiMyIpOwogIHdoaWxlICggZmdldHMoIGlucHV0LCBMSU5FX1NJWkUsIHN0ZGluICkgKQogIHsvL3ByaW50ZigiMSIpOwogICAgLy8gcGFyc2UgdGhlIGRhdGEgaW50byBzZXBhcmF0ZSBlbGVtZW50cwogICAgdG9rZW4gPSBzdHJ0b2soIGlucHV0LCAiIFx0XG4iICk7CiAgICB3aGlsZSAoIHRva2VuICkKICAgIHsgLy9wcmludGYoIjIiKTsKICAgICAgaWYgKCAhc2VhcmNoKCB0b2tlbiApICl7CiAgICAgICAgaW5zZXJ0KCB0b2tlbiApOwoJCQoJCX0KCQkKICAgICAgdG9rZW4gPSBzdHJ0b2soIE5VTEwsICIgXHRcbiIgKTsKICAgIH0KICB9CiAgcHJpbnRmKCIlc1xuIiwgaGVhZC0+ZGF0YSk7Cn0KCi8vIHByaW50IHRoZSBjb250ZW50cyBvZiB0aGUgbGlua2VkIGxpc3QgdG8gc3RhbmRhcmQgb3V0cHV0CnZvaWQgcHJpbnRDb25jb3JkYW5jZSgpCnsKICBjaGFyICp0aGVXb3JkID0gZmlyc3RJdGVtKCk7CgogIHdoaWxlICggdGhlV29yZCApCiAgewogICAvLyBwcmludGYoICIlc1xuIiwgdGhlV29yZCApOwogICAgdGhlV29yZCA9IG5leHRJdGVtKCk7CiAgfQp9Cgp2b2lkIHByaW50KCkKewoJcHJpbnRmKCIlcyAgICV1XG4iLCBoZWFkLT5kYXRhLCBzdHJsZW4oaGVhZC0+ZGF0YSkpOwoJTm9kZSAqY3VycjsKCWN1cnIgPSAoIE5vZGUqICltYWxsb2MoIHNpemVvZiggTm9kZSApICk7CgljdXJyID0gaGVhZDsKCXZhbGlkYXRlTm9kZSggY3VyciApOwoJCgkKCXdoaWxlKCBjdXJyICkKCXsKCS8vCXByaW50ZigiJXNcbiIsIGN1cnItPmRhdGEgKTsKCQljdXJyID0gY3Vyci0+bGluazsKCX0KfQoKaW50IG1haW4oIGludCBhcmdjLCBjaGFyICphcmd2W10gKQp7CiAgLy9wcmludGYoIiVzXG4iLCBoZWFkLT5kYXRhKTsKICBsb2FkRmlsZSgpOwogIC8vcHJpbnRmKCIlc1xuIiwgaGVhZC0+ZGF0YSk7CiAgLy9wcmludENvbmNvcmRhbmNlKCk7CiAgcHJpbnQoKTsKICBjbGVhckxpc3QoKTsKCQogIHJldHVybiBFWElUX1NVQ0NFU1M7Cn0=