Удаление элемента из односвязного списка - 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;
}