我的链接列表没有正确添加(继续替换第3个位置) - c

时间:2011-11-03 12:26:40

标签: c segmentation-fault singly-linked-list

似乎添加了第一个mapList节点,然后添加节点跟随它,但是之后添加的每个节点每次都被置于第三个位置,即使看起来我的* next正确设置(我'我仍然是新的指针和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;
  };

这是添加功能

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;
                    }

以下是我的输出结果:

使用KEY = Orson Scott Card输入ADDMAPNODE

使用KEY输入ADDMAPNODE = Frank Herbert - 在Orson Scott Card之后添加钥匙 - 弗兰克赫伯特补充道。

使用KEY = Isaac Asimov输入ADDMAPNODE   - 目前的关键是Orson Scott Card   - 在Frank Herbert之后添加一把钥匙   - 添加了Isaac Asimov

使用KEY = Douglas Adams输入ADDMAPNODE   - 目前的关键是Orson Scott Card   - 在Frank Herbert之后添加一把钥匙   - 道格拉斯亚当斯补充道。

使用KEY = George Orwell输入ADDMAPNODE   - 目前的关键是Orson Scott Card   - 在Frank Herbert之后添加一把钥匙   - 添加了George Orwell

使用KEY输入ADDMAPNODE = Robert A. Heinlein   - 目前的关键是Orson Scott Card   - 在Frank Herbert之后添加一把钥匙   - 添加了Robert A. Heinlein

使用KEY = Ray Bradbury输入ADDMAPNODE   - 目前的关键是Orson Scott Card   - 在Frank Herbert之后添加一把钥匙   - 添加了Ray Bradbury

等......在Frank Herbert之后添加了每个密钥,因为代码认为Herbert的>接下来是NULL,即使我只是把它变成了一个新的节点...... CONFIZZZLED

1 个答案:

答案 0 :(得分:0)

您应该包含struct bookMap定义,但我相信您的问题是strcpy调用:您没有为->key字段分配任何空间

一个问题是你没有为第一个节点设置->next = NULL,但是如果这实际上很重要,那么你会意外地到达"current key is "行,而不是看到的。

每次都是walker->next == NULL,在第一次之后,但"added "行执行时却很好。

我会检查isKey的代码,并确保它没有破坏->next指针。