Добавление уникальных значений только в связанный список в C - PullRequest
0 голосов
/ 15 мая 2010
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;
  }

}

Это моя функция добавления, которую я использую для добавления элемента в мой дочерний список. Но моя проблема в том, что он должен добавлять уникальные значения, за которыми следует строка. Что означает:

Inputs :  aaa bbb aaa ccc aaa bbb ccc aaa

Приложение должно действовать:

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

Я надеюсь, что смогу прояснить это. Есть какие-нибудь идеи? Пожалуйста, запросите дополнительную информацию.

Я попробовал проверить предыдущие элементы, введенные с новым элементом. Я как бы провалил это.

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;
}

Это то, что я пробовал до сих пор. С помощью этой функции поиска я бы контролировал, находится ли элемент здесь или нет. Но это не удалось.

Ответы [ 2 ]

1 голос
/ 15 мая 2010

Если я правильно понимаю, учитывая входные данные

aaa bbb aaa ccc aaa bbb ccc aaa

Вы хотите, чтобы родительский список имел 3 элемента - дочерний список для aaa, один для bbb и один для ccc.

Список для aaa должен содержать все строки, которые следовали за aaa в исходном вводе, который здесь просто bbb и ccc. Он должен содержать их только по одному разу, при этом переменная count в соответствующих узлах увеличивается, так что счетчик bbb равен 2, а счетчик ccc равен 1.

Это правильно? Если это так, читайте дальше.

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
   }
}

Я думаю, это должно привести вас туда, куда вы хотите.

0 голосов
/ 15 мая 2010

Вам нужно добавить еще одно условие в ваш цикл while:

while(temp->next !=NULL)

По сути, просто расширьте его, чтобы сравнить значение на текущей итерации с вашим входным значением. Если они равны, просто вернитесь из append.

...