Мой связанный список не добавляется должным образом (продолжает заменять третью позицию) - c - PullRequest
1 голос
/ 03 ноября 2011

Кажется, что добавляется первый узел mapList, затем нормально добавляется узел, следующий за ним, но каждый добавленный после него узел каждый раз помещается в эту третью позицию, даже если кажется, что мои * next установлены правильно (I 'Я все еще новичок в указателях и C), который вызывает у меня ошибку сегментации, когда я хочу получить доступ к другим узлам.У меня есть работа по добавлению patronNode, которая была гораздо более сложной, я не могу понять, что это правильно, и те, кто выдает просто клевету на меня, = (

вот две структуры ..

struct bookMap
{
    int totalBooks;
    char key[AUTHOR_NAME_LEN];
    struct bookMap *next;
    struct bookNode *bList,*newBNode;
 };


 struct Library{
    int totalPatrons, totalBooks;
    struct patronNode       *pList,*newPNode;
    struct bookMap          *mapList,*newMapNode;
  };

вот что добавляет Func

int addMapNode(struct Book *b, struct Library *lib)
{
     struct bookMap *newKey;
     printf("\nENTERING ADDMAPNODE WITH KEY = %s\n",b->author);
     if(lib->totalBooks == 0)//NO CURRENT BOOKS
     {
            lib->totalBooks++;
            newKey = (struct bookMap *) malloc(sizeof(struct bookMap));
            strcpy(newKey->key,b->author);  //set the first map node key
            addBookToCollection(b,newKey);  //add the book to our first map node
            lib->mapList = newKey;
            return(0);
    }else
    {
            if((isKey(b,&newKey,lib->mapList)) == 0)
            {
                    addBookToCollection(b,newKey);
            }else
            {
                    struct bookMap *walker;
                    walker = lib->mapList;
                    for(;;)
                    {
                            if(walker->next == NULL)
                            {
                                    printf("Adding a key after %s\n",walker->key);
                                    lib->totalBooks++;
                                    newKey=(struct bookMap *) malloc(sizeof(struct bookMap));
                                    strcpy(newKey->key,b->author);
                                    addBookToCollection(b,newKey);
                                    newKey->next = NULL;
                                    walker->next = newKey;
                                    printf("added %s\n",walker->next->key);
                                    return(0);
                            }
                            printf("current key is %s\n",walker->key);
                            walker = walker->next;
                    }

Вот как выглядит мой вывод:

ВВОД ADDMAPNODE С КЛЮЧОМ = Кард Орсон Скотт

ВВОД ADDMAPNODE СКЛЮЧ = Фрэнк Герберт - Добавление ключа после карты Орсона Скотта - добавил Фрэнк Герберт

ВВОД ADDMAPNODE С КЛЮЧОМ = Исаак Азимов - текущий ключ - Орсон Скотт карты - Добавление ключа после Фрэнка Герберта - добавил Исаак Азимов

ВХОД В ADDMAPNODE С КЛЮЧОМ = Дуглас Адамс - текущим ключом является карта Орсона Скотта - Добавление ключа после Фрэнка Герберта - добавил Дуглас Адамс

ВХОД В ADDMAPNODE С КЛЮЧОМ = Джорджем Оруэллом - текущим ключом является карта Орсона Скотта - Добавлениеключ после Фрэнка Герберта - добавил Джордж Оруэлл

ВХОД В ADDMAPNODE С КЛЮЧОМ = Роберт А. Хайнлайн - текущий ключ - Орсон СкоттКарта - Добавление ключа после Фрэнка Герберта - добавлен Роберт А. Хайнлайн

ВХОД В ADDMAPNODE С КЛЮЧОМ = Рэй Брэдбери - текущий ключ - Орсон Скотт Карта - Добавление ключа после Фрэнка Герберта - добавил Рэй Брэдбери

ect .... каждый ключ добавляется после Фрэнка Герберта, потому что код думает, что следующий Герберта-> равен NULL, хотя я ПРОСТО сделал это = для нового узла ... CONFIZZZLED

1 Ответ

0 голосов
/ 03 ноября 2011

Вы должны включить определение struct bookMap, , но я считаю, что ваша проблема в вызовах strcpy: вы не выделили места для полей ->key .

Одна проблема заключается в том, что вы не можете установить ->next = NULL для первого узла, но если это действительно имеет значение, вы неожиданно попадете на строку "current key is ", а не на то, что видите.

Так что walker->next == NULL каждый раз, после первого, и все же хорошо, когда исполняется строка "added ".

Я бы проверил код isKey и убедился, что он не уничтожает указатели ->next.

...