在雙向連結串列指定節點後插入節點

2019-10-16 22:03:08

要在列表中的指定節點之後插入節點,需要跳過所需數量的節點以便到達目標節點,然後根據需要調整指標。

為此,請參考使用以下步驟。

  • 為新節點分配記憶體。 請使用以下語句。
    ptr = (struct node *)malloc(sizeof(struct node));
    
    使用指標temp遍歷列表以跳過所需數量的節點以到達指定節點。
    temp=head;  
    for(i=0;i<loc;i++)  
    {  
      temp = temp->next;
      // the temp will be null if the list doesn't last long up to mentioned location
      if(temp == NULL)    
      {  
          return;  
      }  
    }
    
  • temp將指向for迴圈結束時的指定節點。要在此節點之後插入新節點,因此需要在此處調整ptr指標。使ptr的下一個指標指向temp的下一個節點。
    ptr -> next = temp -> next;
    
  • 使新節點ptrprev指標指向temp
    ptr -> prev = temp;
    
    使temp指標指向新節點ptr
    temp -> next = ptr;
    
    使temp節點的pre指標指向新節點。
    temp -> next -> prev = ptr;
    

演算法

第1步:IF PTR = NULL
    提示:OVERFLOW
    轉到第15步
  [IF結束]

第2步:設定NEW_NODE = PTR
第3步:SET PTR = PTR - > NEXT
第4步:設定NEW_NODE - > DATA = VAL
第5步:SET TEMP = START
第6步:SET I = 0
第7步:重複第8步到第10步直到 I
第8步:SET TEMP = TEMP - > NEXT
第9步:如果TEMP = NULL
第10步:提示 「比所需的元素少」
     轉到第15步
    [結束]
  [迴圈結束]

第11步:設定NEW_NODE - > NEXT = TEMP - > NEXT
第12步:設定NEW_NODE - > PREV = TEMP
第13步:設定TEMP - > NEXT = NEW_NODE
第14步:設定TEMP - > NEXT - > PREV = NEW_NODE
第15步:退出

示意圖如下 -

在雙向鏈表指定節點後插入節點

使用C語言實現的示意程式碼 -

#include<stdio.h>  
#include<stdlib.h>  
void insert_specified(int);
void create(int);
struct node
{
    int data;
    struct node *next;
    struct node *prev;
};
struct node *head;
void main()
{
    int choice, item, loc;
    do
    {
        printf("Enter the item which you want to insert?\n");
        scanf("%d", &item);
        if (head == NULL)
        {
            create(item);
        }
        else
        {
            insert_specified(item);
        }
        printf("Press 0 to insert more ?\n");
        scanf("%d", &choice);
    } while (choice == 0);
}
void create(int item)
{
    struct node *ptr = (struct node *)malloc(sizeof(struct node));
    if (ptr == NULL)
    {
        printf("OVERFLOW");
    }
    else
    {
        if (head == NULL)
        {
            ptr->next = NULL;
            ptr->prev = NULL;
            ptr->data = item;
            head = ptr;
        }
        else
        {
            ptr->data = item;printf("Press 0 to insert more ?\n");
            ptr->prev = NULL;
            ptr->next = head;
            head->prev = ptr;
            head = ptr;
        }
        printf("Node Inserted\n");
    }

}
void insert_specified(int item)
{

    struct node *ptr = (struct node *)malloc(sizeof(struct node));
    struct node *temp;
    int i, loc;
    if (ptr == NULL)
    {
        printf("OVERFLOW\n");
    }
    else
    {
        printf("Enter the location\n");
        scanf("%d", &loc);
        temp = head;
        for (i = 0;i < loc;i++)
        {
            temp = temp->next;
            if (temp == NULL)
            {
                printf("can't insert\n");
                return;
            }
        }
        ptr->data = item;
        ptr->next = temp->next;
        ptr->prev = temp;
        temp->next = ptr;
        temp->next->prev = ptr;
        printf("Node Inserted\n");
    }
}

執行上面範例程式碼,得到以下結果 -

Enter the item which you want to insert?
12

Node Inserted

Press 0 to insert more ?
0

Enter the item which you want to insert?
90

Node Inserted

Press 0 to insert more ?
2