使用特定值从链接列表中删除节点

时间:2012-12-01 03:27:35

标签: c list linked-list nodes

我目前正在编写一个程序,该程序具有需要根据其值删除节点的功能。

我试过并尝试弄明白。

到目前为止我所有的功能都是函数签名:

NODE* delete_node(NODE * ptr, int n, int *success_flag)

我的链接列表如下结构:

/* declaration of structure */
typedef struct node
{
  int data;
  struct node *next;
} NODE;

以下是关于另一个问题的一些代码:

#include <stdio.h>
#include <stdlib.h>

/* declaration of structure */
typedef struct node
{
  int data;
  struct node *next;
} NODE;

/* declaration of functions */
NODE* insert_node(NODE *ptr, NODE *new);
NODE* find_node(NODE *ptr, int n);
NODE* delete_node(NODE *ptr, int n, int *success_flag_ptr);
void print_backward_iteration(NODE *ptr);
void print_backward_recursion(NODE *ptr);

int main(int argc, char *argv[])
{
  int choice, x, flag_success;
  NODE *ptr, *new, *result;

  ptr = NULL;

  do
    {

      printf("\n1.\tInsert Integer into linked list\n");
      printf("2.\tFind integer in linked list\n");
      printf("3.\tDelete integer from linked list\n");
      printf("4.\tPrint out integers backward using the iterative strategy\n");
      printf("5.\tPrint out integers backward using the recursive strategy\n");
      printf("6.\tQuit\n");
      printf("\nEnter 1,2,3,4,5, or 6: ");
      scanf("%d", &choice);

      switch(choice)
    {
    case 1:

      printf("\nPlease enter an integer: ");
      scanf("%d", &x);
      new = (NODE *)malloc(sizeof(NODE));
      new->data = x;
      ptr = insert_node(ptr, new);
      printf("\nNode Inserted with value of %d.\n", ptr->data);
      break;

    case 2:

      printf("\nPlease enter an integer: ");
      scanf("%d", &x);
      result = find_node(ptr, x);

      if (result == NULL)
        {
          printf("\nValue could not be found.\n");
        }
      else
        {
          printf("\nValue %d was found.\n", x);
        }

      break;

    case 3:
      printf("\nPlease enter an integer: ");
      scanf("%d", &x);
      ptr = delete_node(ptr, x, &flag_success);

        if (result == NULL)
        {
          printf("\nValue could not be found.\n");
        }
      else
        {
          printf("\nValue %d was deleted.\n", x);
        }

      break;

    case 4:

      print_backward_iteration(ptr);
      break;

    case 5:

      printf("\n");
      print_backward_recursion(ptr);
      printf("\n");

      break;

    case 6:
      printf("\nThank you for using this program.\n");
    break;

    default:
      printf("\nInvalid Choice. Please try again.\n");
      break;

    }
    }
  while (choice != 6);

  printf("\n*** End of Program ***\n");
  return 0;
}

/* definition of function insert_node */
NODE* insert_node(NODE *ptr, NODE *new)
{

 new -> next = ptr;
 return new;

}

/* definition of function find_node */
NODE* find_node(NODE *ptr, int n)
{

  while (ptr != NULL)
    {
      if (ptr->data == n)  
    {
      return ptr;
    }
      else
    {
      ptr = ptr->next;
    }
    }
  return NULL;
  }

/* definition of function print_backward_iteration */
void print_backward_iteration(NODE *ptr)
{
  NODE *last, *current;

  last = NULL;

  printf("\n");

  while (ptr != last)
    {
      current = ptr;

      while (current != last)
    {
      current =  current -> next;
    }

      printf("%d  ", current -> data);
      last = current -> next;
    }

    printf("\n");

}

/* definition of function print_backward_recursion */
void print_backward_recursion(NODE *ptr)
{
  NODE *last, *current;

  last = NULL;

  while (ptr != last)
      {
    current = ptr;
    printf("%d  ", current -> data);
    print_backward_recursion(current -> next);
    last = current;
      }

}

1 个答案:

答案 0 :(得分:3)

你必须做这样的事情:

NODE* delete_node(NODE * ptr, int n, int *success_flag)
{
   Node *aux = NULL;

   if(ptr == NULL) // this means that theres is no 'n' in this linked list
   {
    *success_flag = 0;  // means no value found
    return NULL;
   }
   if(ptr-> n == n){     // if this is the value you want
      aux = ptr->next;   // aux will point to the remaining list
      free(ptr);         // free the actual node
      *success_flag = 1; // mark as success 
      return aux;        // return the pointer to the remaining list
    }
   else // lets see the remaining nodes 
      ptr->next = delete_node(ptr->next,n,success_flag); 

  return ptr;
 }