2011-04-06 2 views
0

Я выполняю эту домашнюю задачу, когда мне требуется взять массивную строку и разбить ее на множество подстрок, где каждая строка указывается значением новой строки \ n 'внутри строки и хранить это в связный список, например:Проблема со связанным списком

string = "hello world\n i need help!!" 

свою очередь на:

string1 = "hello world\n" 
string2 = "i need help!!" 

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

Вот мой код, пожалуйста, помогите, если вы можете:

#define eq(A, B) (A == B) 

typedef struct list * link; 
typedef char Item; 

struct list { 
    link next; 
    Item *string; 
}; 


void printlist (link ls); 
link newLS (char text[]); 
link newNode (char text[]); 
void insertNode (link next, Item item[]); 

link newLS (char text[]) { 
    int i = 0; 
    int j = 0; 
    char temp[(strlen(text))]; 
    link new = NULL; 

    while (text[i] != '\0') { 
     temp[j] = text[i]; 
     if (text[i] == '\n' || text[i+1] == '\0') { 
      temp[j+1] = '\0'; 
      j = -1; 
      if (new == NULL) { 
       new = newNode(temp); 
       printf("new: %s", new->string); 
      } else { 
       insertNode(new, temp); 
       printf("new: %s", new->next->string); 
      } 
     } 
     i++; 
     j++; 
    } 
    printlist(new); 
    return new; 
} 

link newNode (char text[]) { 
    link new = malloc(sizeof(*new)); 
    assert(new != NULL); 
    new->string = malloc ((strlen(text)) * sizeof(char)); 
    new->string = text; 
    new->next = NULL; 

    return new; 
} 

void insertNode (link ls, Item item[]) { 
    assert (ls != NULL); 
    assert (item != NULL); 

    while (ls->next != NULL) { 
     ls = ls->next; 
    } 
    ls->next = newNode(item); 

} 

int main(int argc, char **argv) { 
    link ls; 

    ls = newLS("1\n2\n3"); 
    return 0; 
} 

Мы должны использовать эту функцию:

link newLS (char text[]) 
+0

Можете ли вы сократить пример на меньшую часть кода, которая по-прежнему показывает ту же проблему? Нам будет легче дать вам помощь, и в качестве бонуса вы можете обнаружить источник своей проблемы для себя (или, по крайней мере, узнать больше о причинах этого). –

+0

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

+1

Я чувствую себя грязным, увидев переменную, называемую 'new'. Да, это C, а 'new' не является ключевым словом, но все же. – cHao

ответ

1
  1. #define eq(A, B) (A == B) не липкий d идея, улучшение будет определить его как #define eq(A, B) ((A) == (B))

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

    new->string = malloc ((strlen(text)) * sizeof(char)); 
    new->string = text; 
    

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

    new->string = malloc ((strlen(text) + 1) * sizeof(char)); 
    memcpy(new->string, text, strlen(text) + 1); 
    

    кроме того, когда вы будете пытаться free выделенную память, вы получите ошибку сегментации, потому что new->string не указывает на выделенную область ...

0

Lol какой компилятор вы используете! вы именование переменной «нового»

В любом случае,

Вы переписываете на гольце *, который вы прошли в узле инициализатор. Итак, сначала вы создали newNode (temp) с temp = "1", после чего вы перезаписали temp со значением "2" на следующей итерации.

обходной путь:

новое = newNode (температура);

Вставить это после строки выше -> temp = new char [strlen (текст)];

insertNode (новый, темп);

Вставить это после строки выше -> temp = new char [strlen (текст)];

Смежные вопросы