Подстрока связанного списка в c - PullRequest
1 голос
/ 25 февраля 2012

Написание программы, в которой мне нужно разбить строки из списка, связанного со структурой, на части и объединить их.Затем я вставляю новые строки обратно в связанный список.

структура, которую я использую для построения узлов, выглядит следующим образом:

typedef struct CANDIDATENODE
{
char sentence[TARGET_LEN+1];
int rank;
int score;
int goodFlag;
struct CANDIDATENODE *next;

} Candidate;

(TARGET_LEN - максимальная длина строки. Не включает нулевой терминатор, который является причиной +1in)

Я не сталкиваюсь с ошибками сегмента или ошибками шины, но после копирования третьего символа в следующий раз через мои строковые массивы будут добавлены символы, которые не принадлежат.ранее в программе я заполнял 20 узлов в связанном списке случайными символами.Именно из этого списка узлов я передаю указатель кандидата

ClearPointer ниже указывает на конец связанного списка, в который я буду добавлять новые предложения.

Вот метод задачи в полном объеме.

void breedSentences(Candidate *can1)
{

Candidate *can2 = can1->next;

char childOne[TARGET_LEN+1];
char childTwo[TARGET_LEN+1];

memset(childOne, '\0', sizeof(TARGET_LEN+1));
memset(childTwo, '\0', sizeof(TARGET_LEN+1));


printf("parent1:%s;\n", can1->sentence);
printf("parent2:%s;\n", can2->sentence);

int pivot1  = random() %TARGET_LEN-1;
int pivot2  = random() %TARGET_LEN-1;

printf("pivot1= %d\n", pivot1); 
printf("pivot2= %d\n", pivot2);     

int i;
for (i =0; i<TARGET_LEN-1; i++) 
{
    if (i<pivot1)
    {
        childOne[i]= can1->sentence[i];
    }
    else
    {
        childOne[i]= can2->sentence[i];
    }


    if (i<pivot2)
    {
        childTwo[i]= can1->sentence[i];
    }
    else
    {
        childTwo[i]= can2->sentence[i];
    }

    childOne[TARGET_LEN]= '\0';
    childTwo[TARGET_LEN]= '\0';

    printf("First:%c\n", can1->sentence[i]);
    printf("Second:%c\n", can2->sentence[i]);

    printf("1:%s\n", childOne);
    printf("2:%s\n", childTwo);

}





printf("%s\n", childOne);
printf("%s\n", childTwo);


strcpy(clearPointer->sentence, childOne);
clearPointer = clearPointer->next;

strcpy(clearPointer->sentence, childTwo);   
clearPointer = clearPointer->next->next; 



}

Ответы [ 2 ]

0 голосов
/ 25 февраля 2012

Комментарий Виз под моим вопросом привел меня к ответу. слишком малое выделенное пространство привело к неожиданному поведению программы.

0 голосов
/ 25 февраля 2012

Как общий набор предложений:

  1. Убедитесь, что ваша программа компилируется без ошибок, даже если вы установили для компилятора максимально возможные уровни предупреждений.Вы не упомянули, на какой платформе вы работаете, но если вы используете gcc, перейдите к -Werror -Wall и т. Д.
  2. Убедитесь, что ваш код сохранил Valgrind или его эквивалент.* Если вам это не поможет, попробуйте аккуратно пошагово пройти по той части кода, где все идет не так, с помощью отладчика.GDB (если вы используете это, вы не сказали, на какой платформе вы находитесь), позволяет вам написать кучу подобных вещей - ценный инструмент, который есть в вашем наборе.
...