0

私の問題は、数字を挿入すると機能することですが、途中で挿入したい場合は挿入されますが、次のノードを出力しません。それらを削除するか、アクセスできないかはわかりません。

struct node {
    int data ;
    struct node *prev;
    struct node *next;
};

struct node* head = NULL;

ここに問題のある関数挿入があります。

void insert(int key) {
    struct node *pred=head, *succ;
    struct node *temp2, *temp;
    if (head==NULL) {
        head = (struct node *) malloc(sizeof(struct node));
        head->data = key;
        head->prev = NULL;
        head->next = NULL;
    } else {
        temp2 = (struct node*) malloc(sizeof(struct node));
        temp2->data =  key;
        temp = head;
        while(temp->next!=NULL && temp->next->data < key) {
            pred= temp->next;
            temp = temp->next;
        }
        printf("******pred : %d \n",pred->data);
        //printf("******temp-next %d \n",temp->next->data);
        if (temp->data < key) {
            temp->next = temp->next->next;
            temp->next = temp2;
            temp2->prev = temp;
            temp2->next = pred->next->next;
        } else {     
            //temp2->next= temp;
            //temp->prev = NULL; 
            temp2->next = head;
            //head->prev = temp2;
            head = temp2;
            printf("**** temp : %d",temp->data);
            printf("**** temp2 : %d",temp2->data);
            printf("here\n");
            //temp = temp2 ->prev;
            //temp->prev = NULL;        
        }           
    }
}
4

4 に答える 4

0

二重にリンクされたリストの場合、 a を維持するtailと対称になります。それがなければ、私はそうします。

インサート全体:

struct node* prev = NULL;
struct node* ptr;
for (ptr = head; ptr != NULL && key < ptr->data; ptr = ptr->next) {
    prev = ptr;
}

struct node* baby = (struct node *) malloc(sizeof(struct node));
baby->data = key;
baby->prev = prev;
baby->next = ptr;
if (prev != null) {
    prev->next = baby; // Link in from previous
}
if (ptr != null) {
    ptr->prev = baby; // Link in from next
}
if (head == NULL) {
    head = baby;
}
于 2013-11-05T14:34:15.893 に答える
0

変数 temp1,2 の名前を修正することをお勧めします。コードの理解が非常に複雑になります。
while() ループには、同じ値を持つ pred 変数と temp 変数があります。それでは、そのうちの1つを削除してみませんか?
while() ループの直後に値のチェックがありますが、while() ループはアイテムのループ中にこの条件のアイテムの一時を既にチェックしています。したがって、このチェックは間違っています。
これで、アイテム「temp」がキーよりも小さいことはすでにわかっていますが、NULL でない場合、次のアイテムの方が大きいことがわかります。そのため、NULL かどうかを確認する必要があります。
NULL の場合、新しい項目をリストの最後に追加する必要があります。
NULL でない場合は、現在のアイテム「temp」の直後、「temp->next」の前にアイテムを追加する必要があります。これは、「temp->next」が現在のアイテム「temp」と新しいアイテムよりも大きいためです。

if ステートメントの場合に使用するコードの下では、ヘッダーは NULL ではありません (明確にするためにいくつかの変数の名前が変更されています)。

{   
    assert(head != NULL); // head not NULL already
    newItem = (struct node*) malloc(sizeof(struct node));
    newItem->data =  key;
    currItem = head;

    while(currItem->next!=NULL && currItem->next->data < key){
        currItem = currItem->next;}

    if(currItem->next == NULL){ // append new item to the end of list
        currItem->next = newItem;
    }               
    else{ // insert somewhere in the middle (next item key is greater than current key)
        newItem->next = curr->next;
        currItem->next = newItem;
    }           
}
于 2013-11-05T14:31:07.827 に答える
0

中間コード (投稿されたコード例の最後の if ステートメント) への挿入は、次のようにうまく機能するはずです。

    if (temp->data < key) {
        // Insert in the middle
        temp->next = temp2;
        temp2->prev = temp;
        temp2->next = pred->next->next;
        temp2->next->prev = temp2;       // Added
    } else {     
        // Insert last                   // Changed entire block
        temp2->prev= temp;     
        temp->next = temp2; 
        temp2->next = null;
    }           
于 2013-11-05T14:31:16.287 に答える