🗊Презентация Динамические структуры данных: списки

Нажмите для полного просмотра!
Динамические структуры данных: списки, слайд №1Динамические структуры данных: списки, слайд №2Динамические структуры данных: списки, слайд №3Динамические структуры данных: списки, слайд №4Динамические структуры данных: списки, слайд №5Динамические структуры данных: списки, слайд №6Динамические структуры данных: списки, слайд №7Динамические структуры данных: списки, слайд №8Динамические структуры данных: списки, слайд №9Динамические структуры данных: списки, слайд №10Динамические структуры данных: списки, слайд №11Динамические структуры данных: списки, слайд №12Динамические структуры данных: списки, слайд №13Динамические структуры данных: списки, слайд №14Динамические структуры данных: списки, слайд №15Динамические структуры данных: списки, слайд №16Динамические структуры данных: списки, слайд №17Динамические структуры данных: списки, слайд №18Динамические структуры данных: списки, слайд №19Динамические структуры данных: списки, слайд №20Динамические структуры данных: списки, слайд №21Динамические структуры данных: списки, слайд №22Динамические структуры данных: списки, слайд №23Динамические структуры данных: списки, слайд №24Динамические структуры данных: списки, слайд №25Динамические структуры данных: списки, слайд №26Динамические структуры данных: списки, слайд №27Динамические структуры данных: списки, слайд №28Динамические структуры данных: списки, слайд №29Динамические структуры данных: списки, слайд №30Динамические структуры данных: списки, слайд №31Динамические структуры данных: списки, слайд №32Динамические структуры данных: списки, слайд №33Динамические структуры данных: списки, слайд №34Динамические структуры данных: списки, слайд №35Динамические структуры данных: списки, слайд №36Динамические структуры данных: списки, слайд №37Динамические структуры данных: списки, слайд №38Динамические структуры данных: списки, слайд №39Динамические структуры данных: списки, слайд №40Динамические структуры данных: списки, слайд №41Динамические структуры данных: списки, слайд №42Динамические структуры данных: списки, слайд №43Динамические структуры данных: списки, слайд №44Динамические структуры данных: списки, слайд №45Динамические структуры данных: списки, слайд №46Динамические структуры данных: списки, слайд №47Динамические структуры данных: списки, слайд №48Динамические структуры данных: списки, слайд №49Динамические структуры данных: списки, слайд №50

Содержание

Вы можете ознакомиться и скачать презентацию на тему Динамические структуры данных: списки. Доклад-сообщение содержит 50 слайдов. Презентации для любого класса можно скачать бесплатно. Если материал и наш сайт презентаций Mypresentation Вам понравились – поделитесь им с друзьями с помощью социальных кнопок и добавьте в закладки в своем браузере.

Слайды и текст этой презентации


Слайд 1





Лекции 12 - 13
Динамические структуры данных: списки
Описание слайда:
Лекции 12 - 13 Динамические структуры данных: списки

Слайд 2





Динамические структуры данных
Динамическая структура данных – структура данных создаваемая в процессе выполнения программы и размещаемая в динамически выделенной памяти.
Классификация
По способу хранения:
Последовательное хранение;
Связанное хранение.
По методу доступа:
Произвольный доступ;
Упорядоченный доступ.
По логической структуре:
Линейные;
Разветвляющиеся;
Произвольные.
Описание слайда:
Динамические структуры данных Динамическая структура данных – структура данных создаваемая в процессе выполнения программы и размещаемая в динамически выделенной памяти. Классификация По способу хранения: Последовательное хранение; Связанное хранение. По методу доступа: Произвольный доступ; Упорядоченный доступ. По логической структуре: Линейные; Разветвляющиеся; Произвольные.

Слайд 3





Динамическая структура данных список
Список – линейная динамическая структура данных, как правило, одного типа, произвольного доступа к элементам, каждый элемент которой имеет два соседних элемента, называемых предыдущим и последующим элементом в списке (сам элемент в этом случае называется текущим).
Основные операции для работы со списками:
Перемещение по списку;
Добавление элементов в список;
Удаление элементов из списка;
Удаление всего списка;
Доступ к элементам списка;
Дополнительные операции (сортировка, поиск и т.д. и т.п.).
Описание слайда:
Динамическая структура данных список Список – линейная динамическая структура данных, как правило, одного типа, произвольного доступа к элементам, каждый элемент которой имеет два соседних элемента, называемых предыдущим и последующим элементом в списке (сам элемент в этом случае называется текущим). Основные операции для работы со списками: Перемещение по списку; Добавление элементов в список; Удаление элементов из списка; Удаление всего списка; Доступ к элементам списка; Дополнительные операции (сортировка, поиск и т.д. и т.п.).

Слайд 4





Виды списков
Виды списков определяются исходя из метода хранения:
Последовательные списки;
Связанные списки;
Гибридные (смешанные) списки.
Описание слайда:
Виды списков Виды списков определяются исходя из метода хранения: Последовательные списки; Связанные списки; Гибридные (смешанные) списки.

Слайд 5





Последовательные списки
Основные переменные используемые для работы с последовательным списком:
Указатель на начало списка;
Текущий размер списка.
Принцип организации списка с последовательным хранением:
Описание слайда:
Последовательные списки Основные переменные используемые для работы с последовательным списком: Указатель на начало списка; Текущий размер списка. Принцип организации списка с последовательным хранением:

Слайд 6





Переменные и типы для работы с последовательным списком
Типы данных:

typedef struct{
  TYPE *list;
  int count;
} LIST;
Описание слайда:
Переменные и типы для работы с последовательным списком Типы данных: typedef struct{ TYPE *list; int count; } LIST;

Слайд 7





Добавление элемента в конец списка
int Add(LIST *ls, TYPE val)
{
  TYPE *tmp = (TYPE*)realloc(ls->list,(ls->count+1)*sizeof(TYPE));
  if(!tmp) return 0;
  if(tmp!=ls->list) ls->list = tmp;
  ls->list[ls->count] = val;
  ls->count++;
  return 1;
}
Описание слайда:
Добавление элемента в конец списка int Add(LIST *ls, TYPE val) { TYPE *tmp = (TYPE*)realloc(ls->list,(ls->count+1)*sizeof(TYPE)); if(!tmp) return 0; if(tmp!=ls->list) ls->list = tmp; ls->list[ls->count] = val; ls->count++; return 1; }

Слайд 8





Вставка элемента на определенную позицию в списке
int Ins(LIST *ls,TYPE val, int ind)
{
  if(ind<0) return 0;
  if(ls->count <= ind) return Add(ls,val);
  TYPE *tmp = (TYPE*)realloc(ls->list,(ls->count+1)*sizeof(TYPE));
  if(!tmp) return 0;
  if(tmp!=ls->list) ls->list = tmp;
  for(int i=ls->count;i>ind;i--) ls->list[i] = ls->list[i-1];
  ls->list[ind] = val;
  ls->count++;
  return 1;
}
Описание слайда:
Вставка элемента на определенную позицию в списке int Ins(LIST *ls,TYPE val, int ind) { if(ind<0) return 0; if(ls->count <= ind) return Add(ls,val); TYPE *tmp = (TYPE*)realloc(ls->list,(ls->count+1)*sizeof(TYPE)); if(!tmp) return 0; if(tmp!=ls->list) ls->list = tmp; for(int i=ls->count;i>ind;i--) ls->list[i] = ls->list[i-1]; ls->list[ind] = val; ls->count++; return 1; }

Слайд 9





Удаление элемента из списка
int Del(LIST *ls, int ind)
{
  if((ind<0)||(ind>=ls->count)) return 0;
  for(int i=ind;i<ls->count-1;i++) ls->list[i] = ls->list[i+1];
  ls->list = (TYPE*)realloc(ls->list,(ls->count-1)*sizeof(TYPE));
  ls->count--;
  return 1;
}
Описание слайда:
Удаление элемента из списка int Del(LIST *ls, int ind) { if((ind<0)||(ind>=ls->count)) return 0; for(int i=ind;i<ls->count-1;i++) ls->list[i] = ls->list[i+1]; ls->list = (TYPE*)realloc(ls->list,(ls->count-1)*sizeof(TYPE)); ls->count--; return 1; }

Слайд 10





Графическое изображение операция добавления, вставки и удаления элемента
Описание слайда:
Графическое изображение операция добавления, вставки и удаления элемента

Слайд 11





Изменение и получение элемента из списка
int Set(LIST *ls, TYPE val, int ind)
{
  if((ind<0)||(ind>=ls->count)) return 0;
  ls->list[ind] = val;
  return 1;
}
int Get(LIST *ls, TYPE *val, int ind)
{
  if((ind<0)||(ind>=ls->count)) return 0;
  *val = ls->list[ind];
  return 1;
}
Описание слайда:
Изменение и получение элемента из списка int Set(LIST *ls, TYPE val, int ind) { if((ind<0)||(ind>=ls->count)) return 0; ls->list[ind] = val; return 1; } int Get(LIST *ls, TYPE *val, int ind) { if((ind<0)||(ind>=ls->count)) return 0; *val = ls->list[ind]; return 1; }

Слайд 12





Удаление всего списка, определение его размера, инициализация
void Destroy(LIST *ls)
{
  if(ls->list) free(ls->list);
  ls->list = NULL; ls->count = 0;
}

int Count(LIST *ls) { return ls->count; }

void Init(LIST *ls)
{
  ls->list = NULL; ls->count = 0;
}
Описание слайда:
Удаление всего списка, определение его размера, инициализация void Destroy(LIST *ls) { if(ls->list) free(ls->list); ls->list = NULL; ls->count = 0; } int Count(LIST *ls) { return ls->count; } void Init(LIST *ls) { ls->list = NULL; ls->count = 0; }

Слайд 13





Пример использования
Пользователь с клавиатуры вводит целые числа. Признак завершения – ввод пустой строки. Вывести на экран сначала четные значения, упорядоченные по возрастанию, а затем нечетные значения, упорядоченные по убыванию).
Описание слайда:
Пример использования Пользователь с клавиатуры вводит целые числа. Признак завершения – ввод пустой строки. Вывести на экран сначала четные значения, упорядоченные по возрастанию, а затем нечетные значения, упорядоченные по убыванию).

Слайд 14





Пример использования
typedef int TYPE;
int cmpInc(const void *p1,const void *p2)
{
  return *((int*)p1) - *((int*)p2);
}
int cmpDec(const void *p1,const void *p2)
{
  return *((int*)p2) - *((int*)p1);
}
int main(int argc, char *argv[])
{
  LIST list1 = {NULL,0}, list2 = {NULL,0};
  while(1){
    char str[20];
    gets(str);
    if(str[0]==0) break;
    int val = atoi(str);
    Add((val%2==0)?&list2:&list1,val);
  }
  qsort(list2.list,list2.count,sizeof(TYPE),cmpInc);
  qsort(list1.list,list1.count,sizeof(TYPE),cmpDec);
Описание слайда:
Пример использования typedef int TYPE; int cmpInc(const void *p1,const void *p2) { return *((int*)p1) - *((int*)p2); } int cmpDec(const void *p1,const void *p2) { return *((int*)p2) - *((int*)p1); } int main(int argc, char *argv[]) { LIST list1 = {NULL,0}, list2 = {NULL,0}; while(1){ char str[20]; gets(str); if(str[0]==0) break; int val = atoi(str); Add((val%2==0)?&list2:&list1,val); } qsort(list2.list,list2.count,sizeof(TYPE),cmpInc); qsort(list1.list,list1.count,sizeof(TYPE),cmpDec);

Слайд 15





Пример использования
  printf("\nЧетные значения: ");
  for(int i=0,n=Count(&list2);i<n;i++){
    int val;
    Get(&list2,&val,i);
    printf("%d ",val);
  }
  printf("\nНечетные значения: ");
  for(int i=0,n=Count(&list1);i<n;i++){
    int val;
    Get(&list1,&val,i);
    printf("%d ",val);
  }
  puts("");
  Destroy(&list1); Destroy(&list2);
  return 0;
}
Описание слайда:
Пример использования printf("\nЧетные значения: "); for(int i=0,n=Count(&list2);i<n;i++){ int val; Get(&list2,&val,i); printf("%d ",val); } printf("\nНечетные значения: "); for(int i=0,n=Count(&list1);i<n;i++){ int val; Get(&list1,&val,i); printf("%d ",val); } puts(""); Destroy(&list1); Destroy(&list2); return 0; }

Слайд 16





Модификация
int InsInc(LIST *lst, TYPE val)
{
  for(int i=0,n=Count(lst);i<n;i++){
    int tmp;
    Get(lst,&tmp,i);
    if(tmp>=val) return Ins(lst,val,i);
  }
  return Add(lst,val);
}
int InsDec(LIST *lst, TYPE val)
{
  for(int i=0,n=Count(lst);i<n;i++){
    int tmp;
    Get(lst,&tmp,i);
    if(tmp<val) return Ins(lst,val,i);
  }  
  return Add(lst,val);
}
Описание слайда:
Модификация int InsInc(LIST *lst, TYPE val) { for(int i=0,n=Count(lst);i<n;i++){ int tmp; Get(lst,&tmp,i); if(tmp>=val) return Ins(lst,val,i); } return Add(lst,val); } int InsDec(LIST *lst, TYPE val) { for(int i=0,n=Count(lst);i<n;i++){ int tmp; Get(lst,&tmp,i); if(tmp<val) return Ins(lst,val,i); } return Add(lst,val); }

Слайд 17





Модификация (цикл ввода)
while(1){
  char str[20];
  gets(str);
  if(str[0]==0) break;
  int val = atoi(str);
  if(val%2==0) InsInc(&list2,val);
    else InsDec(&list1,val);
}
Описание слайда:
Модификация (цикл ввода) while(1){ char str[20]; gets(str); if(str[0]==0) break; int val = atoi(str); if(val%2==0) InsInc(&list2,val); else InsDec(&list1,val); }

Слайд 18





Преимущества и недостатки списков с последовательным хранением
Преимущества:
Быстрый доступ к элементам списка посредством индексации.
Недостатки:
Усложненность операций добавления и удаления элементов.
Описание слайда:
Преимущества и недостатки списков с последовательным хранением Преимущества: Быстрый доступ к элементам списка посредством индексации. Недостатки: Усложненность операций добавления и удаления элементов.

Слайд 19





Списки со связанным хранением
Виды списков со связанным хранением:
Однонаправленные списки;
Двунаправленные списки.
Описание слайда:
Списки со связанным хранением Виды списков со связанным хранением: Однонаправленные списки; Двунаправленные списки.

Слайд 20





Графическое изображение
Описание слайда:
Графическое изображение

Слайд 21





Типы данных и переменные для работы со связанными списками
Необходимо иметь элемент списка, который бы агрегировал три поля:
Данные заносимые в список;
Указатель на следующий элемент в списке;
Указатель на предыдущий элемент списка.
Описание слайда:
Типы данных и переменные для работы со связанными списками Необходимо иметь элемент списка, который бы агрегировал три поля: Данные заносимые в список; Указатель на следующий элемент в списке; Указатель на предыдущий элемент списка.

Слайд 22





Пример для двунаправленного списка
Переменные и типы:
typedef struct _Element{
	TYPE val;
	struct _Element *next, *prev;
} Element;
typedef struct{
  Element *head, *curr;
} LIST;
Описание слайда:
Пример для двунаправленного списка Переменные и типы: typedef struct _Element{ TYPE val; struct _Element *next, *prev; } Element; typedef struct{ Element *head, *curr; } LIST;

Слайд 23





Перемещение по списку
int MoveHead(LIST *ls)
{
  ls->curr = ls->head;
  if(ls->head == NULL) return 0;
  return 1;
}
int MoveNext(LIST *ls)
{
  if((ls->curr == NULL)||(ls->curr->next==NULL)) return 0;
  ls->curr = ls->curr->next;
  return 1;
}
int MovePrev(LIST *ls)
{
  if((ls->curr == NULL)||(ls->curr->prev==NULL)) return 0;
  ls->curr = ls->curr->prev;
  return 1;
}
Описание слайда:
Перемещение по списку int MoveHead(LIST *ls) { ls->curr = ls->head; if(ls->head == NULL) return 0; return 1; } int MoveNext(LIST *ls) { if((ls->curr == NULL)||(ls->curr->next==NULL)) return 0; ls->curr = ls->curr->next; return 1; } int MovePrev(LIST *ls) { if((ls->curr == NULL)||(ls->curr->prev==NULL)) return 0; ls->curr = ls->curr->prev; return 1; }

Слайд 24





Добавление элемента в конец списка
int Add(LIST *ls, TYPE val)
{
  Element *tmp = (Element *)malloc(sizeof(Element));
  if(!tmp) return 0;
  if(!ls->head){
    ls->head=tmp; tmp->prev=NULL; tmp->next=NULL;
  }else{
    if(!ls->curr) ls->curr=ls->head;
    while(ls->curr->next) ls->curr=ls->curr->next;
    ls->curr->next=tmp;
    tmp->prev=ls->curr;
    tmp->next=NULL;
  }
  tmp->val=val; ls->curr=tmp;
  return 1;
}
Описание слайда:
Добавление элемента в конец списка int Add(LIST *ls, TYPE val) { Element *tmp = (Element *)malloc(sizeof(Element)); if(!tmp) return 0; if(!ls->head){ ls->head=tmp; tmp->prev=NULL; tmp->next=NULL; }else{ if(!ls->curr) ls->curr=ls->head; while(ls->curr->next) ls->curr=ls->curr->next; ls->curr->next=tmp; tmp->prev=ls->curr; tmp->next=NULL; } tmp->val=val; ls->curr=tmp; return 1; }

Слайд 25





Добавление элемента перед текущим элементом в списке
int Ins(LIST *ls, TYPE val)
{
  if(!ls->curr) return Add(ls,val);
  Element * tmp=(Element *)malloc(sizeof(Element));
  if(!tmp) return 0;
  tmp->next=ls->curr;
  tmp->prev=ls->curr->prev;
  ls->curr->prev=tmp;
  if(tmp->prev) tmp->prev->next=tmp;
    else ls->head=tmp;
  tmp->val=val; ls->curr = tmp;
  return 1;
}
Описание слайда:
Добавление элемента перед текущим элементом в списке int Ins(LIST *ls, TYPE val) { if(!ls->curr) return Add(ls,val); Element * tmp=(Element *)malloc(sizeof(Element)); if(!tmp) return 0; tmp->next=ls->curr; tmp->prev=ls->curr->prev; ls->curr->prev=tmp; if(tmp->prev) tmp->prev->next=tmp; else ls->head=tmp; tmp->val=val; ls->curr = tmp; return 1; }

Слайд 26





Вставка элемента
Описание слайда:
Вставка элемента

Слайд 27





Удаление текущего элемента
int Del(LIST *ls)
{
  if(ls->curr==NULL) return 0;
  Element *tmp=ls->curr->prev;
  if(!tmp){
    ls->head=ls->head->next; ls->head->prev=NULL;
  }else{
    tmp->next=ls->curr->next;
    if(ls->curr->next) ls->curr->next->prev=tmp;
  }
  free(ls->curr); ls->curr=tmp;
  return 1;
}
Описание слайда:
Удаление текущего элемента int Del(LIST *ls) { if(ls->curr==NULL) return 0; Element *tmp=ls->curr->prev; if(!tmp){ ls->head=ls->head->next; ls->head->prev=NULL; }else{ tmp->next=ls->curr->next; if(ls->curr->next) ls->curr->next->prev=tmp; } free(ls->curr); ls->curr=tmp; return 1; }

Слайд 28





Удаление элемента
Описание слайда:
Удаление элемента

Слайд 29





Запись и получение значения элемента
int Set(LIST *ls, TYPE val)
{
  if(ls->curr == NULL) return 0;
  ls->curr->val = val;
  return 1;
}
int Get(LIST *ls,TYPE *val)
{
  if(ls->curr == NULL) return 0;
  *val = ls->curr->val;
  return 1;
}
Описание слайда:
Запись и получение значения элемента int Set(LIST *ls, TYPE val) { if(ls->curr == NULL) return 0; ls->curr->val = val; return 1; } int Get(LIST *ls,TYPE *val) { if(ls->curr == NULL) return 0; *val = ls->curr->val; return 1; }

Слайд 30





Удаление и инициализация списка
void Init(LIST *ls)
{
  ls->head = ls->curr = NULL;
}
void Destroy(LIST *ls)
{
  while(ls->head != NULL){
    ls->curr = ls->head;
    ls->head = ls->head->next;
    free(ls->curr);
  }
  ls->curr = NULL;
}
Описание слайда:
Удаление и инициализация списка void Init(LIST *ls) { ls->head = ls->curr = NULL; } void Destroy(LIST *ls) { while(ls->head != NULL){ ls->curr = ls->head; ls->head = ls->head->next; free(ls->curr); } ls->curr = NULL; }

Слайд 31





Пример использования
void SortInc(LIST *ls)
{
  if((ls->head == NULL)||
      (ls->head->next == NULL)) return;
  int flag = 1;
  while(flag){
    flag = 0;
    ls->curr = ls->head;
    while(ls->curr->next != NULL){
      if(ls->curr->val > ls->curr->next->val){
        TYPE tmp = ls->curr->val;
        ls->curr->val = ls->curr->next->val;
        ls->curr->next->val = tmp;
        flag = 1;
      }
      ls->curr = ls->curr->next;
    }
  }
  ls->curr = ls->head;
}
Описание слайда:
Пример использования void SortInc(LIST *ls) { if((ls->head == NULL)|| (ls->head->next == NULL)) return; int flag = 1; while(flag){ flag = 0; ls->curr = ls->head; while(ls->curr->next != NULL){ if(ls->curr->val > ls->curr->next->val){ TYPE tmp = ls->curr->val; ls->curr->val = ls->curr->next->val; ls->curr->next->val = tmp; flag = 1; } ls->curr = ls->curr->next; } } ls->curr = ls->head; }

Слайд 32





Пример использования
int main(int argc, char *argv[])
{
  LIST list1 = {NULL,NULL}, list2 = {NULL,NULL};
  while(1){
    char str[20];
    gets(str);
    if(str[0]==0) break;
    int val = atoi(str);
    Add((val%2==0)?&list2:&list1,val);
  }
  SortInc(&list2); SortDec(&list1);
Описание слайда:
Пример использования int main(int argc, char *argv[]) { LIST list1 = {NULL,NULL}, list2 = {NULL,NULL}; while(1){ char str[20]; gets(str); if(str[0]==0) break; int val = atoi(str); Add((val%2==0)?&list2:&list1,val); } SortInc(&list2); SortDec(&list1);

Слайд 33





Пример использования
  printf("\nЧетные значения: ");
  if(MoveHead(&list2))
    do{
      int val; Get(&list2,&val);
      printf("%d ",val);
    }while(MoveNext(&list2));
  printf("\nНечетные значения: ");
  if(MoveHead(&list1))
    do{
      int val; Get(&list1,&val);
      printf("%d ",val);
    }while(MoveNext(&list1));
  puts("");
  Destroy(&list1); Destroy(&list2);
  return 0;
}
Описание слайда:
Пример использования printf("\nЧетные значения: "); if(MoveHead(&list2)) do{ int val; Get(&list2,&val); printf("%d ",val); }while(MoveNext(&list2)); printf("\nНечетные значения: "); if(MoveHead(&list1)) do{ int val; Get(&list1,&val); printf("%d ",val); }while(MoveNext(&list1)); puts(""); Destroy(&list1); Destroy(&list2); return 0; }

Слайд 34





Модификация
int InsInc(LIST *ls, TYPE val)
{
  if(MoveHead(ls))
    do{
      int tmp;
      Get(ls,&tmp);
      if(tmp>=val) 
         return Ins(ls,val);
    }while(MoveNext(ls));
  return Add(ls,val);
}
Описание слайда:
Модификация int InsInc(LIST *ls, TYPE val) { if(MoveHead(ls)) do{ int tmp; Get(ls,&tmp); if(tmp>=val) return Ins(ls,val); }while(MoveNext(ls)); return Add(ls,val); }

Слайд 35





Модификация (цикл ввода)
while(1){
  char str[20];
  gets(str);
  if(str[0]==0) break;
  int val = atoi(str);
  if(val%2==0) InsInc(&list2,val);
    else InsInc(&list1,val);
}
Описание слайда:
Модификация (цикл ввода) while(1){ char str[20]; gets(str); if(str[0]==0) break; int val = atoi(str); if(val%2==0) InsInc(&list2,val); else InsInc(&list1,val); }

Слайд 36





Преимущества и недостатки списков со связанным хранением
Преимущество:
Эффективные функции работы с памятью при добавлении или удалении элементов
Недостаток:
Нет возможности произвольного обращения к элементам списка.
Описание слайда:
Преимущества и недостатки списков со связанным хранением Преимущество: Эффективные функции работы с памятью при добавлении или удалении элементов Недостаток: Нет возможности произвольного обращения к элементам списка.

Слайд 37





Смешанный список
Описание слайда:
Смешанный список

Слайд 38





Переменные и типы данных
typedef struct{
  TYPE **list;  //Указатель на начало списка
  int count;     //Количество элементов в списке
} LIST;
Описание слайда:
Переменные и типы данных typedef struct{ TYPE **list; //Указатель на начало списка int count; //Количество элементов в списке } LIST;

Слайд 39





Инициализация и уничтожение списка
void Init(LIST *ls)
{
  ls->list = NULL;
  ls->count = 0;
}
void Destroy(LIST *ls)
{
  for(int i=0;i<ls->count;i++) free(ls->list[i]);
  free(ls->list);
  ls->list = NULL;
  ls->count = 0;
}
Описание слайда:
Инициализация и уничтожение списка void Init(LIST *ls) { ls->list = NULL; ls->count = 0; } void Destroy(LIST *ls) { for(int i=0;i<ls->count;i++) free(ls->list[i]); free(ls->list); ls->list = NULL; ls->count = 0; }

Слайд 40





Добавление элемента в конец списка
int Add(LIST *ls, TYPE val)
{
  TYPE *new = (TYPE*)malloc(sizeof(TYPE));
  if(!new) return 0;
  TYPE **tmp = (TYPE**)realloc(ls->list,(ls->count+1)*sizeof(TYPE*));
  if(!tmp) {free(new); return 0;}
  *new = val;
  if(ls->list != tmp) ls->list = tmp;
  ls->list[ls->count++] = new;
  return 1;
}
Описание слайда:
Добавление элемента в конец списка int Add(LIST *ls, TYPE val) { TYPE *new = (TYPE*)malloc(sizeof(TYPE)); if(!new) return 0; TYPE **tmp = (TYPE**)realloc(ls->list,(ls->count+1)*sizeof(TYPE*)); if(!tmp) {free(new); return 0;} *new = val; if(ls->list != tmp) ls->list = tmp; ls->list[ls->count++] = new; return 1; }

Слайд 41





Вставка элемента в середину списка
int Ins(LIST *ls, TYPE val, int ind)
{
  if(ind<0) return 0;
  if(ind >= ls->count) return Add(ls,val);
  TYPE *new = (TYPE*)malloc(sizeof(TYPE));
  if(!new) return 0;
  TYPE **tmp = (TYPE**)realloc(ls->list,(ls->count+1)*sizeof(TYPE*));
  if(!tmp) {free(new); return 0;}
  *new = val;
  if(ls->list != tmp) ls->list = tmp;
  for(int i=ls->count;i>ind;i--) ls->list[i] = ls->list[i-1];
  ls->list[ind] = new;
  ls->count++;
  return 1;
}
Описание слайда:
Вставка элемента в середину списка int Ins(LIST *ls, TYPE val, int ind) { if(ind<0) return 0; if(ind >= ls->count) return Add(ls,val); TYPE *new = (TYPE*)malloc(sizeof(TYPE)); if(!new) return 0; TYPE **tmp = (TYPE**)realloc(ls->list,(ls->count+1)*sizeof(TYPE*)); if(!tmp) {free(new); return 0;} *new = val; if(ls->list != tmp) ls->list = tmp; for(int i=ls->count;i>ind;i--) ls->list[i] = ls->list[i-1]; ls->list[ind] = new; ls->count++; return 1; }

Слайд 42





Удаление элемента из списка
int Del(LIST *ls, int ind)
{
  if((ind<0)||(ind>=ls->count)) return 0;
  free(ls->list[ind]);
  for(int i=ind;i<ls->count-1;i++) ls->list[i] = ls->list[i+1];
  ls->list = (TYPE**)realloc(ls->list,(ls->count-1)*sizeof(TYPE*));
  ls->count--;
  return 1;
}
Описание слайда:
Удаление элемента из списка int Del(LIST *ls, int ind) { if((ind<0)||(ind>=ls->count)) return 0; free(ls->list[ind]); for(int i=ind;i<ls->count-1;i++) ls->list[i] = ls->list[i+1]; ls->list = (TYPE**)realloc(ls->list,(ls->count-1)*sizeof(TYPE*)); ls->count--; return 1; }

Слайд 43





Запись и получение значения из списка
int Set(LIST *ls, TYPE val, int ind)
{
  if((ind<0)||(ind>=ls->count)) return 0;
  *ls->list[ind] = val;
  return 1;
}
int Get(LIST *ls, TYPE *val, int ind)
{
  if((ind<0)||(ind>=ls->count)) return 0;
  *val = *ls->list[ind];
  return 1;
}
Описание слайда:
Запись и получение значения из списка int Set(LIST *ls, TYPE val, int ind) { if((ind<0)||(ind>=ls->count)) return 0; *ls->list[ind] = val; return 1; } int Get(LIST *ls, TYPE *val, int ind) { if((ind<0)||(ind>=ls->count)) return 0; *val = *ls->list[ind]; return 1; }

Слайд 44





Пример использования
int CmpInc(const void *p1, const void *p2)
{
  return **((int**)p1) - **((int**)p2);
}
int CmpDec(const void *p1, const void *p2)
{
  return **((int**)p2) - **((int**)p1);
}
Описание слайда:
Пример использования int CmpInc(const void *p1, const void *p2) { return **((int**)p1) - **((int**)p2); } int CmpDec(const void *p1, const void *p2) { return **((int**)p2) - **((int**)p1); }

Слайд 45





Пример использования
int main(int argc, char *argv[])
{
  LIST list1 = {NULL,0}, list2 = {NULL,0};
  while(1){
    char str[20];
    gets(str);
    if(str[0]==0) break;
    int val = atoi(str);
    Add((val%2==0)?&list2:&list1,val);
  }
  qsort(list1.list,list1.count,sizeof(TYPE*),CmpDec);
  qsort(list2.list,list2.count,sizeof(TYPE*),CmpInc);
Описание слайда:
Пример использования int main(int argc, char *argv[]) { LIST list1 = {NULL,0}, list2 = {NULL,0}; while(1){ char str[20]; gets(str); if(str[0]==0) break; int val = atoi(str); Add((val%2==0)?&list2:&list1,val); } qsort(list1.list,list1.count,sizeof(TYPE*),CmpDec); qsort(list2.list,list2.count,sizeof(TYPE*),CmpInc);

Слайд 46





Пример использования
  printf("\nЧетные значения: ");
  for(int i=0,n=Count(&list2);i<n;i++){
    int val;
    Get(&list2,&val,i);
    printf("%d ",val);
  }
  printf("\nНечетные значения: ");
  for(int i=0,n=Count(&list1);i<n;i++){
    int val;
    Get(&list1,&val,i);
    printf("%d ",val);
  }
  puts("");
  Destroy(&list2); Destroy(&list1);
  return 0;
}
Описание слайда:
Пример использования printf("\nЧетные значения: "); for(int i=0,n=Count(&list2);i<n;i++){ int val; Get(&list2,&val,i); printf("%d ",val); } printf("\nНечетные значения: "); for(int i=0,n=Count(&list1);i<n;i++){ int val; Get(&list1,&val,i); printf("%d ",val); } puts(""); Destroy(&list2); Destroy(&list1); return 0; }

Слайд 47





Модификация
int InsInc(LIST *lst, TYPE val)
{
  for(int i=0,n=Count(lst);i<n;i++){
    int tmp;
    Get(lst,&tmp,i);
    if(tmp>=val) return Ins(lst,val,i);
  }
  return Add(lst,val);
}
int InsDec(LIST *lst, TYPE val)
{
  for(int i=0,n=Count(lst);i<n;i++){
    int tmp;
    Get(lst,&tmp,i);
    if(tmp<val) return Ins(lst,val,i);
  }  
  return Add(lst,val);
}
Описание слайда:
Модификация int InsInc(LIST *lst, TYPE val) { for(int i=0,n=Count(lst);i<n;i++){ int tmp; Get(lst,&tmp,i); if(tmp>=val) return Ins(lst,val,i); } return Add(lst,val); } int InsDec(LIST *lst, TYPE val) { for(int i=0,n=Count(lst);i<n;i++){ int tmp; Get(lst,&tmp,i); if(tmp<val) return Ins(lst,val,i); } return Add(lst,val); }

Слайд 48





Модификация (цикл ввода)
while(1){
  char str[20];
  gets(str);
  if(str[0]==0) break;
  int val = atoi(str);
  if(val%2==0) InsInc(&list2,val);
    else InsDec(&list1,val);
}
Описание слайда:
Модификация (цикл ввода) while(1){ char str[20]; gets(str); if(str[0]==0) break; int val = atoi(str); if(val%2==0) InsInc(&list2,val); else InsDec(&list1,val); }

Слайд 49





Смешанный список
Преимущество:
Быстрый доступ к элементам списка посредством индексации
Недостаток:
Усложненность операций выделения и освобождения памяти при добавлении и удалении элементов
Описание слайда:
Смешанный список Преимущество: Быстрый доступ к элементам списка посредством индексации Недостаток: Усложненность операций выделения и освобождения памяти при добавлении и удалении элементов

Слайд 50





Кольца
Описание слайда:
Кольца



Похожие презентации
Mypresentation.ru
Загрузить презентацию