0

だから私は、キューヤーの代役として使用されている自作の二重リンクリストの実装を持っています。(私が確かに弱い言語であるCで実装されています)。

ノードの私のtypedef:

typedef struct Node
{
    char *name;
    int data;
    int recurring;
    struct Node *next;
    struct Node *prev;
}node;

これは、「ノードには、名前、データポイント、繰り返しかどうかに関係なく、前のノードと次のノードへのポインタがあります」と書かれています。

そのような挿入機能

node * insertFromTail(node *tail, int data, int recurring, char *name)
{
    node *newNode;
    node *oldNext;
    node *origTail = tail;
    /*assume *pointer points to tail of list*/
    /*printf("tail data is %d\n", tail->data);
    printf("before loop\n");*/
    while(tail->prev != NULL && tail->data > data)
    {
        /*printf("inside while loop\n");*/
        tail = tail -> prev;
    }
    /*printf("after loop\n");*/
    /*if we are looking at a no item list or tail*/
    if(tail->next == NULL)
    {
        /*printf("pointer is tail\n");*/
        return insert(tail, data, recurring, name);
    }
    else /*tail pointer points at item before the point of insertion*/
    {
        /*printf("default case\n");
        printf("pointer data is %d\n", tail->data);*/
        oldNext = tail->next;
        newNode = (node *)malloc(sizeof(node));
        newNode->data = data;
        newNode->recurring = recurring;
        newNode->name = name;
        oldNext -> prev = newNode;
        newNode -> next = oldNext;
        tail -> next = newNode;
        newNode -> prev = tail;
        return origTail;
    }
}

内部インサート付き

node * insert(node *tail, int data, int recurring, char *name)
{
        /* Allocate memory for the new node and put data in it.*/
        tail->next = (node *)malloc(sizeof(node));
        (tail->next)->prev = tail;
        tail = tail->next;
        tail->data = data;
        tail->recurring = recurring;
        tail->name = name;
        tail->next = NULL;
        return tail;
}

リストの末尾、データポイント、次のアイテムが繰り返される時刻、およびアイテムの名前が渡されます。

空で、前の参照と次の参照がNULLのノード(ダミーノード)から開始し、stdInから入力を取得してinsertFromTailを呼び出すADDという関数を使用して3つの一意のノードを追加する場合

int main()
{
    node *start,*temp,*tail;
    start = (node *)malloc(sizeof(node));
    temp = start = tail;
    temp->next = NULL;
    temp->prev = NULL;
    if(strcmp(command, "ADD") == 0)
    {
        scanf("%d",&argTime);
        scanf("%s",&argName);
        tail = insertFromTail(head, argTime, 0, *argName);
    }
}

そのように入力して:

INPUT: 
ADD 10 Gin
ADD 20 Vodka
ADD 30 Rum
PRINT

私はの出力を取得します

OUTPUT:
Rum 10
Rum 20
Rum 30

目的の出力はOUTPUT:Gin 10 Vodka 20 Rum 30であるため、これはエラーです。

文字列がノードに渡される方法に関係しているように感じますが、ご覧のとおり、私は困惑しています。これが課題に残された最後のことであり、他のすべてが完全に機能しているので、誰かが私を正しい道に導くことができるかどうかを確認するためにここに尋ねることにしました。事前にご協力いただきありがとうございます:)

PS悪いことすべてを申し訳ありませんが、私は睡眠不足です:(

4

1 に答える 1

3

簡単な答え:その名前を複製する必要があります:

tail->name = strdup(name);

より長い答え:各反復で同じポインタを格納しています。あなたはそれを保存していて、次にあなたがそれを再び書いているとき。したがって、最後に入力したものに対して3つの同一のポインターが作成されます。

簡単な修正は、文字列を複製してコピーを保存することです。正確には何をしますかstrdup。ただし、実装に欠けている場合はstrdup、次のことを試すことができます。

tail->name = malloc(strlen(name) + 1);
strcpy(tail->name, name);
  • エラーをチェックすることを忘れないでください
  • freeある時点で記憶に忘れないでください
于 2012-08-26T15:47:51.887 に答える