Готовая программа, но есть зацикливание. Как исправить? - 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);
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д