Попытка заменить слово, состоящее из узлов в связанном списке в C - PullRequest
0 голосов
/ 09 апреля 2019

Я пытаюсь найти списки узлов, которые образуют слово в связанном списке. Так что-то вроде: I->a->n-> ->i->s-> ->a->w-e>s->o->m->e->NULL. Цель состоит в том, чтобы заменить его чем-то вроде I->a->n-> ->i->s-> ->c->o->o->l->NULL. Мы хотим сделать это независимо от размера заменяемого слова или слова, заменяющего его.

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

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

Я сейчас пытаюсь манипулировать размером массива, чтобы увидеть, позволяет ли это мне пропустить слово.

void indexInsert(char character, int n){

    node* temp1 =(node*)malloc(sizeof(struct node));
    temp1->character = character;
    temp1->nextNode = NULL;
    if(n == 1){
        temp1->nextNode = headNode;
        headNode = temp1;
        return;
    }
    node* temp2 = headNode;
    for(int i = 0; i < n-2; i++){
        temp2 = temp2->nextNode;
    }

    temp1->nextNode = temp2->nextNode;
    temp2->nextNode = temp1;

}

void replaceWord(char replaceWord[]) {

    deleteWord(&headNode, replaceWord);

    int Size = 1;
    int Size2 = 2;
    char entryWord[Size];
    char entryWordCopy[Size2];

    printf("Please enter the new word you wish to insert: ");
    strcpy_s(entryWordCopy, Size2,gets_s(entryWord, Size));
    printf("\n");

    int length = strlen(entryWordCopy);

    indexInsert(entryWordCopy, length);

    Print(head);



}

Конечным результатом должно быть удаление узлов, образующих слово A, и последующая замена на узлы, образующие слово B. Однако при выполнении программы у меня возникают проблемы с массивами размеров, а строки не оцениваются. , Отчеты возвращаются: сбой был вызван чтением переменной за пределами ее времени жизни.

1 Ответ

0 голосов
/ 09 апреля 2019

Мой совет: Не используйте индексы со списками, вы можете сделать то же самое с указателями на узлы. Вам не нужно переходить к индексу, указатели на узлы быстрее.

Вы должны изменить алгоритмы, чтобы использовать указатели на узлы:

Нахождение последнего слова: Вы перебираете список, если вы находите узел, который является пробелом, вы сохраняете указатель на этот узел в переменной, если вы достигли конца списка, запоминаемый указатель на узел - это пробел перед последним словом , Вам просто нужно изменить следующие узлы. Если вы никогда не нашли узел, содержащий пробел, вы можете просто заменить весь список заменой.

Еще один прием - использовать двойные указатели, в которых хранится указатель на указатель, который указывает на узел последнего слова. (Это также может быть корнем списка)

// node** p is a pointer to the pointer of the first element
// if your root is defined as `node* root`, you use
// `... = last_word(&root);`
node** last_word(node** p) {
    node* n = *p;
    while(n) {
        if(n->data == ' ') p = &n->next;
        n = n->next;
    };
    return p;
};

Вставка узла:

Вы получили указатель из алгоритма, подобного last_word, который является указателем на указатель на узел. Он указывает на переменную, в которой хранится указатель на следующий узел (об этом есть видео с ComputerPhile), это полностью разделяет вставку в начале, конце и в середине:

void insert(node** p, char c) {
    node* elem = (node*)malloc(sizeof(node));
    elem->data = c;
    elem->next = *p; // connect to following node
    *p = elem; // connect previous node/root to the node
};

И если вам действительно нужно работать с индексами , вам следует всегда разбивать код на отдельные функции.

node** node_by_index(node** p, int index) {
    while(index > 0) {
        p = &(*p)->next;
        --index;
    };
    return p;
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...