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