在單連結串列刪除指定節點之後的節點

2019-10-16 22:03:26

要刪除在指定節點之後存在的節點,需要跳過所需數量的節點以到達節點,之後的節點將被刪除。 需要跟蹤這兩個節點。如果在該節點之前存在的節點,則將刪除該節點。 為此,使用了兩個指標:ptrptr1

使用以下語句來執行此操作。

ptr = head;
for (i = 0;i < loc;i++)
{
    ptr1 = ptr;
    ptr = ptr->next;

    if (ptr == NULL)
    {
        printf("There are less than %d elements in the list..", loc);
        return;
    }
}

現在,任務差不多完成了,只需要做一些指標調整。 使ptr1(指向指定節點)的下一個指向ptr的下一個(要刪除的節點)。

這將通過使用以下語句來完成。

ptr1 ->next = ptr ->next;  
free(ptr);

演算法

第1步:如果HEAD = NULL
列印提示記憶體溢位
    轉到第10步
   結束時間

第2步:設定TEMP = HEAD
第3步:設定I = 0
第4步:重複第5步到第8步直到 I 
第5步:TEMP1 = TEMP
第6步:TEMP = TEMP→NEXT
第7步:如果TEMP = NULL
提示「不存在節點」
    轉到第12步
    結束條件

第8步:I = I + 1
迴圈結束

第9步:TEMP1→NEXT = TEMP→NEXT
第10步:釋放 TEMP 
第11步:退出

示意圖 -

C語言範例程式碼 -

#include<stdio.h>  
#include<stdlib.h>  
void create(int);
void delete_specified();
struct node
{
    int data;
    struct node *next;
};
struct node *head;
void main()
{
    int choice, item;
    do
    {
        printf("1.Append List\n");
        printf("2.Delete node\n"): 
        printf("3.Exit\n"): 
        printf("4.Enter your choice?");
        scanf("%d", &choice);
        switch (choice)
        {
        case 1:
            printf("Enter the item\n");
            scanf("%d", &item);
            create(item);
            break;
        case 2:
            delete_specified();
            break;
        case 3:
            exit(0);
            break;
        default:
            printf("Please enter valid choice\n");
        }

    } while (choice != 3);
}
void create(int item)
{
    struct node *ptr = (struct node *)malloc(sizeof(struct node *));
    if (ptr == NULL)
    {
        printf("OVERFLOW\n");
    }
    else
    {
        ptr->data = item;
        ptr->next = head;
        head = ptr;
        printf("Node inserted\n");
    }

}
void delete_specified()
{
    struct node *ptr, *ptr1;
    int loc, i;
    scanf("%d", &loc);
    ptr = head;
    for (i = 0;i < loc;i++)
    {
        ptr1 = ptr;
        ptr = ptr->next;

        if (ptr == NULL)
        {
            printf("There are less than %d elements in the list..\n", loc);
            return;
        }
    }
    ptr1->next = ptr->next;
    free(ptr);
    printf("Deleted %d node ", loc);
}

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

1.Append List
2.Delete node
3.Exit
4.Enter your choice?1

Enter the item
12

Node inserted

1.Append List
2.Delete node
3.Exit
4.Enter your choice?1

Enter the item
23

Node inserted

1.Append List
2.Delete node
3.Exit
4.Enter your choice?2
12

There are less than 12 elements in the list..

1.Append List
2.Delete node
3.Exit
4.Enter your choice?2
1

Deleted 1 node