2012-02-21 199 views
4

我找不出我的代碼出了什麼問題,當我運行代碼時,我有一些垃圾輸出!看起來我插入了一些奇怪的值。感謝對你有所幫助:鏈接列表插入c:插入錯誤的值

我的代碼如下:

#include <stdio.h> 
#include <stdlib.h> 
#include <sys/time.h> 

struct node { 
    int number; 
    struct node *next; 
    struct node *prev; 
}; 

struct node *head = NULL; 

int number_of_cycles = 0; 

int arr[] = { 
    82, 13, 22, 61, 12, 52, 41, 75, 98, 20, 6, 9, 7, 1, 5, 4, 2, 8, 3 
}; 


/* insert a node directly at the right place in the linked list */ 
void insert_node(int value); 

int main(void) { 
    struct node *current = NULL; 
    struct node *next = NULL; 

    int i = 0; 

    struct timeval tbegin,tend; 
    double texec=0.; 

    // Start timer 
    gettimeofday(&tbegin,NULL); 

    /* insert some numbers into the linked list */ 
    for(i = 0; i < 19; i++) 
     //insert_node(rand()); 
     insert_node(arr[i]); 

    /* print the list */ 
    printf(" before after\n"), i = 0; 
    while(head->next != NULL) { 
     printf("%4d\t%4d\n", arr[i++], head->number); 
     head = head->next; 
    } 

    /* free the list */ 
    for(current = head; current != NULL; current = next) 
     next = current->next, free(current); 
    // End timer 
    gettimeofday(&tend,NULL); 

    // Compute execution time 
    texec=((double)(1000*(tend.tv_sec-tbegin.tv_sec)+((tend.tv_usec-tbegin.tv_usec)/1000)))/1000.; 

    printf("Elapsed time = %f\n", texec); 
    printf("Number Of Cycles = %d\n", number_of_cycles); 

    return 0; 
} 

void insert_node(int value) { 
    struct node *new_node = NULL; 
    struct node *cur_node = NULL; 
    struct node *last_node = NULL; 
    int found; 


    new_node = (struct node *)malloc(sizeof(struct node *)); 
    if(new_node == NULL) { 
     printf("memory problem\n"); 

    } 
    new_node->number = value; 
    /* If the first element */ 
    if (head == NULL) { 
     new_node->next = NULL; 
     new_node->prev = NULL; 
     head = new_node; 
    } 

    else if (new_node->number < head->number) { 
     new_node->next = head; 
     head->prev = new_node; 
     head = new_node;  
     new_node->prev = NULL; 
    } 

    else { 
     cur_node = head; 
     found = 0; 
     while ((cur_node != NULL) && (found == 0)) { 
      if(new_node->number < cur_node->number) 
      { 
       found = 1; 
      } 
      else 
      { 
       last_node = cur_node; 
       cur_node = cur_node->next; 
      } 
      number_of_cycles++; 
     } 
     if(found == 1) 
     { 
      new_node->prev = cur_node->prev; 
      new_node->next = cur_node; 
      cur_node->prev->next = new_node; 
      cur_node->prev = new_node; 
     } 
     else 
     { 
      last_node->next = new_node; 
      new_node->next = NULL; 
      new_node->prev = last_node; 
     } 
     number_of_cycles++;   
    } 

} 

這段代碼的輸出是:

before after 
    82 1916799424 
    13 1916799408 
    22 1916799392 
    61 1916799376 
    12 1916799360 
    52 1916799344 
    41 1916799328 
    75 1916799312 
    98 1916799296 
    20 1916799280 
    6 1916799264 
    9 1916799248 
    7 1916799232 
    1 1916799216 
    5 1916799200 
    4 1916799184 
    2 1916799168 
    8 1916799152 
Elapsed time = 0.000000 
Number Of Cycles = 0 

回答

7

您的問題是在insert_node:

new_node =(結構節點*)malloc(sizeof(struct node *));

你想要的是:

new_node =(結構節點*)malloc的(的sizeof(結構節點));

原因是您希望爲堆節點分配足夠的空間,而不是結構節點指針。

+0

謝謝,那是我的錯誤:) – funnyCoder 2012-02-21 05:35:52