Удаление узла из списка

Вставка узла

a) в начало списка

start

 

temp

 

 


temp->next = start;

start = temp;

 

 

b) в середину списка

start current

 

 
 

 

 


 

temp

 

temp->next = current->next;

current->next = temp;

a) в конец списка

 

end temp

 

end->next = temp;

end = temp;

end->next = NULL;

 

a) первого узла

start

 

 


TelNum *del = start;

start = start->next;

delete del;

 

b) В середине писка

 
 


current del

 

TelNum *del = current->next;

current->next = del->next;

delete del;

 

c) в конце списка

current end

 

 

TelNum *del = end;

current->next=NULL;

delete del;

end = current;

Алгоритмы, приведенные выше, обладают существенным недостатком - если необходимо произвести вставку или удаление ПЕРЕД заданным узлом, то так как неизвестен адрес предыдущего узла, невозможно получить доступ к указателю на удаляемый (вставляемый) узел и для его поиска надо произвести обход списка, что для больших списков неэффективно. Избежать этого позволяет двунаправленный список, который имеет два указателя: один - на последующий узел, другой - на предыдущий.

 

 
 


start

 

 

NULL

 

// Пример программы работы с односвязным списком

#include <stdio.h>

#include <conio.h>

struct TelNum;

int printAllData(TelNum * start);

int inputData(TelNum * n);

struct TelNum

{

TelNum * next;

long number;

char name[30];

};

// Описание: печать списка

int printAllData(TelNum * start){

int c=0;

for(TelNum * t=start;t; t= t->next)

printf("#%3.3i %7li %s\n",++c,t->number,t->name);

return 0;

}

// Описание: ввод данных в структуру n конец ввода - ввод нуля

// в первое поле. Возвращает 1 если конец ввода

int inputData(TelNum * n){

printf("Номер?"); scanf("%7li",&n->number);

if(!n->number) return 1;

printf("Имя? "); scanf("%30s",&n->name);

return 0;

}

void main(void){

TelNum * start = NULL; //сторож

TelNum * end = start;

do{ //блок добавления записей

TelNum * temp = new TelNum;

if(inputData(temp)) {

delete temp;

break;

}

else {

if(start==NULL) {

temp->next = start;

start = temp;

end = temp;

}

else {

end->next=temp;

end=temp;

end->next=NULL;

}

}

}while(1);

printf("\nЗаписи после добавления новых:\n");

printAllData(start);

getch();

do{ //блок удаления записей

TelNum * deleted = start;

start = start->next;

delete deleted;

printAllData(start);

getch();

}while(start!=NULL);

}