Удаление элемента из односвязного списка - C (СИ) (77017)

Узнай цену своей работы

Формулировка задачи:

помогите, пжлста, уже мучаюсь несколько дней, нужна незамысловатая функция,которая удаляет заданный элемент из односвязного списка
#include<stdlib.h>
#include<stdio.h>
 
struct list_el {
   int value;
   struct list_el * next; //ukazatelj na sledujuwij element
};
 
typedef struct list_el item;
//glavnaja 4astj
int main() {
   item * curr, * head; //inicializacija elementov strukturi: tekuwij element i pervij element
   int i;
   int node_number;
//izna4aljno pustoj spisok
   head = NULL;
//sozdanie elementov spiska
printf ("enter the number of nodes?");
scanf ("%d", &node_number);
   for(i=1;i<=node_number;i++) {
      curr = (item *)malloc(sizeof(item));
      curr->value = i; //zadaem zna4enie dlja kawdogo elementa
      curr->next  = head; //ukazivaem na na4alo spiska
      head = curr; 
   }
 
   curr = head;

   struct list_el *search_list_el (struct list_el *head, int index)
   {
          struct list_el *curr;
          for (curr=head; curr!=NULL;curr=curr->next)
          if (curr->value==index)
          return curr;
          return NULL;
          }
   //udalenie elementov

//vivod elementov
   while(curr) {
      printf("%d\n", curr->value);
      curr = curr->next ;
   }
   system("pause");
}

Решение задачи: «Удаление элемента из односвязного списка»

textual
Листинг программы
#include<stdlib.h>
#include<stdio.h>
 
///// VARS /////
struct list_element {
  int value;
  struct list_element * next;
};
 
typedef struct list_element item;
 
 
///// FUNCPROTS /////
item *create_list(void);
int print_list(item *head);
item *delete_value(item *head);
 
 
///// MAIN /////
int main(void)
{
  item *head;
  
  head = create_list();
  while(print_list(head)) {
    head = delete_value(head);
  }    
  puts("Goodbye!");
  return 0;
}
 
 
///// FUNCTIONS ///////
 
item *create_list(void)
{
  int i;
  int node_number;
  item *curr,
       *head = NULL;
 
  printf ("enter the number of nodes?");
  scanf ("%d", &node_number);
    
  for(i=1; i<=node_number; i++) {
    curr = (item *)malloc(sizeof(item));
    curr->value = i; 
    curr->next  = head;
    head = curr; 
  }
  return head;
}
 
 
int print_list(item *head)
{
  int i = 0;
  item *curr = head;
  
  while(curr) {
    printf("%d\n", curr->value);
    curr = curr->next;
    ++i;
  }
  return i;
}
 
 
item *delete_value(item *head)
{
  int value;
  item *current, *previous;
  
  current = head;
  printf("value for removing: ");
  scanf("%i", &value);
 
  while(current) {
    if (current->value == value) {
      if (current == head) {
        if (head->next == NULL) {
          free(current);
          return head = NULL;
        }
        head = current->next;
        free(current);
        current = head;
      }
      else {
        if (current->next != NULL) {
          previous->next = current->next;
          free(current);
          current = previous->next;
        }
        else {
          previous->next = NULL;
          free(current);
          return head;
        }
      }
    }
    previous = current;
    current = previous->next;
  }
  if (head == current) head = current;
  return head;
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 4.091 из 5
Похожие ответы