0

以前の質問から、リンクされたリストが更新されなかった理由がわかりました。x の座標を繰り返し処理する必要があることがわかりましたが、それは私のこの質問では重要ではありません。

リンクされたリストに要素を挿入すると、値を挿入したい場所の前の要素が消えます。たとえば、「helo」を出力する要素があり、e の後に別の「l」を挿入したい場合、出力は「(space)ello」になります。挿入コードと構造は次のとおりです。

struct node {
struct node *previous;
int c;
int x;
int y;
struct node *next;
}*head;

void checker(int ch, int xpos, int ypos)
{
    int flag=0;
    struct node *temp,*temp1,*var,*insert_node;
    var=(struct node *)malloc(sizeof(struct node));
    temp=(struct node *)malloc(sizeof(struct node));
    insert_node=(struct node*)malloc(sizeof(struct node));
    temp=head;
    while(temp!=NULL)
    {
        if(temp->x==xpos && temp->y==ypos)
        {
            insert_node->c=ch;
            insert_node->x=xpos;
            insert_node->y=ypos;
            insert_node->next=NULL;
            temp1=temp;
                while(temp1!=NULL)
                {
                    if(temp1->y==ypos)
                    temp1->x++;
                    temp1=temp1->next;
                }
                var->next=insert_node;
                insert_node->next=temp;
                head=var;

            flag=1;
            break;
        }
            var=temp;
            temp=temp->next;
    }
    if(flag==0)
        characters(ch,xpos,ypos);
}

var の内部には 2 つではなく 1 つの要素しかないようです。helo から "h" を忘れてしまいます。

4

2 に答える 2

1

を割り当てたときに、リスト内で一致する x と y が見つかるまで、元のヘッドからリストを破棄しますhead = var。座って何枚か絵を描いて、それが間違っていると自分自身に納得させてください。

リスト内の一致するノードの前に新しいノードを挿入するには、リスト内の現在のノードと以前にアクセスしたノードを追跡します。次に、current_node の前に新しいノードを挿入する準備ができたら、次のようにします。

insert_node->next = current_node;
if (previous_node == NULL)
    head = insert_node;
else
    previous_node->next = insert_node;

あなたのコードでは、 (あなたが調べているもの)tempの役割を果たします。current_node前のノードへのポインターがないため、宣言します。current_node を head に設定し、previous_node を NULL に設定してから、リストの実行を開始します。リスト内で前に置きたいノードが見つかったら、insert_node上記のコードを使用します。リストの先頭に挿入する場合の特殊なケースに注意してください。の後に新しいノードを挿入したい場合に何をすべきかを理解するための演習として残しますcurrent_node

于 2013-08-06T03:48:35.403 に答える
0
        var->next=insert_node;
        insert_node->next=temp;

次のようにする必要があります。

        insert_node->next=temp->next;
        temp->next=insert_node;
于 2013-08-06T03:43:14.687 に答える