2016-07-05 4 views
0

Я новичок в теме связанного списка и с трудом определяю, как добавить «u» после каждого «o», который вводит пользователь. Любая помощь или помощь приветствуются.Итерация по связанному списку и добавление нового значения

программыполя вход:

./queensenglish

Входная строка ?:

я люблю желтый цвет

В программы ожидается выход:

Шарлатан! Я использую королевы английского языка:

я Louve в coulour yellouw

#include <stdio.h> 
    #include <cs50.h> 
    #include <stdlib.h> 
    #include <string.h> 

typedef struct node 
{ 
    char myChar; 
    struct node* next; 
} node; 

node* stringToList(char* inputString) 
{ 
    node* first = malloc(sizeof(node)); 
    first->myChar = 'a'; 
    first->next = NULL; 
    node* current = first; 

    char* s; 
    for(s = inputString; *s != '\0'; s++) 
    { 
     node* newNode = malloc(sizeof(node)); 
     newNode->myChar = *s; 
     newNode->next = NULL; 
     current->next = newNode; 
     current = newNode; 
    } 
    return first->next; 
} 

char* listToString(node* firstChar) 
{ 
    // get the length of the string 
    int totalLen = 0; 
    node* current = firstChar; 
    while(current != NULL) 
    { 
     totalLen++; 
     current = current->next; 
    } 

    char *newString = malloc(sizeof(char)*(totalLen+1)); 
    char *iter = newString; 
    current = firstChar; 
    for (int i = 0; i < totalLen; i++) 
    { 
     *iter = current->myChar; 
     current = current->next; 
     iter++; 
    } 
    *iter = '\0'; 
    return newString; 
} 

int main(void) 
{ 
    // Read in an input string 
    printf("Input string?: \n"); 
    char* myString = GetString(); 

    // Convert that string into a linked list 
    node* firstChar = stringToList(myString); 

    node* current = firstChar; 
    while(current != NULL){ 

     if(strcmp(&current->myChar, "o") == 0 || (strcmp(&current->myChar, "O") == 0) 
     { 
      //insert a 'u' after every 'o' 
      //printf("Char: %c\n", current->myChar); 
     } 
     current = current->next; 
    } 

    // convert the list back into a string 
    char* newString = listToString(firstChar); 

    // print out the "corrected" string 
    printf("Charlatan! I use the Queen's English:\n"); 
    printf("%s\n", newString); 
} 
+0

'зЬгстр (& current-> MyChar, "о") == 0 'это UB ->' current-> MyChar == «о '' – BLUEPIXY

+0

insertNode: {' u ', NULL}, nextNode: current-> next, insertNode-> next = nextNode; current-> next = insertNode; – BLUEPIXY

+0

'node * first = malloc (sizeof (node)); \t first-> myChar = 'a'; first-> next = NULL; ... return first-> next; 'memory leak ->' first; \t node * current = &first; ... return first.next; ' – BLUEPIXY

ответ

1
if(current->myChar == 'o' || current->myChar == 'O') 
{ 
    node *insertNode = malloc(sizeof(node)); 
    insertNode->myChar = 'u'; 
    insertNode->next = current->next; 
    current->next = insertNode; 
    current = current->next;//skip 'u' node 
} 
1

Во-первых, Вы используете strcmp сравнить char с, что является неправильным. strcmp используется для сравнения двух string s, не для сравнения двух символов. Вы должны использовать оператор ==, чтобы проверить, если current->myChar == 'o' || current->myChar == 'O'

Далее, каждый раз, когда вы получаете узел, чей char т.е. myChar является 'o' или 'O' вам нужно:

  1. Создать новый узел с его myChar равным u.
  2. Сделать этот новый узел узлом, на который указывает узел «o» или «O».
  3. Сделайте узел «o» или «O» точкой для этого нового узла.

Так что вы можете сделать так:

node* current = firstChar; 
while(current != NULL){ 
     //insert a 'u' after every 'o' 
     if(current->myChar == 'o' || current->myChar == 'O') { 
       // create a new node 
       struct node *tmp = malloc(sizeof(struct node)); 
       if (tmp == NULL) { 
         /* malloc failed */ 
         printf("Error: Malloc fail, cannot add 'u'\n"); 
       } else { /* malloc succeded */ 
         tmp->myChar = 'u'; 
         tmp->next = current->next; 
         current->next = tmp; 
       } 
     } 
     current = current->next; 
} 
Смежные вопросы