簡體   English   中英

從LinkedList刪除節點

[英]Removing Node from LinkedList

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
typedef struct _listnode
{
    int item;
    struct _listnode *next;
} ListNode;

int removeNode(ListNode **ptrHead, int index);
void printList(ListNode *head);
ListNode * findNode(ListNode *head, int index);

int main()
{
    ListNode *head = NULL, *temp=NULL;
    int i = 0;
    int index = 0;
    while (1)
    {
        printf("Enter a integer: ");
        scanf("%d", &i);
        if (i == -1)
            break;
        if (head == NULL)
        {
            head = malloc(sizeof(ListNode));
            temp = head;
        }
        else{
            temp->next = malloc(sizeof(ListNode));
            temp = temp->next;
        }
        temp->item = i;
    }
    removeNode(&head, index);
    return 0;
}

void printList(ListNode *head)
{
    int i = 0;
    if (head == NULL)
        return;
    while (head != NULL)
    {
        printf("%d ", head->item);
        head = head->next;
    }
    printf("\n");
}
ListNode * findNode(ListNode *head, int index)
{
        if (head == NULL || index   <   0)
        return  NULL;

        while (index    >   0){
            head = head->next;
            if (head == NULL)
                return  NULL;
            index--;
        }
        return  head;
}

int removeNode(ListNode **ptrHead, int index)
{
    ListNode *pre, *cur,*temp;
    if (index >= 0)
    {
        printf("Enter index to remove: ");
        scanf("%d", &index);
        if ((pre = findNode(*ptrHead, index - 1)) != NULL)
        {
            cur = pre->next;
            temp = cur;
            pre->next = cur->next;
            free(temp);
            printList(*ptrHead);
        }

    }
    return -1;
}

我成功修改了代碼,現在可以刪除節點並顯示出來,但是整個程序在我的printList函數之后崩潰了。 它不會返回刪除節點,並且我無法繼續刪除其他索引。

Output:
Enter a value: 2 
Enter a value: 4 
Enter a value: 6 
Enter a value: 8 
Enter a value: -1 
Enter index to remove: 2 
Current list: 2 4 8 
Enter index to remove: 0 
Current list: 4 8 
Enter index to remove: -1

removeNode(head, index); 應該是removeNode(&head, index);

printList(ptrHead); 應該是printList(*ptrHead); (在removeNode )我感到這段代碼很瘋狂,這就是為什么您的應用程序不再響應的原因。

您使用什么編譯器? 它應該警告過您。

當輸入索引= 0,內ifremovenode功能不會被執行作為findnode載體作用返回NULL。 但是在索引為0的輸出中,刪除了節點2。 你是怎么得到的?

在更新的代碼中:

  • 沒有設置next為NULL。
  • 填充列表時,您永遠不會增加index
  • 您不檢查scanf()成功。
  • 無需在removeNode()使用指向指針的指針,可以使用:

     int removeNode(ListNode *ptrHead, int index); 
  • 您已經在printList()添加了removeNode() ,這實際上是printList()的。
  • 您沒有該列表的免費功能。
  • ...

原始代碼的原始答​​案:


  • 頭文件丟失。
  • 聲明和定義中的函數簽名之間缺少匹配。
  • 您永遠不會在NULL next設置。
  • 您沒有在退出前釋放列表。
  • ...

帶有一些注釋的代碼:

/* MISSING: <stdio.h> */
#include <stdlib.h>
typedef struct _listnode
{
    int item;
    struct _listnode *next;
} ListNode;

/* Signature miss-match */
int removeNode(ListNode **ptrHead, int index);
void printList(ListNode *head);
ListNode *findNode(ListNode *head, int index);

int main()
{
    ListNode *head = NULL, *temp=NULL;
    int i = 0;
    int index = 0;
    while (i != -1)
    {
        printf("Enter a integer: ");
        scanf("%d", &i);
        /* If -1 entered, -1 will be added to list. */
        if (head == NULL)
        {
            head = malloc(sizeof(ListNode));
            temp = head;
        }
        else{
            temp->next = malloc(sizeof(ListNode));
            temp = temp->next;
        }
        temp->item = i;
        /* temp->next never set to NULL */
    }
    /* Miss match between function signature and call. */
    removeNode(head, index);

    /* No freeing of list before exit. */
    return 0;
}

void printList(ListNode *head)
{
    /* Redundant check of head != NULL */
    if (head == NULL)
        return;
    while (head != NULL)
    {
        printf("%d", head->item);
        head = head->next;
    }
}
ListNode *findNode(ListNode *head, int index)
{
        if (head == NULL || index   <   0)
        return  NULL;

        while (index    >   0){
            head = head->next;
            if (head == NULL)
                return  NULL;
            index--;
        }
        return  head;
}

/* Why pass index as argument when it is not used? */
int removeNode(ListNode **ptrHead, int index)
{
    ListNode *pre, *cur,*temp;
    printf("Enter index to remove: ");
    scanf("%d", &index);
    /* Here you should check < 0, not  != -1. 
       What if user enters -9999 ? */
    if (index != -1)
    {
        if ((pre = findNode(*ptrHead, index - 1)) != NULL)
        {
            cur = pre->next;
            temp = cur;
            pre->next = cur->next;
            free(temp);
            /* Bad return statement, should be int */
            return;
        }
        /* You only print list if none was removed. */
        /* Miss match between function signature and call. */
        printList(ptrHead);
    }
    return -1;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM