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

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


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

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

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