nya
This commit is contained in:
		
							parent
							
								
									6161b74ffc
								
							
						
					
					
						commit
						eeffd774de
					
				
					 11 changed files with 265 additions and 703 deletions
				
			
		
							
								
								
									
										31
									
								
								graphs/graph.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								graphs/graph.c
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,31 @@ | ||||||
|  | typedef enum color_t { | ||||||
|  | 	WHITE, GREY, BLACK | ||||||
|  | } color; | ||||||
|  | 
 | ||||||
|  | // unweighted graph
 | ||||||
|  | 
 | ||||||
|  | typedef struct graph_t { | ||||||
|  | 	char *neibs; // [N*N]
 | ||||||
|  | 	size_t N; | ||||||
|  | 	int unordered; | ||||||
|  | } graph; | ||||||
|  | 
 | ||||||
|  | graph *graph_new(size_t nodesm int is_ordered) { | ||||||
|  | 	graph *t = (graph *) malloc(sizeof(graph)); | ||||||
|  | 	t->N = nodes; | ||||||
|  | 	t->unoreded = !is_ordered; | ||||||
|  | 	t->neibs = (char *) calloc(sizeof(char), nodes * nodes); | ||||||
|  | 	return t;	 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void graph_delete(graph *g) { | ||||||
|  | 	free(g->neibs); | ||||||
|  | 	free(g); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void graph_add_edge(graph *t, int from, int to) { | ||||||
|  | 	t->neibs[from * t->N + to] = 1; | ||||||
|  | 	if (t->unordered) { | ||||||
|  | 		t->neibs[to * t->N + from] = 1; | ||||||
|  | 	} | ||||||
|  | } | ||||||
							
								
								
									
										6
									
								
								graphs/main.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								graphs/main.c
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,6 @@ | ||||||
|  | #include "queue.c" | ||||||
|  | #include "graph.c" | ||||||
|  | 
 | ||||||
|  | int main() { | ||||||
|  | 	queue *q = queue_new(5); | ||||||
|  | } | ||||||
							
								
								
									
										36
									
								
								graphs/queue.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										36
									
								
								graphs/queue.c
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,36 @@ | ||||||
|  | #include <stdio.h> | ||||||
|  | #include <assert.h> | ||||||
|  | #include <stdlib.h> | ||||||
|  | 
 | ||||||
|  | typedef int T; | ||||||
|  | typedef struct queue_s { | ||||||
|  | 	T *body, *begin, *end, *body_end; | ||||||
|  | } queue; | ||||||
|  | 
 | ||||||
|  | queue* queue_new(size_t size) { | ||||||
|  | 	queue *t = (queue *)malloc(sizeof(queue)); | ||||||
|  | 	assert(t != NULL); | ||||||
|  | 	t->body = (int *)malloc(sizeof(T)*size); | ||||||
|  | 	t->begin = t->end = t->body; | ||||||
|  | 	t->body_end = t->body + size; | ||||||
|  | 	return t; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void queue_delete(queue *t) { | ||||||
|  | 	free(t->body); | ||||||
|  | 	free(t); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void queue_enqueue(queue *t, T el) { | ||||||
|  | 	assert(t->end < t->body_end); | ||||||
|  | 	*t->end++ = el; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | int queue_empty(queue const *t) { | ||||||
|  | 	return t->begin == t->end; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | T queue_dequeue(queue *t) { | ||||||
|  | 	return *t->begin++; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | @ -1,208 +0,0 @@ | ||||||
| #include <stdio.h> |  | ||||||
| #include <stdlib.h> |  | ||||||
| 
 |  | ||||||
| typedef int Data; |  | ||||||
| struct Node { |  | ||||||
| 	struct Node * next; |  | ||||||
| 	struct Node * prev; |  | ||||||
| 	Data data; |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| void list_init(struct Node * list); |  | ||||||
| void list_insert(struct Node * list, struct Node * t); |  | ||||||
| void list_insert_before(struct Node * list, struct Node * t); |  | ||||||
| void list_remove(struct Node * t); |  | ||||||
| struct Node * list_push_front(struct Node * list, Data d); |  | ||||||
| struct Node * list_push_back(struct Node * list, Data d); |  | ||||||
| Data list_pop_front(struct Node * list); |  | ||||||
| Data list_pop_back(struct Node * list); |  | ||||||
| Data list_delete(struct Node * t); |  | ||||||
| void list_print (struct Node * list); |  | ||||||
| Data list_sum (struct Node * list); |  | ||||||
| int list_is_empty(struct Node * list); |  | ||||||
| int list_clear(struct Node * list); |  | ||||||
| void list_for_each(struct Node * list, void (*func)(Data d, void * param), void * param); |  | ||||||
| void print_it(Data d, void * parameter); |  | ||||||
| void sum(Data a, void * s); |  | ||||||
| 
 |  | ||||||
| void list_init(struct Node * list) { |  | ||||||
| 	list->next = list; |  | ||||||
| 	list->prev = list; |  | ||||||
| 	list->data = -1; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void list_print (struct Node * list) { |  | ||||||
| 	struct Node *ptr = list->next; |  | ||||||
| 	if (ptr == list) { |  | ||||||
| 		printf("Empty list\n"); |  | ||||||
| 	} |  | ||||||
| 	else { |  | ||||||
| 		while (ptr->next != list) { |  | ||||||
| 			printf("%d ", ptr->data); |  | ||||||
| 			//printf("%d [%p](prev is %p, next is %p)\n", ptr->data, ptr, ptr->prev, ptr->next);
 |  | ||||||
| 			ptr = ptr->next; |  | ||||||
| 		} |  | ||||||
| 		printf("%d\n", ptr->data); |  | ||||||
| 		//printf("%d [%p](prev is %p, next is %p)\n", ptr->data, ptr, ptr->prev, ptr->next);
 |  | ||||||
| 	} |  | ||||||
| }  |  | ||||||
| 
 |  | ||||||
| void list_insert(struct Node * list, struct Node * t) { |  | ||||||
| 	t->next = list->next; |  | ||||||
| 	t->prev = list; |  | ||||||
| 	if (t->next != list) { |  | ||||||
| 		t->next->prev = t; |  | ||||||
| 	} |  | ||||||
| 	else { |  | ||||||
| 		t->next = list; |  | ||||||
| 		list->prev = t; |  | ||||||
| 	} |  | ||||||
| 	list->next = t; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void list_insert_before(struct Node * list, struct Node * t) { |  | ||||||
| 	t->next = list; |  | ||||||
| 	t->prev = list->prev; |  | ||||||
| 	if (t->prev != list) { |  | ||||||
| 		t->prev->next = t; |  | ||||||
| 	} |  | ||||||
| 	else { |  | ||||||
| 		t->prev = list; |  | ||||||
| 		list->next = t; |  | ||||||
| 	} |  | ||||||
| 	list->prev = t; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void list_remove(struct Node * t) { |  | ||||||
| 	t->prev->next = t->next; |  | ||||||
| 	t->next->prev = t->prev; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| struct Node * list_push_front(struct Node * list, Data d) { |  | ||||||
| 	struct Node *ptr = list->next; |  | ||||||
| 	struct Node *oth = malloc(sizeof(struct Node)); |  | ||||||
| 	oth->data = d; |  | ||||||
| 	oth->next = ptr; |  | ||||||
| 	oth->prev = list; |  | ||||||
| 	list->next = oth; |  | ||||||
| 	ptr->prev = oth; |  | ||||||
| 	return list; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| struct Node * list_push_back(struct Node * list, Data d) { |  | ||||||
| 	struct Node *ptr = list->prev; |  | ||||||
| 	struct Node *oth = malloc(sizeof(struct Node)); |  | ||||||
| 	oth->data = d; |  | ||||||
| 	oth->next = list; |  | ||||||
| 	oth->prev = ptr; |  | ||||||
| 	list->prev = oth; |  | ||||||
| 	ptr->next = oth; |  | ||||||
| 	return list; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| int list_is_empty(struct Node * list) { |  | ||||||
| 	if (list == list->next) { |  | ||||||
| 		return 1; |  | ||||||
| 	} |  | ||||||
| 	return 0; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| int list_clear(struct Node * list) { |  | ||||||
| 	struct Node *ptr = list->next; |  | ||||||
| 	 |  | ||||||
| 	struct Node *n; |  | ||||||
| 	while (ptr->next != list) { |  | ||||||
| 		n = ptr->next; |  | ||||||
| 		free(ptr); |  | ||||||
| 		ptr = n; |  | ||||||
| 	} |  | ||||||
| 	list->next = list; |  | ||||||
| 	list->prev = list; |  | ||||||
| 	return 0; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| Data list_pop_front(struct Node * list) { |  | ||||||
| 	struct Node *ptr = list->next; |  | ||||||
| 	Data val = ptr->data; |  | ||||||
| 	list->next = ptr->next; |  | ||||||
| 	ptr->next->prev = list; |  | ||||||
| 	free(ptr); |  | ||||||
| 
 |  | ||||||
| 	return val; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| Data list_pop_back(struct Node * list) { |  | ||||||
| 	struct Node *ptr = list->prev; |  | ||||||
| 	Data val = ptr->data; |  | ||||||
| 	list->prev = ptr->prev; |  | ||||||
| 	ptr->prev->next = list; |  | ||||||
| 	free(ptr); |  | ||||||
| 
 |  | ||||||
| 	return val; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| Data list_delete(struct Node * t) { |  | ||||||
| 	if (t == t->next) { |  | ||||||
| 		return -1; |  | ||||||
| 	} |  | ||||||
| 	t->prev->next = t->next; |  | ||||||
| 	t->next->prev = t->prev; |  | ||||||
| 	Data val = t->data; |  | ||||||
| 	free(t); |  | ||||||
| 	return val; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void list_for_each(struct Node * list, void (*func)(Data d, void * param), void * param) { |  | ||||||
| 	struct Node *ptr = list->next; |  | ||||||
| 	while (ptr->next != list) { |  | ||||||
| 		func(ptr->data, param); |  | ||||||
| 		ptr = ptr->next; |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void sum(Data a, void * s) { |  | ||||||
| 	*(Data *)s += a; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void print_it(Data d, void * param) { |  | ||||||
| 	FILE * fd = param; |  | ||||||
| 	fprintf(fd, "%d ", d); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| Data list_sum (struct Node * list) { |  | ||||||
| 	int s = 0; |  | ||||||
| 	list_for_each(list, sum, &s); |  | ||||||
| 	return s; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| int list_size(struct Node *list) { |  | ||||||
| 	struct Node *ptr = list->next; |  | ||||||
| 	if (ptr == list) { |  | ||||||
| 		return 0; |  | ||||||
| 	} |  | ||||||
| 	int len = 1; |  | ||||||
| 
 |  | ||||||
| 	while (ptr->next != list) { |  | ||||||
| 		ptr = ptr->next; |  | ||||||
| 		++len; |  | ||||||
| 	} |  | ||||||
| 	return len; |  | ||||||
| } |  | ||||||
| int main() { |  | ||||||
| struct Node x[10]; |  | ||||||
| 	struct Node * a = malloc(sizeof(struct Node)); |  | ||||||
| 
 |  | ||||||
| 	int i; |  | ||||||
| 	list_init(a); |  | ||||||
| 
 |  | ||||||
| 	 |  | ||||||
| 	for(i=0; i<10; i++) { |  | ||||||
| 		x[i].data = i; |  | ||||||
| 		list_insert(a, &x[i]); |  | ||||||
| 	} |  | ||||||
| 	list_print(a); |  | ||||||
| 	//while(list_delete(a->next));
 |  | ||||||
| 	list_clear(a); |  | ||||||
| 	free(a); |  | ||||||
| } |  | ||||||
|  | @ -1,54 +0,0 @@ | ||||||
| #include "../double_linked_list.c" |  | ||||||
| #define MAX 1000000 |  | ||||||
| 
 |  | ||||||
| int main() { |  | ||||||
| 	int i, k, l; |  | ||||||
| 	struct Node * a = malloc(sizeof(struct Node)); |  | ||||||
| 	struct Node * b = malloc(sizeof(struct Node));	 |  | ||||||
| 	list_init(a); |  | ||||||
| 	list_init(b); |  | ||||||
| 	int A[5], B[5]; |  | ||||||
| 
 |  | ||||||
| 	for (i = 0; i < 5; ++i) { |  | ||||||
| 		scanf("%d", &A[i]); |  | ||||||
| 		list_push_back(a, A[i]); |  | ||||||
| 	} |  | ||||||
| 	 |  | ||||||
| 	for (i = 0; i < 5; ++i) { |  | ||||||
| 		scanf("%d", &B[i]); |  | ||||||
| 		list_push_back(b, B[i]); |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	for (i = 0;; ++i) { |  | ||||||
| 		if (i == MAX) { |  | ||||||
| 			printf("botva\n"); |  | ||||||
| 			return 0; |  | ||||||
| 		} |  | ||||||
| 		if (list_size(a) == 0) { |  | ||||||
| 			printf("second %d\n", i); |  | ||||||
| 			return 0; |  | ||||||
| 		} |  | ||||||
| 		if (list_size(b) == 0) { |  | ||||||
| 			printf("first %d\n", i); |  | ||||||
| 			return 0; |  | ||||||
| 		} |  | ||||||
| 		k = list_pop_front(a); |  | ||||||
| 		l = list_pop_front(b); |  | ||||||
| 		if (k == 10 || l == 0) { |  | ||||||
| 			list_push_back(b, k); |  | ||||||
| 			list_push_back(b, l);		 |  | ||||||
| 		} |  | ||||||
| 		else if (k == 0 || l == 10) { |  | ||||||
| 			list_push_back(a, k); |  | ||||||
| 			list_push_back(a, l); |  | ||||||
| 		} |  | ||||||
| 		else if (k > l) { |  | ||||||
| 			list_push_back(a, l); |  | ||||||
| 			list_push_back(a, k); |  | ||||||
| 		} |  | ||||||
| 		else { |  | ||||||
| 			list_push_back(b, k); |  | ||||||
| 			list_push_back(b, l);	 |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
|  | @ -1,253 +0,0 @@ | ||||||
| #include <stdio.h> |  | ||||||
| #include <stdlib.h> |  | ||||||
| 
 |  | ||||||
| typedef int Data; |  | ||||||
| struct Node { |  | ||||||
| 	struct Node * next; |  | ||||||
| 	struct Node * prev; |  | ||||||
| 	Data data; |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| void list_init(struct Node * list); |  | ||||||
| void list_insert(struct Node * list, struct Node * t); |  | ||||||
| void list_insert_before(struct Node * list, struct Node * t); |  | ||||||
| void list_remove(struct Node * t); |  | ||||||
| struct Node * list_push_front(struct Node * list, Data d); |  | ||||||
| struct Node * list_push_back(struct Node * list, Data d); |  | ||||||
| Data list_pop_front(struct Node * list); |  | ||||||
| Data list_pop_back(struct Node * list); |  | ||||||
| Data list_delete(struct Node * t); |  | ||||||
| void list_print (struct Node * list); |  | ||||||
| Data list_sum (struct Node * list); |  | ||||||
| int list_is_empty(struct Node * list); |  | ||||||
| int list_clear(struct Node * list); |  | ||||||
| void list_for_each(struct Node * list, void (*func)(Data d, void * param), void * param); |  | ||||||
| void print_it(Data d, void * parameter); |  | ||||||
| void sum(Data a, void * s); |  | ||||||
| 
 |  | ||||||
| void list_init(struct Node * list) { |  | ||||||
| 	list->next = list; |  | ||||||
| 	list->prev = list; |  | ||||||
| 	list->data = -1; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void list_print (struct Node * list) { |  | ||||||
| 	struct Node *ptr = list->next; |  | ||||||
| 	if (ptr == list) { |  | ||||||
| 		printf("Empty list\n"); |  | ||||||
| 	} |  | ||||||
| 	else { |  | ||||||
| 		while (ptr->next != list) { |  | ||||||
| 			printf("%d ", ptr->data); |  | ||||||
| 			//printf("%d [%p](prev is %p, next is %p)\n", ptr->data, ptr, ptr->prev, ptr->next);
 |  | ||||||
| 			ptr = ptr->next; |  | ||||||
| 		} |  | ||||||
| 		printf("%d\n", ptr->data); |  | ||||||
| 		//printf("%d [%p](prev is %p, next is %p)\n", ptr->data, ptr, ptr->prev, ptr->next);
 |  | ||||||
| 	} |  | ||||||
| }  |  | ||||||
| 
 |  | ||||||
| void list_insert(struct Node * list, struct Node * t) { |  | ||||||
| 	t->next = list->next; |  | ||||||
| 	t->prev = list; |  | ||||||
| 	if (t->next != list) { |  | ||||||
| 		t->next->prev = t; |  | ||||||
| 	} |  | ||||||
| 	else { |  | ||||||
| 		t->next = list; |  | ||||||
| 		list->prev = t; |  | ||||||
| 	} |  | ||||||
| 	list->next = t; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void list_insert_before(struct Node * list, struct Node * t) { |  | ||||||
| 	t->next = list; |  | ||||||
| 	t->prev = list->prev; |  | ||||||
| 	if (t->prev != list) { |  | ||||||
| 		t->prev->next = t; |  | ||||||
| 	} |  | ||||||
| 	else { |  | ||||||
| 		t->prev = list; |  | ||||||
| 		list->next = t; |  | ||||||
| 	} |  | ||||||
| 	list->prev = t; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void list_remove(struct Node * t) { |  | ||||||
| 	t->prev->next = t->next; |  | ||||||
| 	t->next->prev = t->prev; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| struct Node * list_push_front(struct Node * list, Data d) { |  | ||||||
| 	struct Node *ptr = list->next; |  | ||||||
| 	struct Node *oth = malloc(sizeof(struct Node)); |  | ||||||
| 	oth->data = d; |  | ||||||
| 	oth->next = ptr; |  | ||||||
| 	oth->prev = list; |  | ||||||
| 	list->next = oth; |  | ||||||
| 	ptr->prev = oth; |  | ||||||
| 	return list; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| struct Node * list_push_back(struct Node * list, Data d) { |  | ||||||
| 	struct Node *ptr = list->prev; |  | ||||||
| 	struct Node *oth = malloc(sizeof(struct Node)); |  | ||||||
| 	oth->data = d; |  | ||||||
| 	oth->next = list; |  | ||||||
| 	oth->prev = ptr; |  | ||||||
| 	list->prev = oth; |  | ||||||
| 	ptr->next = oth; |  | ||||||
| 	return list; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| int list_is_empty(struct Node * list) { |  | ||||||
| 	if (list == list->next) { |  | ||||||
| 		return 1; |  | ||||||
| 	} |  | ||||||
| 	return 0; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| int list_clear(struct Node * list) { |  | ||||||
| 	struct Node *ptr = list->next; |  | ||||||
| 	 |  | ||||||
| 	struct Node *n; |  | ||||||
| 	while (ptr->next != list) { |  | ||||||
| 		n = ptr->next; |  | ||||||
| 		free(ptr); |  | ||||||
| 		ptr = n; |  | ||||||
| 	}	 |  | ||||||
| 	list->next = list; |  | ||||||
| 	list->prev = list; |  | ||||||
| 	return 0; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| Data list_pop_front(struct Node * list) { |  | ||||||
| 	struct Node *ptr = list->next; |  | ||||||
| 	Data val = ptr->data; |  | ||||||
| 	list->next = ptr->next; |  | ||||||
| 	ptr->next->prev = list; |  | ||||||
| 	free(ptr); |  | ||||||
| 
 |  | ||||||
| 	return val; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| Data list_pop_back(struct Node * list) { |  | ||||||
| 	struct Node *ptr = list->prev; |  | ||||||
| 	Data val = ptr->data; |  | ||||||
| 	list->prev = ptr->prev; |  | ||||||
| 	ptr->prev->next = list; |  | ||||||
| 	free(ptr); |  | ||||||
| 
 |  | ||||||
| 	return val; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| Data list_delete(struct Node * t) { |  | ||||||
| 	if (t->next == t) { |  | ||||||
| 		return -1; |  | ||||||
| 	} |  | ||||||
| 	t->prev->next = t->next; |  | ||||||
| 	t->next->prev = t->prev; |  | ||||||
| 	Data val = t->data; |  | ||||||
| 	free(t); |  | ||||||
| 	return val; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void list_for_each(struct Node * list, void (*func)(Data d, void * param), void * param) { |  | ||||||
| 	struct Node *ptr = list->next; |  | ||||||
| 	while (ptr->next != list) { |  | ||||||
| 		func(ptr->data, param); |  | ||||||
| 		ptr = ptr->next; |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void sum(Data a, void * s) { |  | ||||||
| 	*(Data *)s += a; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void print_it(Data d, void * param) { |  | ||||||
| 	FILE * fd = param; |  | ||||||
| 	fprintf(fd, "%d ", d); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| Data list_sum (struct Node * list) { |  | ||||||
| 	int s = 0; |  | ||||||
| 	list_for_each(list, sum, &s); |  | ||||||
| 	return s; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| int list_size(struct Node *list) { |  | ||||||
| 	struct Node *ptr = list->next; |  | ||||||
| 	if (ptr == list) { |  | ||||||
| 		return 0; |  | ||||||
| 	} |  | ||||||
| 	int len = 1; |  | ||||||
| 
 |  | ||||||
| 	while (ptr->next != list) { |  | ||||||
| 		ptr = ptr->next; |  | ||||||
| 		++len; |  | ||||||
| 	} |  | ||||||
| 	return len; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| #define MAX 1000000 |  | ||||||
| 
 |  | ||||||
| int main() { |  | ||||||
| 	int i, k, l; |  | ||||||
| 	struct Node * a = malloc(sizeof(struct Node)); |  | ||||||
| 	struct Node * b = malloc(sizeof(struct Node));	 |  | ||||||
| 	list_init(a); |  | ||||||
| 	list_init(b); |  | ||||||
| 	int A[5], B[5]; |  | ||||||
| 
 |  | ||||||
| 	for (i = 0; i < 5; ++i) { |  | ||||||
| 		scanf("%d", &A[i]); |  | ||||||
| 		list_push_back(a, A[i]); |  | ||||||
| 	} |  | ||||||
| 	 |  | ||||||
| 	for (i = 0; i < 5; ++i) { |  | ||||||
| 		scanf("%d", &B[i]); |  | ||||||
| 		list_push_back(b, B[i]); |  | ||||||
| 	} |  | ||||||
| 	 |  | ||||||
| 	for (i = 0;; ++i) { |  | ||||||
| 		if (i == MAX) { |  | ||||||
| 			printf("botva\n"); |  | ||||||
| 			while(list_delete(a->next) != -1); |  | ||||||
| 			while(list_delete(b->next) != -1); |  | ||||||
| 			free(a); free(b); |  | ||||||
| 			return 0; |  | ||||||
| 		} |  | ||||||
| 		if (list_size(a) == 0) { |  | ||||||
| 			printf("second %d\n", i); |  | ||||||
| 			while(list_delete(b->next) != -1); |  | ||||||
| 			free(a); free(b); |  | ||||||
| 			return 0; |  | ||||||
| 		} |  | ||||||
| 		if (list_size(b) == 0) { |  | ||||||
| 			printf("first %d\n", i); |  | ||||||
| 			while(list_delete(a->next) != -1); |  | ||||||
| 			free(a); free(b); |  | ||||||
| 			return 0; |  | ||||||
| 		} |  | ||||||
| 		k = list_pop_front(a); |  | ||||||
| 		l = list_pop_front(b); |  | ||||||
| 		 |  | ||||||
| 		if ((k == 9) && (l == 0)) { |  | ||||||
| 			list_push_back(b, k); |  | ||||||
| 			list_push_back(b, l);		 |  | ||||||
| 		} |  | ||||||
| 		else if ((k == 0) && (l == 9)) { |  | ||||||
| 			list_push_back(a, k); |  | ||||||
| 			list_push_back(a, l); |  | ||||||
| 		} |  | ||||||
| 		else if (k > l) { |  | ||||||
| 			list_push_back(a, k); |  | ||||||
| 			list_push_back(a, l); |  | ||||||
| 		} |  | ||||||
| 		else { |  | ||||||
| 			list_push_back(b, k); |  | ||||||
| 			list_push_back(b, l);	 |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
|  | @ -1,185 +0,0 @@ | ||||||
| #include <stdio.h> |  | ||||||
| #include <stdlib.h> |  | ||||||
| 
 |  | ||||||
| typedef int Data; |  | ||||||
| struct Node { |  | ||||||
| 	Data val; |  | ||||||
| 	struct Node * next; |  | ||||||
| }; |  | ||||||
| struct List { |  | ||||||
| 		struct Node * head; |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| struct List * list_create (); |  | ||||||
| void list_add_first (struct List * list, Data x); |  | ||||||
| void list_add_last (struct List * list, Data x); |  | ||||||
| Data list_remove_first (struct List * list);  |  | ||||||
| Data list_remove_last (struct List * list); |  | ||||||
| Data list_get_first (struct List * list); |  | ||||||
| Data list_get_last (struct List * list); |  | ||||||
| void list_print (struct List * list); |  | ||||||
| int list_size(struct List * list); |  | ||||||
| void list_clear(struct List * list); |  | ||||||
| void list_destroy (struct List * list); |  | ||||||
| 
 |  | ||||||
| struct List * list_create () { |  | ||||||
| 	struct List *list = malloc(sizeof(struct List)); |  | ||||||
| 	list->head = NULL; |  | ||||||
| 	return list; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void list_add_last (struct List * list, Data x) { |  | ||||||
| 	struct Node *ptr = list->head; |  | ||||||
| 	if (ptr == NULL) { |  | ||||||
| 		struct Node *oth = malloc(sizeof(struct Node)); |  | ||||||
| 		oth->val = x; |  | ||||||
| 		oth->next = NULL; |  | ||||||
| 		list->head = oth; |  | ||||||
| 	} |  | ||||||
| 	else { |  | ||||||
| 		while (ptr->next != NULL) { |  | ||||||
| 			ptr = ptr->next;  |  | ||||||
| 		} |  | ||||||
| 		struct Node *oth = malloc(sizeof(struct Node)); |  | ||||||
| 		oth->val = x; |  | ||||||
| 		oth->next = NULL; |  | ||||||
| 		ptr->next = oth;	 |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void list_add_first (struct List * list, Data x) { |  | ||||||
| 	struct Node *ptr = list->head; |  | ||||||
| 	if (ptr == NULL) { |  | ||||||
| 		struct Node *oth = malloc(sizeof(struct Node)); |  | ||||||
| 		oth->val = x; |  | ||||||
| 		oth->next = NULL; |  | ||||||
| 		list->head = oth; |  | ||||||
| 	} |  | ||||||
| 	else { |  | ||||||
| 		struct Node *oth = malloc(sizeof(struct Node)); |  | ||||||
| 		oth->val = x; |  | ||||||
| 		oth->next = ptr; |  | ||||||
| 		list->head = oth;	 |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void list_print(struct List * list) { |  | ||||||
| 	struct Node *ptr = list->head; |  | ||||||
| 	if (ptr == NULL) { |  | ||||||
| 		printf("Empty list\n"); |  | ||||||
| 	} |  | ||||||
| 	else { |  | ||||||
| 		while (ptr->next != NULL) { |  | ||||||
| 			printf("%d ", ptr->val); |  | ||||||
| 			ptr = ptr->next; |  | ||||||
| 		} |  | ||||||
| 		printf("%d\n", ptr->val); |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| Data list_remove_first (struct List * list) { |  | ||||||
| 	struct Node *ptr = list->head; |  | ||||||
| 	Data val = ptr->val; |  | ||||||
| 	if (ptr->next == NULL) { |  | ||||||
| 		list->head = NULL; |  | ||||||
| 	} |  | ||||||
| 	else { |  | ||||||
| 		list->head = list->head->next; |  | ||||||
| 	} |  | ||||||
| 	free(ptr); |  | ||||||
| 	return val; |  | ||||||
| }  |  | ||||||
| 
 |  | ||||||
| Data list_remove_last (struct List * list) { |  | ||||||
| 	struct Node *ptr = list->head; |  | ||||||
| 	Data val; |  | ||||||
| 	if (ptr->next == NULL) { |  | ||||||
| 		list->head = NULL; |  | ||||||
| 		val = ptr->val; |  | ||||||
| 		free(ptr); |  | ||||||
| 	} |  | ||||||
| 	else { |  | ||||||
| 		while (ptr->next->next != NULL) { |  | ||||||
| 			ptr = ptr->next; |  | ||||||
| 		}	 |  | ||||||
| 
 |  | ||||||
| 		struct Node* lastNode = ptr->next; |  | ||||||
| 		val = lastNode->val; |  | ||||||
| 		ptr->next = NULL; |  | ||||||
| 		free(lastNode); |  | ||||||
| 	} |  | ||||||
| 	 |  | ||||||
| 	return val; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| Data list_get_first (struct List * list) { |  | ||||||
| 	return list->head->val; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| Data list_get_last (struct List * list) { |  | ||||||
| 	struct Node *ptr = list->head;	 |  | ||||||
| 	while (ptr->next != NULL) { |  | ||||||
| 		ptr = ptr->next; |  | ||||||
| 	} |  | ||||||
| 	return ptr->val; |  | ||||||
| } |  | ||||||
| int list_size(struct List * list) { |  | ||||||
| 	struct Node *ptr = list->head; |  | ||||||
| 	if (ptr == NULL) { |  | ||||||
| 		return 0; |  | ||||||
| 	} |  | ||||||
| 	int len = 1; |  | ||||||
| 	while (ptr->next != NULL) { |  | ||||||
| 		ptr = ptr->next; |  | ||||||
| 		++len; |  | ||||||
| 	} |  | ||||||
| 	return len; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void list_clear(struct List * list) {	 |  | ||||||
| 	struct Node *ptr = list->head; |  | ||||||
| 	 |  | ||||||
| 	if (ptr == NULL) { |  | ||||||
| 		free(ptr); |  | ||||||
| 	} |  | ||||||
| 	else { |  | ||||||
| 		struct Node *next; |  | ||||||
| 		while (ptr->next != NULL) { |  | ||||||
| 			next = ptr->next; |  | ||||||
| 			free(ptr); |  | ||||||
| 			ptr = next; |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 	list->head = NULL; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void list_destroy (struct List * list) { |  | ||||||
| 	list_clear(list); |  | ||||||
| 	free(list); |  | ||||||
| } |  | ||||||
| int main() { |  | ||||||
| 	struct List * list = list_create(); |  | ||||||
| 	//printf("%d\n", list_size(list));
 |  | ||||||
| 	list_add_last(list, 5); |  | ||||||
| 	list_add_last(list, 6); |  | ||||||
| 	list_add_first(list, 3); |  | ||||||
| 	list_add_last(list, 8); |  | ||||||
| 	list_add_last(list, 9); |  | ||||||
| 	list_print(list); |  | ||||||
| 	printf("Removed - %d\n", list_remove_first(list)); |  | ||||||
| 	list_print(list); |  | ||||||
| 	printf("Removed - %d\n", list_remove_last(list)); |  | ||||||
| 	list_print(list); |  | ||||||
| 	printf("%d\n", list_get_first(list)); |  | ||||||
| 	printf("%d\n", list_get_last(list)); |  | ||||||
| 	printf("%d\n", list_size(list)); |  | ||||||
| 	//list_clear(list);
 |  | ||||||
| 	list_print(list); |  | ||||||
| 	list_destroy(list); |  | ||||||
| 	list_print(list); |  | ||||||
| 	/*list = list_create();
 |  | ||||||
| 	list_add_first(list, 5); |  | ||||||
| 	list_print(list); |  | ||||||
| 	list_destroy(list);*/ |  | ||||||
| } |  | ||||||
|  | @ -63,8 +63,16 @@ void tree_destroy (struct Node * tree) { | ||||||
| 	} | 	} | ||||||
| 	free(tree); | 	free(tree); | ||||||
| } | } | ||||||
| 
 | unsigned int tree_height(struct Node * tree){ | ||||||
| /*int main() {
 | 	unsigned int l, r; | ||||||
|  | 	if (tree != NULL) { | ||||||
|  | 		l = (tree->left  != NULL) ? tree_height(tree->left) : 0; | ||||||
|  | 		r = (tree->right != NULL) ? tree_height(tree->right): 0; | ||||||
|  | 		return ((l > r) ? l : r) + 1; | ||||||
|  | 	} | ||||||
|  | 	return 0; | ||||||
|  | } | ||||||
|  | int main() { | ||||||
| 	struct Node * tree = NULL; | 	struct Node * tree = NULL; | ||||||
| 	tree = tree_add(tree, 7); | 	tree = tree_add(tree, 7); | ||||||
| 	//printf("Tree - [%p]\n", tree);
 | 	//printf("Tree - [%p]\n", tree);
 | ||||||
|  | @ -79,5 +87,6 @@ void tree_destroy (struct Node * tree) { | ||||||
| 	tree = tree_add(tree, 8); | 	tree = tree_add(tree, 8); | ||||||
| 	//printf("Tree - [%p]\n", tree);
 | 	//printf("Tree - [%p]\n", tree);
 | ||||||
| 	tree_print(tree); | 	tree_print(tree); | ||||||
|  | 	printf("Tree height - %d\n", tree_height(tree)); | ||||||
| 	tree_destroy(tree); | 	tree_destroy(tree); | ||||||
| } */ | }  | ||||||
|  |  | ||||||
							
								
								
									
										87
									
								
								list_and_trees/trees/tree3.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										87
									
								
								list_and_trees/trees/tree3.c
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,87 @@ | ||||||
|  | #include <stdio.h> | ||||||
|  | #include <stdlib.h> | ||||||
|  | 
 | ||||||
|  | typedef int Data; | ||||||
|  | 
 | ||||||
|  | struct Node { | ||||||
|  | 	Data val;            // данные в узле
 | ||||||
|  | 	struct Node * left;  // левый ребенок
 | ||||||
|  | 	struct Node * right; // правый ребенок
 | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | struct Node * tree_add (struct Node * tree, Data x) {	 | ||||||
|  | 	if (tree == NULL) { | ||||||
|  | 		struct Node * data = malloc(sizeof(struct Node)); | ||||||
|  | 		data->left = NULL; data->right = NULL; | ||||||
|  | 		data->val = x; | ||||||
|  | 		//printf("Init tree - %d[%p]\n", data->val, data);
 | ||||||
|  | 		return data; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if (x < tree->val) { | ||||||
|  | 		if (tree->left == NULL) { | ||||||
|  | 			struct Node * data = malloc(sizeof(struct Node)); | ||||||
|  | 			data->left = NULL; data->right = NULL; | ||||||
|  | 			data->val = x; | ||||||
|  | 			tree->left = data; | ||||||
|  | 			//printf("Added - %d [%p] to node %d[%p] left[%p], right[%p]\n", x, data, tree->val, tree, tree->left, tree->right );
 | ||||||
|  | 		} | ||||||
|  | 		else { | ||||||
|  | 			tree_add(tree->left, x); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	if (x > tree->val) { | ||||||
|  | 		if (tree->right == NULL) { | ||||||
|  | 			struct Node * data = malloc(sizeof(struct Node)); | ||||||
|  | 			data->left = NULL; data->right = NULL; | ||||||
|  | 			data->val = x; | ||||||
|  | 			tree->right = data; | ||||||
|  | 			//printf("Added - %d [%p] to node %d[%p] left[%p], right[%p]\n", x, data, tree->val ,tree, tree->left, tree->right );
 | ||||||
|  | 		} | ||||||
|  | 		else { | ||||||
|  | 			tree_add(tree->right, x); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	return tree; | ||||||
|  | 	 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void tree_print (struct Node * tree) { | ||||||
|  | 	if (tree != NULL) { | ||||||
|  | 		tree_print(tree->left); | ||||||
|  | 		printf("%d ", tree->val); | ||||||
|  | 		tree_print(tree->right); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void tree_destroy (struct Node * tree) { | ||||||
|  | 	if (tree->left != NULL) { | ||||||
|  | 		tree_destroy(tree->left); | ||||||
|  | 	} | ||||||
|  | 	if(tree->right != NULL) { | ||||||
|  | 		tree_destroy(tree->right); | ||||||
|  | 	} | ||||||
|  | 	free(tree); | ||||||
|  | } | ||||||
|  | unsigned int tree_height(struct Node * tree){ | ||||||
|  | 	unsigned int l, r; | ||||||
|  | 	if (tree != NULL) { | ||||||
|  | 		l = (tree->left  != NULL) ? tree_height(tree->left) : 0; | ||||||
|  | 		r = (tree->right != NULL) ? tree_height(tree->right): 0; | ||||||
|  | 		return ((l > r) ? l : r) + 1; | ||||||
|  | 	} | ||||||
|  | 	return 0; | ||||||
|  | } | ||||||
|  | int main() { | ||||||
|  | 	int i; | ||||||
|  | 
 | ||||||
|  | 	struct Node * tree = NULL; | ||||||
|  | 	scanf("%d", &i); | ||||||
|  | 	while (i) { | ||||||
|  | 		tree = tree_add(tree, i); | ||||||
|  | 		scanf("%d", &i);	 | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	printf("%d\n", tree_height(tree)); | ||||||
|  | 	tree_destroy(tree); | ||||||
|  | }  | ||||||
							
								
								
									
										30
									
								
								sort/main.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								sort/main.c
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,30 @@ | ||||||
|  | #include <stdio.h> | ||||||
|  | #include <stdbool.h> | ||||||
|  | #include <time.h> | ||||||
|  | #include <stdlib.h> | ||||||
|  | #include "sorts.c" | ||||||
|  | #define ALEN 1000 | ||||||
|  | #define DISPLEN 25 | ||||||
|  | #define THRESHOLD 25 | ||||||
|  | 
 | ||||||
|  | int main() { | ||||||
|  | 	srand(time(NULL)); | ||||||
|  | 	int a[ALEN]; | ||||||
|  | 	for (int i = 0; i < ALEN; a[i++] = rand() % (2 * ALEN)); | ||||||
|  | 
 | ||||||
|  | 	printf("Before:\n"); | ||||||
|  | 	for (int i = 0; i < DISPLEN; ++i) { | ||||||
|  | 		printf("%d ", a[i]); | ||||||
|  | 	} | ||||||
|  | 	putchar('\n'); | ||||||
|  | 
 | ||||||
|  | 	//bubblesort(a, ALEN);
 | ||||||
|  | 	insertion(a, ALEN); | ||||||
|  | 	printf("After:\n"); | ||||||
|  | 	for (int i = 0; i < DISPLEN; ++i) { | ||||||
|  | 		printf("%d ", a[i]); | ||||||
|  | 	} | ||||||
|  | 	putchar('\n'); | ||||||
|  | 
 | ||||||
|  | 	return 0; | ||||||
|  | } | ||||||
							
								
								
									
										63
									
								
								sort/sorts.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										63
									
								
								sort/sorts.c
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,63 @@ | ||||||
|  | void bubblesort(int *a, int n); | ||||||
|  | 
 | ||||||
|  | void insertion(int *a, int n); | ||||||
|  | 
 | ||||||
|  | /* Сортировка пузырьком, сложность - O(n^2), устойчива */ | ||||||
|  | void bubblesort(int *a, int n) { | ||||||
|  | 	bool sorted = false; | ||||||
|  | 	while (!sorted) { | ||||||
|  | 		sorted = true; | ||||||
|  | 		for (int i = 0; i < n-1; i++) { | ||||||
|  | 			if (a[i] > a[i+1]) { | ||||||
|  | 				int t = a[i]; | ||||||
|  | 				a[i] = a[i+1]; | ||||||
|  | 				a[i+1] = t; | ||||||
|  | 				sorted = false; | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		n--; | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /* Сортировка вставками, для упорядоченного массива - O(n), в худшем случае - O(n^2), устойчива */ | ||||||
|  | void insertion(int *a, int n) { | ||||||
|  | 	for (int i = n-1; i > 0; i--) { | ||||||
|  | 		if (a[i-1] > a[i]) { | ||||||
|  | 			int t = a[i-1]; a[i-1] = a[i]; a[i] = t; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	for (int i = 2; i < n; i++) { | ||||||
|  | 		int j = i; | ||||||
|  | 		int tmp = a[i]; | ||||||
|  | 		while (tmp < a[j-1]) { | ||||||
|  | 			a[j] = a[j-1]; j--; | ||||||
|  | 		} | ||||||
|  | 		a[j] = tmp; | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /* Функция слияния двух массивов, сложность - O(n) */ | ||||||
|  | void merge(int *a, int low, int mid, int high, int *aux) { | ||||||
|  |    int i,j; | ||||||
|  |    for (i = mid+1; i > low; i--) aux[i-1] = a[i-1]; | ||||||
|  |    for (j = mid; j < high; j++) aux[high+mid-j]=a[j+1]; | ||||||
|  |    for (int k = low; k <= high; k++) { | ||||||
|  |       if (aux[j] < aux[i]) | ||||||
|  |          a[k] = aux[j--]; | ||||||
|  |       else | ||||||
|  |          a[k] = aux[i++]; | ||||||
|  |    } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void mergeSort(int *a, int low, int high) { | ||||||
|  | 	if (high - low < THRESHOLD) { | ||||||
|  | 		insertion(a, high-low); | ||||||
|  | 	} | ||||||
|  | 	else { | ||||||
|  | 		int mid = (low + high)/2; | ||||||
|  | 		mergeSort(a, low, mid); | ||||||
|  | 		mergeSort(a, mid+1, high); | ||||||
|  | 		merge(a, low, mid, high); | ||||||
|  | 
 | ||||||
|  | 	} | ||||||
|  | } | ||||||
		Reference in a new issue