Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
0
Добавлен:
16.11.2025
Размер:
4.05 Кб
Скачать
#include <stdio.h>
#include <stdlib.h>
// po bolshey chasti, funktsii zdes' - pererabotka funtsiy iz proshloy raboti
typedef struct el{ // element lista
    int inf;
    struct el *next;
    struct el *prev;
} EL;
typedef struct q{ // nach. i kon. ukazateli lista
    EL *beg;
    EL *end;
} Q;
void push_end(Q *q, int val) { // dob. v konets
    EL *p;
    p = (EL*) malloc(sizeof(EL));
    p->inf = val;
    p->prev = NULL;
    p->next = NULL;
    if (q->end == NULL) {
        q->beg = p;
        q->end = p;
        }
    else {
            p->prev=q->end;
            q->end->next = p;
            q->end = p;
        }
}
void push_start(Q *q, int val) { // dob. v nachalo
    EL *p;
    p = (EL*) malloc(sizeof(EL));
    p->inf = val;
    p->next = NULL;
    p->prev = NULL;
    if (q->end == NULL) {
        q->beg = p;
        q->end = p;
        }
    else {
            p->next=q->beg;
            q->beg->prev=p;
            q->beg = p;
        }
}
void pop_start(Q *q) { // udal. s nachala
    if (q->beg == NULL) { // popitka udaleniya iz pustogo lista
        exit(1);
        }
    else if((q->beg)==(q->end)){
        q->beg=NULL;
        q->end=NULL;
    }
    else {
            q->beg=q->beg->next;
            q->beg->prev=NULL;
        }
}
void pop_end(Q *q) { // udalenie s kontsa
    if (q->beg == NULL) { // popitka udaleniya iz pustogo lista
        exit(1);
    }
    else if((q->beg)==(q->end)){
        q->beg=NULL;
        q->end=NULL;
    }
    else{
        q->end=q->end->prev;
        q->end->next=NULL;
    }
}
void output(Q *q){
    EL *p;
    if((q->beg)!=NULL){
        p=q->beg;
        while((p->next)!=NULL){
                printf("%4d", p->inf);
                p=p->next;
        }
        printf("%4d\n", p->inf);
    }
}
void inv_output(Q *q){ // vivod s kontsa
    EL *p;
    if((q->end)!=NULL){
        p=q->end;
        while((p->prev)!=NULL){
                printf("%4d", p->inf);
                p=p->prev;
        }
        printf("%4d\n", p->inf);
    }
}
int summ(Q *q){ // summa
    int s=0;
    EL *p;
    if((q->beg)!=NULL){
        p=q->beg;
        while((p->next)!=NULL){
                s+=p->inf;
                p=p->next;
        }
        s+=p->inf;
    }
    return(s);
}
void rand_push(Q *q, int a, int b, int n, int c){ // dobavit. sluchaynoe chislo v start (c=0) ili end (c!=0) n raz
    int i, r; // rand()%x = {0.. (x-1)}, rand()%(b-a+1) = {0.. b-a}, rand()%(b-a+1) + a = {a.. b} - to, chto nam nado;
    if(c){
        for(i=0; i<n; i++){
            r=rand()%(b-a+1)+a;
            push_end(q, r);
        }
    }
    else{
        for(i=0; i<n; i++){
                r=rand()%(b-a+1)+a;
                push_start(q, r);
        }
    }
}
void del(Q *q){ // udalenie vsego lista
    if (q->beg == NULL) { // popitka udaleniya iz pustogo lista
        exit(1);
    }
    while((q->beg)!=(q->end)){
        pop_end(q);
    }
    pop_end(q);
}
int main(void){
    Q *queue;
    int a, b, v, s=0;
    queue = (Q*) malloc(sizeof(Q));
    queue->beg == NULL;
    queue->end = NULL;
    a=scanf("%d", &b); // boolean: esli chislo, daet true, elsi bukva (v tom chisle "n" - to false)
    push_start(queue, b);
    while(a){ // zapolnenie
        a=scanf("%d", &b);
        if(a) push_end(queue, b);
    }
    pop_start(queue);
    pop_start(queue);
    /*
    v=getchar();
    scanf("%d", &v);
    */
    output(queue);
    printf("%d\n", summ(queue));
    /* Otladka funktis, kotorie ne ispol'zuyutsya, no nuzhni po zadaniyu
    rand_push(queue, 1, 25, 4, 0); // dobavit v nachalo 4 sluchaynih chisla iz {1, 25}
    rand_push(queue, 30, 45, 4, 1); // dobavit v konets
    output(queue); // vivod
    del(queue); // udalit' vse
    output(queue); // vivod (proverka, chto ne vivodit pustoi list)
    printf("!\n"); // otladochnoe
    rand_push(queue, 30, 45, 4, 1); // dobavit v konets
    output(queue); // vivod
    */
}
Соседние файлы в папке 3 семестр