1

似乎添加了第一个 mapList 节点,然后添加了它之后的节点,但是之后添加的每个节点每次都被放置在第三个位置,即使看起来我的 *next 设置正确(我还是新的at 指针和 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 输入添加节点

ENTERING ADDMAPNODE WITH KEY = Frank Herbert - 在 Orson Scott Card 之后添加密钥 - 添加 Frank Herbert

ENTERING ADDMAPNODE WITH KEY = Isaac Asimov - 当前密钥是 Orson Scott Card - 在 Frank Herbert 之后添加一个密钥 - 添加了 Isaac Asimov

ENTERING ADDMAPNODE WITH KEY = Douglas Adams - 当前密钥是 Orson Scott Card - 在 Frank Herbert 之后添加一个密钥 - 添加 Douglas Adams

ENTERING ADDMAPNODE WITH KEY = George Orwell - 当前密钥是 Orson Scott Card - 在 Frank Herbert 之后添加一个密钥 - 添加 George Orwell

ENTERING ADDMAPNODE WITH KEY = Robert A. Heinlein - 当前密钥是 Orson Scott Card - 在 Frank Herbert 之后添加一个密钥 - 添加了 Robert A. Heinlein

ENTERING ADDMAPNODE WITH KEY = Ray Bradbury - 当前密钥是 Orson Scott Card - 在 Frank Herbert 之后添加密钥 - 添加 Ray Bradbury

等....在 Frank Herbert 之后添加了每个键,因为代码认为 Herbert's->next 为 NULL,即使我只是将它设置为 = 到一个新节点... CONFIZZZLED

4

1 回答 1

0

你应该包括struct bookMap定义,但我相信你的问题是strcpy调用:你没有为->keyfields分配任何空间。

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

所以walker->next == NULL每次,在第一次之后,但当"added "行执行时就很好了。

我会检查代码isKey并确保它不会破坏->next指针。

于 2011-11-03T12:49:08.693 回答