Линейные двухсвязные списки


Удаление элемента из списка



бет2/2
Дата04.11.2023
өлшемі0,97 Mb.
#189283
1   2
Байланысты:
Dvusvyaznye spiski

Удаление элемента из списка.
При удалении существуют два варианта:







Реализация функции
HEAD* delete_node(HEAD* head, int delete_data)
{
ITEM *cur, *prev;/*curr - указаетль на текущий узел, prev - указатель на предыдущий узел*/
prev=NULL;
cur=head->first;/*начинаем с головного элемента*/
while(cur!=NULL && cur->data<=delete_data)/*пока не конец списка и элемент еще может встретиться в списке*/
{
if(cur->data==delete_data)/*проверяем текущий элемент*/
{
/*удаление*/
if(prev==NULL)
{
printf("Delete first %d \n",cur->data);
/*удаление первого*/
head->first=cur->next;/*первым становиться следующий элемент после первого*/
if(head->first!=NULL)
head->first->previos=NULL;
if(head->first==NULL)
head->last=NULL;
}
else if(cur==head->last)
{
printf("Delete last %d \n",cur->data);
/*удаление последнего*/
head->last=prev;/*последним становиться элемент перед удаляемым*/
prev->next=NULL;/*следующего не будет*/
}
else
{
/*удаление любого другого элемента*/
prev->next=cur->next;
cur->next->previos=prev;
}
free(cur);/*освобождаем память*/
return head;
}
/*иначе переходим на следующий элемент*/
prev=cur;
cur=cur->next;
}
printf("Element %d not found \n",delete_data);
return head;/*голова не поменялась*/
}

Основная функция


int main()
{
HEAD *Head=NULL;
char key;
int chislo;
while(1)
{
clrscr();
puts("1 - insert element");
puts("2 - delete element");
puts("3 - print");
puts("ESC - exit");
key=getch();
switch(key)
{
case '1':
puts("Enter number");
scanf("%d",&chislo);
Head=add_node(Head,chislo);
getch();
break;
case '2':
puts("Enter number");
scanf("%d",&chislo);
Head=delete_node(Head,chislo);
getch();
break;
case '3':
print_begin(Head);
print_end(Head);
getch();
break;
case 27:
puts("Exit");
getch();
return 0;
}
}
return 0;
}

Достарыңызбен бөлісу:
1   2




©www.engime.org 2024
әкімшілігінің қараңыз

    Басты бет