2015-11-04 4 views
-1

Мне нужно создать случайные числа и поместить их в отсортированный список. мой код отлично работает на моем домашнем компьютере на cygwin, однако, когда я запускаю его в школьной системе, я продолжаю считать, что список пуст. Не знаю, в чем проблема.Проблема со связанным списком в C

#include<stdio.h> 
#include<stdlib.h> 

typedef struct node{ 
    int num; 
    struct node *next; 
}node_t; 

node_t* insertNodeSorted(node_t *head, int x); 
void printList(node_t *head); 
void deleteList(node_t *head); 

int main(int argc, char *argv[]) 
{ 
    node_t *dummy; 
    int counter = 1; 
    int a; 

    if(argc != 4) 
    { 
      printf("Error. Exiting program..."); 
      exit(1); 
    }//end if 

    //seed random number 
    srandom(atoi(argv[1])); 
    dummy = NULL; 

    while(counter < atoi(argv[2])) 
    { 
      a = random() % (atoi(argv[3]) + 1); 

      printf("%d " ,a); 

      insertNodeSorted(dummy, a); 

      counter++; 
    }//end while 

    printf("\n\n"); 
    printList(dummy); 

    deleteList(dummy); 

    return 0; 



} 

node_t* insertNodeSorted(node_t *head, int x) 
{ 
    if(head == NULL) 
    { 
      head = (node_t *)malloc(sizeof(node_t)); 
      if(head == NULL) 
      { 
        printf("Failed to create head node"); 
        return head; 
      }//end if 
    head->num = x; 
    head->next = NULL; 
    return head; 
    }//end if 

    node_t *p; 

    p = (node_t*)malloc(sizeof(node_t)); 
    if(p == NULL) 
    { 
      printf("Failed to create a new node."); 
      return p; 
    }//end if 

    p->num = x; 
    p->next = NULL; 

    if(x < head->num) 
    { 
      p->next = head; 
      return p; 
    }//end if 

    node_t *q, *r; 
    q = head; 
    while(q != NULL && q->num <= x) 
    { 
      r = q; 
      q = q->next; 
    }//end while 
    p->next = q; 
    r->next = p; 

} 

void printList(node_t *head) 
{ 
    node_t *p; 

    if(head == NULL) 
    { 
      printf("List is empty"); 
      exit(1); 
    }//end if 

    p = head->next; 
    while(p != NULL) 
    { 
      printf("%d ",p->num); 
      p = p->next; 
    }//end while 
} 

void deleteList(node_t *head) 
{ 
    node_t *p; 
    while(p != NULL) 
    { 
      p = head->next; 
      free(head); 
      head = p; 
    }//end while 
} 
+1

Можете ли вы привести пример из арг дал? Кроме того, школа использует ту же платформу, что и вы дома, и вы взяли исполняемый файл в школу, или вы его скомпилировали там. Вы могли отлаживать? –

+0

@MrLister Что такое CS? –

+0

@MrLister В вашем контексте. :) –

ответ

3

Ваша функция

  1. имеет неопределенное поведение, потому что в некоторых случаях она ничего не возвращает и
  2. в основном вы не переназначить голову dummy. Так что это не изменено.

Функция может выглядеть следующим образом

node_t* insertNodeSorted(node_t **head, int x) 
{ 
    node_t *p = (node_t *)malloc(sizeof(node_t)); 

    if (p == NULL) 
    { 
      printf("Failed to create a new node.\n"); 
    }//end if 

    else 
    { 
     p->num = x; 

     if (*head == NULL || x < (*head)->num) 
     { 
      p->next = *head; 
      *head = p; 
     } 
     else 
     { 
      node_t *current = *head; 
      while (current->next != NULL && !(x < current->next->num)) 
      { 
       current = current->next; 
      } 

      p->next = current->next; 
      current->next = p; 
     } 
    } 

    return p; 
} 

И функция должна быть вызвана как

insertNodeSorted(&dummy, a); 
+0

Имея немного проблем с пониманием вашего кода. Для параметра, почему есть две звезды? –

+1

@JohnDoe Чтобы изменить аргумент, вы должны передать его ссылкой на функцию. В противном случае параметрами функции являются ее локальные переменные, которые инициализируются копиями значений аргументов. –

+0

@JohnDoe Рассмотрим, например, void f (int * x) {* x = 10; } int main (void) {int x; f (&x); printf ("% d \ n", x);} –

0

Поскольку это домашнее задание, я не дам вам полный ответ .... но посмотрите, что происходит с манекеном main и локальным значением head внутри insertNodeSorted.

Если вы используете только GCC и не отладчик ... добавить printfs это поможет тонну ...