Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.93
letnjaja
53 / 3 / 16
Регистрация: 08.10.2011
Сообщений: 200
#1

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

20.09.2012, 12:46. Просмотров 2194. Ответов 9
Метки нет (Все метки)

помогите, пжлста, уже мучаюсь несколько дней, нужна незамысловатая функция,которая удаляет заданный элемент из односвязного списка
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#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");
}
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.09.2012, 12:46
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Удаление элемента из односвязного списка (C (СИ)):

Удаление элемента из односвязного списка
Есть односвязный список из 50 целых случайных неуникальных чисел, допустим от 1...

Удаление элемента из односвязного списка
Почему не работает функция удаления идентификатора? Как ее можно переделать? ...

Удаление последнего элемента из односвязного списка
добрый вечер. помогите, пжлста, разобраться, пытаюсь удалить последний элемент...

Удаление всех элементов односвязного списка
есть односвязный список из struct el{ int val; struct el*...

Удаление узла из односвязного списка. + Сортировка
Уважаемые, форумчане! Помогите разобраться с работой функции void...

Поиск элемента односвязного списка по значению поля (я в отчаянии.)
Сделал односвязный список и множество функций для него. Сама структура в виде:...

9
СашаН
268 / 268 / 144
Регистрация: 15.03.2012
Сообщений: 596
Записей в блоге: 1
20.09.2012, 15:04 #2
Цитата Сообщение от letnjaja Посмотреть сообщение
которая удаляет заданный элемент
Заданный элемент по значению или по номеру в сриске?
0
alkagolik
Заблокирован
20.09.2012, 15:24 #3
уже было http://www.cyberforum.ru/post3453324.html
0
letnjaja
53 / 3 / 16
Регистрация: 08.10.2011
Сообщений: 200
20.09.2012, 16:36  [ТС] #4
по значению
тот пример для меня сложноват, мне бы че попроще, чтобы разобраться
0
Buckstabue
177 / 126 / 24
Регистрация: 12.01.2012
Сообщений: 624
20.09.2012, 21:46 #5
Я бы так реализовал. Только я давным давно с указателями не работал и не знаю насколько правильна построена функция
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
void del_element(list_el *head, int val)
{
   if (head == NULL)
      // пустой список
      return;
 
   list_el *curElement = *head; // текущий элемент при переборе
   list_el *prevElement = NULL; // предыдущий элемент при переборе
   do
   {
      if (curElement->value == val)
      {
         if (prevElement != NULL)
         { // удаление элемента не в начале списка
            prevElement->next = curElement->next;
            free(curElement);
            curElement = NULL;
            return;
         }
         else
         { // удаление элемента в начале списка
            list_el *newHead = head->next; // новая голова
            free(head);
            head = newHead;
         }
      }
   } while ((curElement = curElement->next) != NULL);
}
1
letnjaja
53 / 3 / 16
Регистрация: 08.10.2011
Сообщений: 200
21.09.2012, 02:33  [ТС] #6
помогите довести до ума программу

C:\Users\....\Desktop\dddddddddddddddd.cpp In function `void del_element(list_el*, int)':
C:\Users\....\Desktop\dddddddddddddddd.cpp In function `void del_element(list_el*, int)':

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#include<stdlib.h>
#include<stdio.h>
 
struct list_el {
   int value;
   struct list_el * next; //ukazatelj na sledujuwij element
};
 
typedef struct list_el item;
void del_element(void);
 
//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;
   //vivod elementov
   while(curr) {
      printf("%d\n", curr->value);
      curr = curr->next ;
   }
   //stem("pause");
}
   
  
   //udalenie elementov
   void del_element(list_el *head, int val)
{
   if (head == NULL)
      // pustoj spisok
      return;
 
   list_el *curElement = *head; // tekuwij element pri perebore
   list_el *prevElement = NULL; // prediduwij element pri perebore
   printf ("vvedite zna4enie:");
   scanf ("%d",&val);
   do
   {
      if (curElement->value == val)
      {
         if (prevElement != NULL)
         { // udalenie elementa ne v na4ale spiska
            prevElement->next = curElement->next;
            free(curElement);
            curElement = NULL;
            return;
         }
         else
         { // udalenie elementa v na4ale
            list_el *newHead = head->next; // novaja golova
            free(head);
            head = newHead;
         }
      }
   } while ((curElement = curElement->next) != NULL);
   printf("%d\n", curElement->value);
      curElement = curElement->next ;
}
0
Buckstabue
177 / 126 / 24
Регистрация: 12.01.2012
Сообщений: 624
21.09.2012, 13:49 #7
Я дал не конкретный код, а общий алгоритм(к тому ж с ошибками ). Если нужен более конкретный код, то я бы реализовал его примерно так:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#include<stdlib.h>
#include<stdio.h>
 
struct list_el {
   int value;
   struct list_el * next; //ukazatelj na sledujuwij element
};
 
typedef struct list_el item;
 
void del_element(item **head, const int val);
// положить в конец списка
void push_back(item **head, const int val);
 
//glavnaja 4astj
int main()
{
   item * curItem, * 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++)
   {
      push_back(&head, i);
   }
 
   del_element(&head, 2);
   curItem = head;
   //vivod elementov
   while(curItem)
   {
      printf("%d\n", curItem->value);
      curItem = curItem->next ;
   }
   //stem("pause");
 
   return 0;
}
 
 
//udalenie elementov
void del_element(item **head, const int val)
{
   if (head == NULL || *head == NULL)
      // pustoj spisok
      return;
 
   item *curItem = *head; // tekuwij element pri perebore
   item *prevItem = NULL; // prediduwij element pri perebore
 
   do
   {
      if (curItem->value == val)
      {
         if (prevItem != NULL)
         { // udalenie elementa ne v na4ale spiska
            prevItem->next = curItem->next;
            free(curItem);
            curItem = NULL;
         }
         else
         { // udalenie elementa v na4ale
            item *newHead = (*head)->next; // novaja golova
            free(*head);
            *head = newHead;
         }
 
         return;
      }
      prevItem = curItem;
   } while ((curItem = curItem->next) != NULL);
}
 
void push_back(item **head, const int val)
{
   if (head == NULL)
      return;
 
   if (*head == NULL)
   {
      // если список пуст или не инициализирован
      *head = (item *)malloc(sizeof (item));
      (*head)->value = val;
      (*head)->next = NULL;
   }
   else
   {
      item *curItem;
      item *newItem = (item *)malloc(sizeof (item));
 
      newItem->next = NULL;
      newItem->value = val;
 
      // вычисление последнего элемента
      for (curItem = *head; curItem->next != NULL; curItem = curItem->next);
 
      curItem->next = newItem;
   }
}
0
letnjaja
53 / 3 / 16
Регистрация: 08.10.2011
Сообщений: 200
21.09.2012, 14:00  [ТС] #8
Bukstabue, можешь объяснить, что делает функция push_back?

Добавлено через 1 минуту
она тут обязательна?
0
Buckstabue
177 / 126 / 24
Регистрация: 12.01.2012
Сообщений: 624
21.09.2012, 15:39 #9
letnjaja, просто добавляет в конец списка определенное значение, написал эту функцию, так как не понял как работает ваш способ заполнения. Вообще, можно ускорить добавление в конец списка, если передавать ему сразу же указатель на этот самый конец. Она тут не обязательна, но чтобы продемонстрировать работу del_element() список надо как-то заполнить
0
СашаН
268 / 268 / 144
Регистрация: 15.03.2012
Сообщений: 596
Записей в блоге: 1
22.09.2012, 00:39 #10
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Вот с удалением по значению.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
#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;
}
3
22.09.2012, 00:39
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.09.2012, 00:39
Привет! Вот еще темы с решениями:

Удаление первого элемента из списка
Нужно удалить 1-ый элемент списка. #include &lt;stdio.h&gt; #include...

Удаление элемента связанного списка
Здравствуйте, у меня есть программа и нужно удалить элемент из связанного...

Удаление максимального элемента из однонаправленного списка
//программа создания однонапрвленного целого списка #include&lt;stdio.h&gt;...

Очередь на базе списка: добавление элемента, удаление, поиск в очереди, вывод на экран
Может у кого есть готовое решение этого задания, буду Вам очень признателен....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru