Проблемы с использованием кругового связанного списка для часов

Так что я получил эту работу, которую я должен дать о создании цифровых часов. Пользователь устанавливает количество узлов, и каждый узел равен 1/n секунды, где N — это количество узлов, которые помещает пользователь. После этого меня вызывают, чтобы сделать 3 указателя:

  • один на секунды
  • один на минуты
  • один на несколько часов

Указатель Seconds должен запускать все узлы в кольцевой ссылке. Для полного оборота указатель минут должен начать двигаться к следующему узлу, и после общего числа 60 перемещений указателя минут сразу после этого должен следовать указатель часов. Часы должны делать следующие вещи:

  1. Пользователь может установить часы на ноль: 00:00:00;

  2. Пользователь может установить часы с точностью до секунд.

  3. Программа должна показывать часы после каждого действия.

  4. Пользователь может запрограммировать часы на будильник, при котором часы показывают сообщение пользователю.

  5. Ему нужно найти следующий час, когда его указатели (на часах, а не в программе) выровняются (например: 12:00,01:05,02:10,03:15 и т. д.)

  6. он завершает программу после освобождения всей оставшейся памяти, которую использовал наш список.

вот мой код, но у меня возникли некоторые трудности с ним.

#include<stdio.h>
#include<stdlib.h>
int counter=0;
typedef struct Node 
{
    int data;
    struct Node *next;
}node;

void insert(node *pointer, int data)
{
    node *start = pointer;
    /* Iterate through the list till we encounter the last node.*/
    while(pointer->next!=start)
    {
        pointer = pointer -> next;
    }
    /* Allocate memory for the new node and put data in it.*/

    pointer->next = (node *)malloc(sizeof(node));
    pointer = pointer->next;
    pointer->data = data;
    pointer->next = start;
} 

void print(node *start,node *pointer)
{
    if(pointer==start)
    {
            return;
    }
    printf("%d ",pointer->data);
    print(start,pointer->next);
}

int main()
{
    /* start always points to the first node of the linked list.
       temp is used to point to the last node of the linked list.*/
    node *start,*temp;
    start = (node *)malloc(sizeof(node)); 
    temp = start;
    temp -> next = start;
    /* Here in this code, we take the first node as a dummy node.
       The first node does not contain data, but it used because to avoid handling special cases
       in insert and delete functions.
     */
    node *sec,*min,*hour;
    int v,c,n;
    printf("1. Insert N\n");
    printf("2. Make Time Zero\n");
    printf("3. Set Clock\n");    
    int query;
    scanf("%d",&query);
    if(query==1)
    {
        int data,i,n;
        printf("Posa n thes\n");
        scanf("%d",&n);
        for (i = 0; i < 60*n; i++)
        {    
            data = i;
            insert(start,data);
            printf("%d\n",i);
        }

        node *sec_copy;
        sec_copy=start;
        min=start;
        hour=start;

        while(n>0)
        {    
            sec_copy=sec_copy->next;
            n--;
            c++;
            if(c == 59*n)
            {
                min=min->next;
                c=0;
                v++;
            }
            if(v == 60)
            {
                hour=hour->next;
                v=0;
            }
        } 
    }

    printf("%d",sec->data);
    if(query==2)
    {    
        int timer;
        timer=0;
        printf("%.2d:%.2d:%.2d",timer,timer,timer);

    }
    if(query==3)
    {
        int h,m,s;
        printf("Set me hours");
        scanf("%d",&h);
        h = h%24;
        printf("Set me min");
        scanf("%d",&m);
        h = h+m/60;
        m = m%60;
        printf("Set me secs");
        scanf("%d",&s);
        h = h + s/3600;
        m = m + s%3600;
        s = s%60;
    }
 }

person Andreakos    schedule 05.11.2014    source источник
comment
Пора (каламбур не предназначен) научиться пользоваться отладчиком. С помощью отладчика вы можете пошагово пройти программу, строка за строкой, и просмотреть значения переменных. Это поможет вам понять, что происходит на самом деле.   -  person Some programmer dude    schedule 05.11.2014
comment
"у меня с этим проблемы" - не могли бы вы быть более расплывчатым?   -  person Martin James    schedule 05.11.2014
comment
@MartinJames говорит, что ядро ​​​​ошибки сегментации сброшено после некоторого редактирования, которое я сделал.   -  person Andreakos    schedule 05.11.2014
comment
@JoachimPileborg с кем бы ты хотел поделиться со мной? Будут оценены!   -  person Andreakos    schedule 05.11.2014
comment
Вы имеете в виду, что у вас возникли проблемы с компиляцией программы, которую вы разместили? Я.   -  person Weather Vane    schedule 05.11.2014
comment
@WeatherVane Нет, при компиляции я в порядке, но когда я начинаю работать, он говорит, что ядро ​​ошибки сегментации тупое, и я не могу найти свои ошибки.   -  person Andreakos    schedule 05.11.2014
comment
@Andreakos Я говорю, что код, который вы опубликовали, не скомпилируется. Поэтому я не буду пытаться искать ошибки, которых нет в версии, которая будет компилироваться.   -  person Weather Vane    schedule 05.11.2014
comment
@WeatherVane хорошо, исправлено! По какой-то причине он был изменен по сравнению с моим файлом. Спасибо, что указали на это!   -  person Andreakos    schedule 05.11.2014
comment
Я предлагаю вам скопировать всю программу, которая в том виде, в каком она была опубликована, все равно закончилась преждевременно (вы ее совсем недавно снова редактировали). Но замечу одну проблему - ; после ваших условных тестов делает их неэффективными. В if(query==2); { ...code... } всегда выполняется код в фигурных скобках.   -  person Weather Vane    schedule 05.11.2014


Ответы (1)


Как указал Jochaim Pileborg, вам действительно нужно использовать для этого отладчик.

Единственная причина segfault, которую я вижу, заключается в том, что вы вызываете: printf("%d",sec->data); без инициализации sec.
Вы также не инициализируете 'v' и 'c', и в вашем решении есть две переменные 'n'.

person Jonathan Mee    schedule 05.11.2014