Удалить из списка заданный идентификатор (первый по порядку, если таких в списке несколько) - C (СИ)
Формулировка задачи:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#define MAXDL 9 /* макс.длина ид-ра (строки символов с
признаком конца '\0' ) */
struct EL_SP /* тип элемента списка */
{ 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 PechSp ( struct EL_SP *p )
/* Вх. данные: p - указатель начала списка */
{ struct EL_SP *i; /* указатель текущего элемента списка */
printf ("\nРезультат:\n");
for ( i=p; i!=NULL; i=i->sled )
puts (i->id);
}
/*-----------------------------------------------------------*/
/* О С Н О В Н А Я П Р О Г Р А М М А */
/*-----------------------------------------------------------*/
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); /* включение ид-ра в список */
}
PechSp (p); /* печать списка */
printf ("\n\nДля завершения нажмите любую клавишу\n");
getch();
}Решение задачи: «Удалить из списка заданный идентификатор (первый по порядку, если таких в списке несколько)»
textual
Листинг программы
#include <iostream>
using namespace std;
struct item{
item * nextItem;
item * prevItem;
int number;
};
void print(item * it)
{
while(it)
{
cout << it->number;
it = it->nextItem;
}
}
void deleteItem(item * it)
{
item * pr, * next;
pr = it->prevItem;
next = it->nextItem;
delete it;
if(pr && next)
{
pr->nextItem = next;
next->prevItem = pr;
}
}
int main(int argc, char* argv[])
{
item * firstItem;
item * currentItem = NULL;
for (;;)
{
cout << "Please, input some number or input -1 to go away: ";
int number;
cin >> number;
if(number == -1)
break;
item * newCurrentItem = new item;
newCurrentItem->nextItem = newCurrentItem->prevItem = NULL;
newCurrentItem->number = number;
if(currentItem)
{
currentItem->nextItem = newCurrentItem;
newCurrentItem->prevItem = currentItem;
}
else
firstItem = newCurrentItem;
currentItem = newCurrentItem;
}
system("pause");
return 0;
}