Готовая программа, но есть зацикливание. Как исправить? - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Здраствуйте!Написал программу,есть проблемы с зацикливанием,кто может подсказать как это исправить тут?
typedef struct node list;
 
struct node{
    int sec;
    char ch;
    int id;
    list *next;
};
 
list *head;
 
int input(void);
int count(void);
list *create_list(char, int, int);
void addInList(list *, list *);
void global_sort(list *);
int check(void);
int check_hronologia(list *);
int check_time(int, int, int, int);
int *create(void);
int in_sec(int, int, int);
int find_max_time(int *, int);
int *increase(int *, int);
void max_time(int);
 
int main(void){
    printf("Zaznamy o dochazce:\n");
    if(input()){
        printf("Nespravny vstup.\n");
        return 1;
    }
    if(head->next == NULL || check()){
        printf("Nespravny vstup.\n");
        return 1;
    }
    if(count()){
        printf("Nespravny vstup.\n");
        return 1;
    }
    return 0;
}
 
int input(void){
    head = create_list('.', 0, 0);
    list *temp = create_list('.', 0, 0);
    list *prev = temp;
    char ch, ch1, ch2;
    int h,m,s,index;
    while((ch = getchar()) != EOF){
        if(ch == '\n')continue;
        if(ch == '#'){
            if(check_hronologia(temp->next)){ 
                free(temp);
                free(head);
                return 1;
            }
            global_sort(temp->next);
            free(temp);
            temp = create_list('.', 0, 0);
            prev = temp;
            continue;
        }
        scanf("%d %c %d %c %d %d", &h, &ch1, &m, &ch2, &s, &index);
        fflush(stdin);
        if(check_time(h, m, s, index) || (ch != '+' && ch != '-')){ 
            free(temp);
            free(head);
            return 1;
        }
        list *a = create_list(ch, in_sec(h, m, s), index);
        prev->next = a;
        a = NULL;
        free(a);
        prev = prev->next;
    }
    
    if(temp->next != NULL){
        if(check_hronologia(temp->next)) return 1;
        global_sort(temp->next);
    }
    free(temp);
    return 0;
}
 
int check(void){
    list *cur;
    cur = head->next;
    int cnt=0, i, tmp;
    int *ID;
    ID = create();
    while(cur != NULL){
        if(cur->ch == '+'){
            for(i=0; i<cnt; i++){
                if(cur->id == ID[i]){
                    free(ID);
                    free(cur);
                    return 1;
                }
            }
            ID[cnt++] = cur->id;
            ID = increase(ID, (cnt+1));
        }
        else{
            tmp = cnt;
            for(i=0; i<cnt; i++){
                if(cur->id == ID[i]){
                    for(; i+1<cnt; i++)
                        ID[i] = ID[i+1];
                    cnt--;
                    break;
                }
            }
            if(tmp == cnt){
                free(ID);
                free(cur);
                return 1;
            }
        }
        cur = cur->next;
    }
    if(cnt != 0){
        free(head);
        free(ID);
        free(cur);
        return 1;
    }
    free(ID);
    free(cur);
    return 0;
}
 
int count(void){
    int *count_time, *index, n=0, i, find, j;
    index = create();
    count_time = create();
    list *cur = head->next;
    list *tmp;
    while(cur != NULL){
        if(cur->ch == '+'){
            tmp = cur->next;
            while(tmp != NULL){
                if(tmp->ch == '-' && (tmp->id == cur->id) ){
                    if(tmp->sec == cur->sec){ free(count_time); free(index); free(cur); free(tmp); return 1;}
                    find =0;
                    for(i=0; i<n; i++){
                        if(index[i]==tmp->id){
                            count_time[i] += (tmp->sec)-(cur->sec);
                            find = 1;
                            break;
                        }
                    }
                    if(!find){
                        index[n] = tmp->id;
                        count_time[n++] = (tmp->sec)-(cur->sec);
                        index = increase(index, (n+1));
                        count_time = increase(count_time, (n+1));
                    }
                    break;
                }
                else tmp = tmp->next;
            }
        }
        cur = cur->next;
    }
    
    int k = find_max_time(count_time, n);
    int *q, l=0;
    q = create();
    for(i=0; i<n; i++){
        if(count_time[i] == k){
            q[l++] = index[i];
            q = increase(q, (l+1));
        }
    }
    for(i=0; i<l-1; i++){
        for(j=i+1; j<l; j++){
            if(q[i] > q[j]){
                int t=q[i];
                q[i] = q[j];
                q[j] = t;
            }
        }
    }
    printf("Nejdelsi pracovni doba: ");
    max_time(k);
    if(l!=1) printf("Pracovnici dne: ");
    else printf("Pracovnik dne: ");
    for(i=0; i<l; i++){
        if(i != l-1) printf("%d, ", q[i]);
        else printf("%d\n", q[i]);
    }
    free(q);
    free(count_time); 
    free(index); 
    free(cur); 
    free(tmp); 
    free(head);
    return 0;
}
 
void global_sort(list *a){
    list *prev;
    list *cur;
    while(a != NULL){
        prev = head;
        cur = head->next;
        while(cur != NULL){
            if(a->sec < cur->sec){
                prev->next = a;
                a = a->next;
                prev->next->next = cur;
                break;
            }
            prev = cur;
            cur = cur->next;
        }
        if(cur == NULL){
            prev->next = a;
            a = a->next;
            prev->next->next = NULL;
        }
    }
}
 
int check_hronologia(list *a){
    int s=0;
    while(a != NULL){
        if(a->sec < s) return 1; 
        s = a->sec;
        a = a->next;
    }
    return 0;
}
 
list *create_list(char ch, int sec, int id){
    list *p;
    p = (list *)calloc(1, sizeof(list));
    p->ch = ch;
    p->sec = sec;
    p->id = id;
    p->next = NULL;
    return p;
}
 
int check_time(int h, int m, int s, int id){
    if(h<0 || h > 23)return 1;
    if(m < 0 || m > 59) return 1;
    if(s < 0 || s > 59) return 1;
    if(id < 1 || id > 100000) return 1; 
    return 0;
}
 
int in_sec(int hour, int minut, int second){
    return 3600*hour+60*minut+second;
}
 
int find_max_time(int *a, int n){
    int max=a[0], i;
    for(i=1; i<n; i++)
        if(a[i] > max) max = a[i];
    return max;
}
void max_time(int k){
    printf("%d:", k/3600);
    k %= 3600;
    if(k/60 < 10) printf("%d", 0);
    printf("%d:", k/60);
    k %= 60;
    if(k < 10) printf("%d", 0);
    printf("%d\n", k);
}
int *create(void){
    int *a;
    a = (int *)calloc(1, sizeof(int));
    return a;
}
int *increase(int *a, int n){
    a = (int *)realloc(a, n*sizeof(int));
    return a;
}

Решение задачи: «Готовая программа, но есть зацикливание. Как исправить?»

textual
Листинг программы
scanf(" %d:%d:%d %d", &h, &m, &s, &index);

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 3.929 из 5
Похожие ответы