Проблема мой связанный список - PullRequest
0 голосов
/ 06 апреля 2011

Я делаю это домашнее задание, где требуется, чтобы я взял массивную строку и разбил ее на множество подстрок, где каждая строка обозначается значением новой строки '\ 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[]) 

Ответы [ 2 ]

1 голос
/ 06 апреля 2011
  1. #define eq(A, B) ( A == B ) не очень хорошая идея, улучшение будет определять его как #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 голосов
/ 06 апреля 2011

LOL, какой компилятор вы используете! вы называете свою переменную 'new'

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

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

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

new = newNode (temp);

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...