2016-07-05 14 views
0

私はリンクされたリストのトピックには新しく、ユーザーが入力するたびに 'u'を追加する方法を考えるのは難しいです。どんな助けや助けも大歓迎です。リンクリストの繰り返しと新しい値の追加

プログラム入力:

./queensenglish

入力文字列?:私は黄色を愛する

プログラムの予想される出力:

シャラタン!私は女王の英語を使用します。

私はあなたが間違っているchar Sを比較するstrcmpを使用している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

'のstrcmp(&の電流> myChar、 "O")== 0 'それはUBだ - >'の電流> myChar ==「O '' – 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; ... first - > next; 'memory leak - >'ノードを最初に返します。 \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

まず、coulourをlouve。 strcmpは、2つの文字を比較するためにstringを比較するために使用されます。あなたがもしcurrent->myChar == 'o' || current->myChar == 'O'

次をチェックする==演算子を使用する必要がある、あなたはcharmyCharつまり、あなたがする必要がある'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; 
} 
関連する問題