Struct+List ++
.pdf
Структура списка
линейный односвязный список
линейный двусвязный список
11
кольцевые двусвязные списки
(circular doubly list)
12
Кольцевой (циклический)
односвязный список
13
Ортогональные (многосвязные ) списки
- нелинейные структуры
Основные операции над списками
вцелом над списком
•создание списка – уничтожение списка
•печать списка
•сохранение – восстановление списка ( файл)
•сортировка списка
•копирование списка
•объединение списков (сортированных и не) над элементами списка
•включение – удаление элемента
•поиск и обработка элемента
15
Элемент списка в C программе
// двусвязный список struct LIST // ITEM, NODE
{ int x; // все типы данных data + key LIST *next,*prev;
};
typedef struct tagLIST // ITEM, NODE { int x; // все типы данных data + key
LIST *next,*prev; } LIST, *pLIST;
int main ()
{LIST *head, *last;
……………………………………..
} |
16 |
Создание “случайного”списка
LIST *CreateRandList(LIST *&head, LIST *&last, int n, int m) { int i; LIST *p,*q;
for(i=0; i<n; i++)
{ p=(LIST *)malloc(sizeof(LIST)); if(i==0) { head=p; head->prev=0;}
p->x=rand()%m; // случайные числа 0..m-1
if(i!=0) { q->next=p; |
p->prev=q; } |
q=p; |
|
} |
|
p->next=0; |
|
last=p; |
|
return head; |
|
} // CreateRandList |
17 |
Search Item in List
int SearchList(LIST *head, LIST *&out, int a) { int i, k=-1; LIST *p = head;
out=0; for(i=0; p; i++)
{ if(a==p->x)
{k=i; out=p; break; } p=p->next;
}
return k;
}
18
Insert item to list
p->prev p
s
19
Insert Item to sorted list: before & after
LIST* InsertSortedList(LIST *&head, LIST *&end, LIST *s) { LIST *p=head,*q;
while(p && s->z<p->x)
{ q=p; p=p->next; } // q=p->prev
if(!head) { s->prev=0; s->next=0; head=s; end=s;} else if(p==head) { s->prev=0; s->next=p; head=s; } else if(p==0) { s->prev=q; s->next=0; end=s; } else
{ s->prev=q; s->next=p; } return p;
}
20
