1

最初のmapListノードを追加し、その後にノードを追加するようですが、その後に追加されたすべてのノードは、* nextが正しく設定されているように見えても、毎回その3番目の位置に配置されます(私はまだ新しいです)ポインタとC)で、他のノードにアクセスしたいときにセグメンテーションエラーが発生します。私はpatronNodeの追加作業を持っていますが、これははるかに複雑で、これを正しく行うことができないようで、出力するものは私に冒涜を吐きます=(

これが2つの構造です。

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

私の出力は次のようになります。

キーでADDMAPNODEを入力=OrsonScott Card

キーでADDMAPNODEを入力=フランクハーバート-オーソンスコットカードの後に​​キーを追加-フランクハーバートを追加

キーでADDMAPNODEを入力=アイザックアシモフ-現在のキーはオーソンスコットカード-フランクハーバートの後にキーを追加-アイザックアシモフを追加

キーを使用してADDMAPNODEを入力=ダグラスアダムズ-現在のキーはオーソンスコットカード-フランクハーバートの後にキーを追加-ダグラスアダムズを追加

キーでADDMAPNODEを入力=ジョージオーウェル-現在のキーはオーソンスコットカード-フランクハーバートの後にキーを追加-ジョージオーウェルを追加

キーを使用してADDMAPNODEを入力=RobertA.Heinlein-現在のキーはOrsonScottCardです-FrankHerbertの後にキーを追加します-RobertA.Heinleinを追加しました

キーを使用してADDMAPNODEを入力=レイブラッドベリ-現在のキーはオーソンスコットカード-フランクハーバートの後にキーを追加-レイブラッドベリを追加

ect ....すべてのキーがFrankHerbertの後に追加されます。これは、コードがHerbertの-> nextがNULLであると見なしているためです。ただし、新しいノードに対して=を作成しただけです... CONFIZZZLED

4

1 に答える 1

0

struct bookMap定義を含める必要がありますが、問題は呼び出しにあると思います。フィールドstrcpyにスペースを割り当てていません->key

1つの問題は、最初のノードの設定に失敗することです->next = NULLが、それが実際にここで問題になる場合は、表示されて"current key is "いるものではなく、予期せずに回線に到達することになります。

したがってwalker->next == NULL、毎回、最初の後で、それでも"added "行が実行されるときは問題ありません。

のコードをチェックして、ポインタisKeyが破壊されていないことを確認します。->next

于 2011-11-03T12:49:08.693 に答える