Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- //создаем структуру элемента
- typedef struct _elem
- {
- int data;
- struct _elem *prev;
- struct _elem *next;
- }
- elem;
- typedef struct{
- int size;
- elem *head;
- elem *tail;
- }list;
- //прототипы функций
- list* create_list();
- elem* create_elem();
- void add_head(list*, int );
- void add_tail(list*, int );
- void add_elem(list*, int , int );
- void del_head(list* );
- void del_tail(list* );
- void del_elem(list* , int );
- void printlist(list*);
- void turnlist(list*);
- elem* get_el(list*, int*);
- int get_size(list* );
- int get_head(list* );
- int get_tail(list* );
- //создание пустого элемента
- elem* create_elem(){
- elem *r = malloc(sizeof(elem));
- r->prev = NULL;
- r->next = NULL;
- r->data = 0;
- return r;
- }
- //создание списка
- list* create_list(){
- list *r = malloc(sizeof(list));
- r->size = 0;
- r->head = NULL;
- r->tail = NULL;
- return r;
- }
- //добавление в начало
- void add_head(list *s, int x){
- elem *e = malloc(sizeof(elem));
- e->data = x;
- e->prev = NULL;
- e->next = s->head;
- if (s->head == NULL){
- s->head = s->tail = e;
- }
- else{
- s->head->prev = e;
- s->head = e;
- }
- s->size++;
- }
- //добавление в конец
- void add_tail(list *s, int x){
- elem *e = malloc(sizeof(elem));
- e->data = x;
- e->prev = s->tail;
- e->next = NULL;
- if (s->tail == NULL){
- s->tail = s->head = e;
- }
- else{
- s->tail->next = e;
- s->tail = e;
- }
- s->size++;
- }
- //взятие последнего
- int get_tail(list* s){
- return s->tail->data;
- }
- //взятие первого
- int get_head(list* s){
- return s->head->data;
- }
- //взятие произвольного
- elem* get_el(list *s, int *index){
- elem *p = s->head;
- if (index == 0){
- return get_head(s);
- }
- if (index == s->size - 1){
- return get_tail(s);
- }
- while (index>1){
- p = p->next;
- index--;
- }
- return p->data;
- }
- //добавление элемента
- void add_elem(list *s, int value, int index){
- elem *e = malloc(sizeof(elem));
- elem *p = s->head;
- if (index == 0){
- add_head(s, value);
- return;
- }
- if (s->head==s->tail){
- add_tail(s, value);
- return;
- }
- if (index == s->size - 1){
- add_tail(s, value);
- return;
- }
- while (index > 1){
- p = p->next;
- index--;
- }
- e->data = value;
- e->prev = p->prev;
- p->prev = e;
- e->next = p;
- e->prev->next = e;
- s->size++;
- }
- //удаление первого
- void del_head(list* s){
- elem* p=s->head->next;
- p->prev = NULL;
- s->head = p;
- s->size--;
- }
- //удаление последнего
- void del_tail(list* s){
- elem* p=s->tail->prev;
- p->next = NULL;
- s->tail = p;
- s->size--;
- }
- //удаление элемента
- void del_elem(list *s, int index){
- elem *p = s->head;
- elem *e = p->next;
- if (index == 0){
- del_head(s);
- return;
- }
- if (index == s->size - 1){
- del_tail(s);
- return;
- }
- while (index > 1){
- p = p->next + 1;
- index--;
- }
- p->next = p->next->next;
- p->next->prev = p;
- free(e);
- s->size--;
- }
- //вывод на экран
- void printlist(list *s){
- elem *p = s->head;
- while (p->next != NULL){
- printf("%d ", p->data);
- p = p->next;
- }
- if (p->next == NULL){
- printf("%d", p->data);
- printf("\n");
- return;
- }
- }
- //переворот
- void turnlist(list *s){
- elem *p;
- elem *q;
- elem *r;
- if (s == NULL){
- return;
- }
- if (s->head == NULL){
- return;
- }
- if (s->head->next == NULL){
- return;
- }
- p = s->head;
- q = s->head->next;
- if (get_size(s) == 1){
- return;
- }
- while (q!=NULL){
- r = q->next;
- q->next = p;
- p = q;
- q = r;
- }
- s->head->next = NULL;
- s->head = p;
- }
- //взятие размера
- int get_size(list* s) {
- return s->size;
- }
- void main(){
- int i = 0,j=0;
- list *a = create_list();
- for (i; i < 5; i++){
- add_elem(a,i,i);
- }
- printlist(a);
- del_head(a);
- add_tail(a, 8);
- add_head(a, 5);
- printlist(a);
- del_head(a);
- add_head(a, 100);
- turnlist(a);
- printlist(a);
- printf("%d\n", get_el(a, 0));
- printf("%d\n", get_size(a));
- j = get_size(a);
- for (j; j > 1;j--){
- del_tail(a);
- }
- printlist(a);
- del_head(a);
- printlist(a);
- turnlist(a);
- printlist(a);
- free(a);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement