Удаление из списка всех элементов, начиная с к-го по порядку - C (СИ)
Формулировка задачи:
Дан список идентификаторов. Длина каждого идентификатора не более 8 символов. Идентификаторы в списке расположены в лексикографическом порядке. Нужно составить функцию (подпрограмму) для удаления из списка всех элементов, начиная с k-го по порядку. Где черточки нужна функция. помогите пожалуйста
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <conio.h> #define MAXDL 9 /*макс.длина ид-ра(строки символов с признаком конца '\0')*/ struct el_sp /* элемент списka */ { char id [MAXDL]; /* идентификатор */ struct el_sp *sled; /* ссылка на следующий элемент */ }; /*-----------------------------------------------------------*/ /* функция включения очередного идентификатора в список */ /*-----------------------------------------------------------*/ void vkl ( struct el_sp **p, char t_id[] ) /* Вх. данные: *p - указатель списка идентификаторов в лексикографическом порядке, t_id - включаемый в список (текущий) ид-р */ /* Вых. данные: *p */ { struct el_sp *pt, /* указатель включаемого эл-та */ *k,*j; /* указатели очередного и предыдущего элементов списка */ /* выделение памяти для нового эл-та списка */ pt=(struct el_sp *)malloc(sizeof(struct el_sp)); strcpy(pt->id,t_id); if (*p==NULL || strcmp(pt->id,(*p)->id)<0) { /* включение ид-ра в начало списка */ pt->sled=*p; *p=pt; } else { /* поиск элемента списка, после которого нужно включить идентификатор */ k=*p; while (k!=NULL && strcmp(pt->id,k->id)>=0) { j=k; k=k->sled; } /* включение эл-та *pt после элемента *j */ j->sled=pt; pt->sled=k; } } /*----------------------------------------------------------*/ /* функция для удаления элементов */ /*----------------------------------------------------------*/ - - - - - - /*-----------------------------------------------------------*/ /* функция печати списка */ /*-----------------------------------------------------------*/ void pech_sp ( struct el_sp *p ) /* Вх. данные: p - указатель начала списка */ { struct el_sp *i; /* указатель текущего элемента списка */ printf ("\nRezultat:\n"); for ( i=p; i!=NULL; i=i->sled ) puts (i->id); } /*------------------------------------------------*/ /* О С Н О В Н А Я П Р О Г Р А М М А */ /*------------------------------------------------*/ int main() { struct el_sp *p; /* указатель начала списка */ unsigned n ; /* количество идентификаторов */ unsigned i ; /* параметр цикла */ char t_id[MAXDL]; /* текущий идентификатор */ printf ("\nВведите число идентификаторов\n n="); scanf ("%u",&n); getchar(); /* пропуск символа "перевод строки" */ p=NULL; /* список пока пуст */ printf ("Введите идентификаторы"); printf ("(после каждого нажимайте клавишу <Enter>)\n"); for ( i=1; i<=n; i++ ) { gets (t_id); vkl (&p,t_id); /* включение ид-ра в список */ } /*------------------------------------------------*/ /* Печать списка */ /*------------------------------------------------*/ - - - - }
Решение задачи: «Удаление из списка всех элементов, начиная с к-го по порядку»
textual
Листинг программы
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <conio.h> #define MAXDL 9 /* макс.длина ид-ра(строки символов с признаком конца '\0')*/ struct el_sp /* элемент списka */ { char id[MAXDL]; /* идентификатор */ struct el_sp* sled; /* ссылка на следующий элемент */ }; /*-----------------------------------------------------------*/ /* функция включения очередного идентификатора в список */ /*-----------------------------------------------------------*/ void vkl(struct el_sp** p, char t_id[]) /* Вх. данные: *p - указатель списка идентификаторов в лексикографическом порядке, t_id - включаемый в список (текущий) ид-р */ /* Вых. данные: *p */ { struct el_sp* pt, /* указатель включаемого эл-та */ *k, *j; /* указатели очередного и предыдущего элементов списка */ /* выделение памяти для нового эл-та списка */ pt = (struct el_sp*)malloc(sizeof(struct el_sp)); strcpy(pt->id, t_id); if (*p == NULL || strcmp(pt->id, (*p)->id) < 0) { /* включение ид-ра в начало списка */ pt->sled = *p; *p = pt; } else { /* поиск элемента списка, после которого нужно включить идентификатор */ k = *p; while (k != NULL && strcmp(pt->id, k->id) >= 0) { j = k; k = k->sled; } /* включение эл-та *pt после элемента *j */ j->sled = pt; pt->sled = k; } } /*----------------------------------------------------------*/ /* функция для удаления элементов */ /*----------------------------------------------------------*/ struct el_sp* delete(struct el_sp** p, int k) { if (*p != NULL) { delete(&(*p)->sled, k-1); } if (k <= 0) { free(*p); *p = NULL; } return *p; } /*-----------------------------------------------------------*/ /* функция печати списка */ /*-----------------------------------------------------------*/ void pech_sp(struct el_sp* p) /* Вх. данные: p - указатель начала списка */ { struct el_sp* i; /* указатель текущего элемента списка */ printf("\nRezultat:\n"); for (i = p; i != NULL; i = i->sled) { puts(i->id); } } /*------------------------------------------------*/ /* О С Н О В Н А Я П Р О Г Р А М М А */ /*------------------------------------------------*/ int main() { struct el_sp* p; /* указатель начала списка */ unsigned n ; /* количество идентификаторов */ unsigned i ; /* параметр цикла */ char t_id[MAXDL]; /* текущий идентификатор */ printf("\nВведите число идентификаторов\n n="); scanf("%u", &n); getchar(); /* пропуск символа "перевод строки" */ p = NULL; /* список пока пуст */ printf("Введите идентификаторы"); printf("(после каждого нажимайте клавишу <Enter>)\n"); for (i = 1; i <= n; i++) { gets(t_id); vkl(&p, t_id); /* включение ид-ра в список */ } /*------------------------------------------------*/ /* Печать списка */ /*------------------------------------------------*/ pech_sp(p); int k; printf("Задайте номер с которого будет выполнено удаление: "); scanf("%d", &k); delete(&p, k); pech_sp(p); return 0; }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д