Презентация на тему: Массивы в языке Си

Массивы в языке Си
Пример. Динамическое выделение памяти для одномерного массива. Суммирование элементов массива.
Матрица в языке C
Пример. Динамическое выделение памяти для двумерного массива. Суммирование элементов матрицы.
Динамические структуры данных
Пусть исходные данные для создания списка – числа 1, 2, 3 и 0 (0-признак окончания ввода данных).
Элемент двунаправленного списка содержит указатель не только на следующий, но и на предыдущий элемент списка.
В циклическом списке последняя запись указывает на первую. Для циклического списка удобно возвращать адрес последней записи.
Пример 1 : Написать программу, которая вводит целые положительные числа в стек, а затем вычисляет их сумму.
Массивы в языке Си
Циклический список
Массивы в языке Си
Пример. Подпрограмма занесения значения X в очередь на базе циклического списка.
Массивы в языке Си
Двунаправленные связанные списки
Массивы в языке Си
Массивы в языке Си
1/17
Средняя оценка: 4.3/5 (всего оценок: 16)
Код скопирован в буфер обмена
Скачать (106 Кб)
1

Первый слайд презентации: Массивы в языке Си

Нумерация элементов массива начинается с нуля. Имя массива – указатель на его первый элемент, т.е. mas ==& mas [0]. При объявлении массива указывается его длина. Например, int mas[10]; mas 0 1 … i … 9 Значение i -ого элемента массива можно представить двумя способами: mas[i]; или *(mas+i).

Изображение слайда
2

Слайд 2: Пример. Динамическое выделение памяти для одномерного массива. Суммирование элементов массива

#include<stdio.h> #include<stdlib.h> #include<malloc.h> int main() {int *a, summa=0; unsigned k; //длина массива int i; printf(" Enter the length of array  k>0 :"); scanf("%u",&k); //выделение памяти a=(int*)calloc(k, sizeof(int)); printf( "Input elements : "); for(i=0;i<k;i++) {printf("a[%d]=",i); scanf("%d",a+i); } for (i=0;i<k;i++) summa+=a[i]; printf("summa=%d \n ", summa); return(0); }

Изображение слайда
3

Слайд 3: Матрица в языке C

Для матрицы при объявлении указывается число строк и столбцов. Нумерация элементов матрицы начинается с нуля. int b[10][20]. 0 Обращение к элементу: b 1 b[i][j] … *(b[i]+j) *(*(b+i)+j) 9 **int *int int

Изображение слайда
4

Слайд 4: Пример. Динамическое выделение памяти для двумерного массива. Суммирование элементов матрицы

#include<stdio.h> #include<stdlib.h> #include<malloc.h> main() {int **b,i,j,m,n,summa=0; printf( "Input n,m >0 "); scanf("%d%d",&n,&m); /*выделение памяти для массива указателей на строки матрицы* / b=(int**)calloc(n,sizeof(int *)); for(i=0;i<n;i++) / * выделение памяти для строки  */ {b[i]=(int*)calloc(m,sizeof(int)); for(j=0;j<m;j++) {//ввод элемента матрицы printf(" b [%d][%d]=",i,j); scanf("%d",b[i]+j); } } for (i=0;i<n;i++) for(j=0;j<m;j++) summa+=b[i][j]; printf("summa=%d \n ",summa); return(0); }

Изображение слайда
5

Слайд 5: Динамические структуры данных

Динамические структуры данных - структуры, размер которых в программе явно не определяется. Память под элементы, входящие в эти структуры, выделяется в процессе работы программы. Пример динамических структур – связанные списки. Основные типы списков уже изучались в языке Паскаль.

Изображение слайда
6

Слайд 6: Пусть исходные данные для создания списка – числа 1, 2, 3 и 0 (0-признак окончания ввода данных)

Линейные однонаправленные списки Очередь lst Сте к lst 1 2 3 NULL 3 2 1 NULL

Изображение слайда
7

Слайд 7: Элемент двунаправленного списка содержит указатель не только на следующий, но и на предыдущий элемент списка

Линейные двунаправленные списки Очередь поле данных указатель на след. lst указатель на пред. Стек lst 1 NULL 2 NULL 3 3 2 NULL NULL 1

Изображение слайда
8

Слайд 8: В циклическом списке последняя запись указывает на первую. Для циклического списка удобно возвращать адрес последней записи

Циклические однонаправленные списки Очередь lst Стек отличается от очереди порядком расположения полей данных. Порядок данных для стека указан на предыдущем рис. в скобках. Циклические двунаправленные списки – очередь (стек). lst 1 (3) 2 (2) 3 (1) 1 (3) 2 (2) 3 (1)

Изображение слайда
9

Слайд 9: Пример 1 : Написать программу, которая вводит целые положительные числа в стек, а затем вычисляет их сумму

#include <stdio.h> #include <stdlib.h> #include <malloc.h> /* содержит описание функций динамического распределения памяти */ struct node {node *next ; int info; }; node *stack() / / формирование стека { int n; node *p, *lst; /* p - указатель на текущую добавляемую запись, l st - указатель на предыдущую запись ( на вершину стека ) */ lst=NULL; / / пустой стек printf ("Enter positive integers \n "); while(scanf("%d",&n)==1&&n>0) / / ввод до Ctrl+Z или n<= 0 { p=(node *) malloc(sizeof(node)); /* используется операция преобразования типа из указателя на char в указатель на struct node */ p->info=n; p->next=lst; lst=p; } return ( l st); /* вернет указатель на вершину стека* / }

Изображение слайда
10

Слайд 10

int sumspisok (node *lst ) { int sum=0; node *p ;// указатель на текущую запись p=lst; while(p!=NULL) / / лучше while(p) { sum+=p->info; p=p->next ; } return(sum) ; } int main () { printf (" summ = %7d", sumspisok(stack() ) ) ; return 0; }

Изображение слайда
11

Слайд 11: Циклический список

В циклическом списке поле указателя последнего элемента содержит указатель на первый элемент: Указатель l st используется для доступа к циклическому списку. Обычно такой список определяется с помощью указателя на последний элемент. Если список пуст, то lst = NULL. Циклический список может быть использован для реализации стека и очереди.

Изображение слайда
12

Слайд 12

Пустая очередь: lst lst p Очередь не пуста: lst p=lst p lst p Новый элемент добавляется после последнего, так как это очередь. NULL

Изображение слайда
13

Слайд 13: Пример. Подпрограмма занесения значения X в очередь на базе циклического списка

node *add_elem(node *lst, int x) { node *p; p=(node *)malloc(sizeof(node)); p->info=x; if (lst==NULL) p->next=p; // очередь пуста else // очередь не пуста { p->next=lst->next; lst->next=p; } lst=p; return ( l st); }

Изображение слайда
14

Слайд 14

void printspisok_1(node *lst) // вывод списка на экран {node *p; p=lst; do{p=p->next; printf("%7d",p->info); } while(p!=lst); } int main() {node *lst=NULL; int n; printf( " Enter positive integers \n "); while(scanf("%d",&n)==1&&n>0) lst=add_elem(lst,n); if(lst) printspisok_1(lst); else puts("list is empty"); return 0; }

Изображение слайда
15

Слайд 15: Двунаправленные связанные списки

Каждый элемент содержит два указателя: на следующий и на предыдущий элемент. Такие списки могут быть использованы для организации очереди и стека. Пример : Занесение X в стек на базе линейного двунаправленного связанного списка. #include < stdio.h > #include < malloc.h > struct node2 { node2 *next, * prev ; int info; };

Изображение слайда
16

Слайд 16

node2 *addstack (node2 *lst, int x) { node2 *p; p= (node2 *)malloc (sizeof (node2) ) ; p->info=x; if(lst!=NULL) lst->prev=p; /* новая запись размещается перед той, на которую указывал lst */ p->next=lst; p->prev=NULL; lst=p; return (lst) ; }

Изображение слайда
17

Последний слайд презентации: Массивы в языке Си

void printlist_2(node2 *lst) { node2 *p,*t; p=lst; puts("forward"); while(p) { printf("%7d",p->info); t=p;p=p->next; } puts("\nback"); p=t; while(p) { printf("%7d",p->info); t=p;p=p->prev; } puts(""); } int main() { node2 *lst=NULL; int n; printf("Enter positive integers\n"); while(scanf("%d",&n)==1&&n>0) lst=addstack(lst,n); printlist_2(lst); return 0; }

Изображение слайда