Скачать презентацию Задача 1 Сформировать двунаправленный связанный список очередь содержащий Скачать презентацию Задача 1 Сформировать двунаправленный связанный список очередь содержащий

Язык C_семинар 11_ _.ppt

  • Количество слайдов: 8

Задача 1. Сформировать двунаправленный связанный список (очередь), содержащий последовательность целых положительных чисел, вводимых с Задача 1. Сформировать двунаправленный связанный список (очередь), содержащий последовательность целых положительных чисел, вводимых с клавиатуры. Структура имеет вид: число info ук. на след. next ук. на пред. prev Используем указатели: lst – начало списка, curr – текущая запись, t_prev(temp previous) – предыдущая запись. Исходные данные: 1 2 3 0. До цикла lst=NULL. curr lst NULL n=1 t_prev n=2 t_prev n=3 n=0 t_prev

/*структурный тип для двунаправленного списка*/ struct node 2 { int info; node 2 *next, /*структурный тип для двунаправленного списка*/ struct node 2 { int info; node 2 *next, *prev; }; node 2* make (void) { node 2 *lst=NULL, *curr, *t_prev; int n; printf("Enter positive integersn"); while(scanf("%d", &n)==1&&n>0) { tek=(node 2*)malloc(sizeof(node 2)); curr->info=n; if (!lst) //списка еще нет { lst=curr; curr->prev=NULL; } else //не первый элемент { t_prev->next=curr; curr->prev=t_prev; } t_prev=curr; } curr->next=NULL; return lst; }

// вывод двунаправленного списка на экран void printlist_2(node 2 *lst) { node 2 *p, // вывод двунаправленного списка на экран void printlist_2(node 2 *lst) { node 2 *p, *t; p=lst; puts("forward"); while(p) { printf("%7 d", p->info); t=p; p=p->next; } puts("nback"); p=t; while(p) { printf("%7 d", p->info); t=p; p=p->prev; } puts(""); }

Задача 2. В двунаправленный связанный список вставить число 2000 до каждого элемента большего чем Задача 2. В двунаправленный связанный список вставить число 2000 до каждого элемента большего чем X 1 и меньшего чем X 2. Числа x 1 и x 2 вводятся в главной функции. Функция возвращает указатель на начало измененного списка. Используем указатели: lst – начало списка, tek – текущий, t – предшествующий tek, nov – новый. Рассматриваем два случая – вставка в начало списка и в середину списка. tek t tek lst NULL nov 2000 NULL 2000

node 2 * ins (node 2 *lst, int x 1, int x 2) { node 2 * ins (node 2 *lst, int x 1, int x 2) { node 2 *tek, *nov, *t; //указатель на текущий элемент tek=lst; while (tek!=NULL) //если есть вставка if (tek->info > x 1 && tek->info < x 2) { //выделение памяти nov=(node 2*)malloc(sizeof(node 2)); nov->info=2000; if (tek==lst) { //вставка в начало lst=nov; nov->next=tek; nov->prev=NULL; tek->prev=nov; } else { //вставка не в начало t=tek->prev; nov->next=tek; t->next=nov; tek->prev=nov; nov->prev=t; } tek=tek->next; } else tek=tek->next; return(lst); }

int main() { node 2 *lst=NULL; int n, x 1, x 2; printf( int main() { node 2 *lst=NULL; int n, x 1, x 2; printf("input x 1, x 2"); scanf("%d%d", &x 1, &x 2); lst=make(); puts("first list"); printspisok_2(lst); lst=ins(lst, x 1, x 2); puts("list after insert"); printspisok_2(lst); return 0; }

Рекурсия Пример рекурсивного определения - вычисление факториала В программировании рекурсия — вызов функции из Рекурсия Пример рекурсивного определения - вычисление факториала В программировании рекурсия — вызов функции из нее же самой 1, при n=0, непосредственно (простая n!= рекурсия) или через другие функции (сложная или (n-1)!*n, при n косвенная рекурсия). натуральном Например, функция A вызывает функцию B, а Например: функция B — функцию A. Количество вложенных 4!=4*3*2!=4*3*2*1!=4* вызовов функции называется 3*2*1*0!=4*3*2*1*1 глубиной рекурсии.

/* Рекурсивный алгоритм вычисления факториала */ long fact(int n) { if(n==0)return(1); else return(n*fact(n-1)); } /* Рекурсивный алгоритм вычисления факториала */ long fact(int n) { if(n==0)return(1); else return(n*fact(n-1)); } /* Итерационный алгоритм вычисления факториала */ long fact(int n) { long p=1; int i; for(i=1; i<=n; p*=i++); return (p); } Выбор рекурсии или итерации зависит от конкретной задачи. В общем случае рекурсия требует дополнительных расходов, так как она реализуется с использованием стеков. Некоторые задачи элементарно решаются с использованием рекурсии (например, проверка правильности арифметических выражений).