views:

151

answers:

2
typedef struct child {int count; char word[100]; inner_list*next;} child;
typedef struct parent
{ char data [100];
child * head;
int count;
parent * next; } parent;

void append(child **q,char num[100],int size)
{   child *temp,*r,*temp2,*temp3;
parent *out=NULL;
  temp = *q;
  temp2 = *q;
  temp3 = *q;
  char *str;
  if(*q==NULL)
  {   temp = (child *)malloc(sizeof(child));
    strcpy(temp->word,num);
    temp->count =size;
    temp->next=NULL;
    *q=temp;
  }
  else
  {  temp = *q;
   while(temp->next !=NULL)
   {  temp=temp->next;
   }
   r = (child *)malloc(sizeof(child));
   strcpy(r->word,num);
   r->count = size;
   r->next=NULL;
   temp->next=r;
  }

}

This is my append function which I use for adding an element to my child list. But my problem is it only should append unique values which are followed by a string. Which means :

Inputs :  aaa bbb aaa ccc aaa bbb ccc aaa

Append should act :

For aaa string there  should be a list like bbb->ccc(Not bbb->ccc->bbb since bbb is already there if bbb is coming more than one time it should be increase count only.)
For bbb string there should be list like aaa->ccc only
For ccc string there should be list like aaa only

I hope i could make myself clear. Is there any ideas? Please ask for further info.

What i've tried is checking the previous elements entered with the new element. I kinda failed it.

int search(child *p)
{
    child *temp= (child *)malloc(sizeof(child));
    int var =0;
char num[100];
temp = p;
strcpy(num,p->word);
while(temp->next!=NULL)
    {

    if(strcmp(temp->word,num)==0)
    var =1;
    temp=temp->next;
    }
return var;
}

This is what i've tried so far. With this search function i would control if the element is here or not. But it failed.

+1  A: 

If I understand correctly, given the inputs

aaa bbb aaa ccc aaa bbb ccc aaa

You want the parent list to have 3 elements - a child list for aaa, one for bbb and one for ccc.

The list for aaa should contain all strings that followed aaa in the original input, which here is just bbb and ccc. It should only contain them once each, with the count variable in the corresponding nodes incremented so that bbb's count is 2 and ccc's count is 1.

Is this correct? If it is, read on.

for every string S in your input
{
   if S is not associated with a child list in the parent
   {
      create a new child list associated with S at the end of the parent list
   }

   // now we have C, the child list we either found above or created
   if there is a string S' after S
   {
      find the element S' in the child list C by iterating through it
      if you don't find the element S', create/append it with count = 1
      else when you find the element, increment its count
   }
}

I think this should get you where you want to go.

Phil
you totally get this right. I will try to code this now.
LuckySlevin
Glad I could help! Another pointer - use `strncpy` instead of `strcpy` in your code, to protect against overflow.
Phil
I also thank you for not judging and helping me out by giving the idea.
LuckySlevin
A: 

You need to add another conditional to your while loop:

while(temp->next !=NULL)

Basically just extend it to compare the value at the current iteration with your input value. If the two are equal then just return from append.

Justin Ethier