2014-03-01 41 views
-1

所以,當我試圖刪除列表的第一個元素時,我得到了這個問題。奇怪的是我可以使用這個函數,直到列表中的三個元素,然後我的終端停下來回答。任何想法?刪除列表中的第一個元素

typedef struct event_t 
{ 
    double time; 
    char description[50]; 
    int id_origin, id_dest; 
    struct event_t *prox; 
} event_t; 

void 
event_remove_first (event_t ** list) 
{ 

    event_t *aux = *list; 

    if (*list == NULL) 
    printf ("Empty list\n"); 

    else 
    *list = aux->prox; 

    free (aux); 

} 

bool event_add_end (event_t **list, double time, char description[], int id_origin, int id_dest) { 

event_t *newelement = (event_t*)malloc(sizeof(event_t)); 
event_t *aux = *list, *prev = NULL; 

if (newelement!=NULL) { 
    newelement->time = time; 
    strcpy (newelement->description, description); 
    newelement->id_origin = id_origin; 
    newelement->id_dest = id_dest; 
    newelement->prox = NULL; 

    if (*list==NULL) 
     *list = newelement; 
    else { 

     while (aux!=NULL) { 
     prev = aux; 
     aux = aux->prox; 
     } 
    prev->prox = newelement; 
    } 


    return true; 
} 

else { 

    return false; 
} 
} 

bool event_add_ordely (event_t **list, double time, char description[], int id_origin, int id_dest) { 

event_t *newelement = (event_t*)malloc(sizeof(event_t)); 
event_t *aux = *list, *prev = NULL; 

if (newelement!=NULL) { 

    newelement->time = time; 
    strcpy (newelement->description, description); 
    newelement->id_origin = id_origin; 
    newelement->id_dest = id_dest; 

    if (*list==NULL) { 
     *list = newelement; 
     newelement->prox = NULL; 

    } else if (aux->prox == NULL) { 

     if (aux->time <= time) { 
      aux->prox = newelement; 
      newelement->prox = NULL; 
     } else { 
      *list = newelement; 
      newelement->prox = aux; 
     } 

    } else { 

     while (aux->time<=time) { 
      prev = aux; 
      aux = aux->prox; 
     } 
      newelement->prox = aux; 
      prev->prox = newelement; 
    } 
     return true; 
} 
else { 

    return false; 
} 
} 

event_t *event_ordely (event_t *list) { 

event_t *newlist = NULL; 

while (list!=NULL) { 

event_add_ordely (&newlist, list->time, list->description, list->id_origin, list->id_dest); 

list = list->prox; 
} 

return newlist; 

} 
int main (int argc, char *argv[]) { 

event_t *list = NULL, aux; 
int number, i; 


    printf ("Digite o números de eventos: "); // Here I scan the infos of each element - its in portuguese. 
    scanf ("%d", &number); 
    printf ("\n"); 
for (i=0; i<number; i++) { 

    printf ("Evento %d\n", i+1); 

    printf ("Digite o tempo de duração: "); 
    scanf ("%lf", &aux.time); 
    printf ("Digite a descrição: "); 
    scanf ("%s", aux.description); 
    printf ("Digite a id de origem: "); 
    scanf ("%d", &aux.id_origin); 
    printf ("Digite a id de destino: "); 
    scanf ("%d", &aux.id_dest); 
    printf ("\n"); 
event_add_end (&list, aux.time, aux.description, aux.id_origin, aux.id_dest); 

    } 


event_t *newlist = event_ordely (list); 

event_remove_first (&newlist); 


return 0; 
} 
+3

顯示更多的代碼。 –

+1

此代碼似乎正確。你確定你的代碼的其餘部分是可以的嗎? –

+0

給出調用代碼或主要功能。這段代碼很好。和代碼不適用於超過3個節點你的意思? – LearningC

回答

0

試試我的代碼。說明在代碼中:

void event_remove_first (event_t ** list) 
{ 
    event_t *aux = *list; 

    if (*list == NULL) 
    { 
     printf ("List is already empty\n"); 
     return; 
    } 

    // there is only one object which will be deleted 
    if(*list->prox == NULL) 
    { 
     printf ("List got empty\n"); 
     free (*list); 
     *list = NULL; 
     return; 
    } 

    *list = aux->prox; 
    free (aux); 
} 
+0

雖然這更明確,但他的原始代碼也正確處理了「唯一一個對象」的情況。 – Dmitri

相關問題