Impresión lista ordenada enlazada

Estoy trabajando en mi tarea, y esto es todo lo que he conseguido. Ahora necesito saber cómo imprimir la información que se ha ingresado en la lista. y necesito reconfigurar la función insertNode para ordenar también la lista de menor a mayor.

#include  #include  struct listNode{ int data; //ordered field struct listNode *next; }; //prototypes void insertNode(struct listNode *Head, int x); int printList(struct listNode *Head, int x); int freeList(struct listNode *Header, int x); //main int main(){ struct listNode Head = {0, NULL}; int x = 1; printf("This program will create an odered linked list of numbers greater" " than 0 until the user inputs 0 or a negative number.\n"); while (x > 0){ printf("Please input a value to store into the list.\n"); scanf("%d", &x); insertNode(&Head, x); } printf("Program terminated.\n"); system("PAUSE"); } void insertNode(struct listNode * Head, int x){ struct listNode *newNode, *current; newNode = malloc(sizeof(struct listNode)); newNode->data = x; newNode->next = NULL; current = Head; while (current->next != NULL && current->data next; } if(current->next == NULL){ current->next = newNode; } else{ newNode->next = current->next; current->next = newNode; } } 

Header->next es NULL cuando comienzas, y cuando agregas un elemento cambias la actual para ser Header :

  current = Header; write(current->next !=NULL); // set current to be Header->next (which is NULL) current = current->next; // dereference null current->next = newNode; 

En su lugar, agregue el nuevo elemento al final:

 current = Header; while (current->next != NULL) current = current->next; current->next = newNode; 
  current = Header; write(current->next !=NULL); current = current->next; current->next = newNode; 

Estás intentando acceder a current-> next sin tener que asignarlo. Y en realidad no está buscando el lugar correcto para insertarlo en la lista enlazada (de su pregunta, parece que se debe clasificar).

Intenta algo como:

 current = Header; while (current->next != NULL && current->data < x) { current = current->next; } if(current->next == NULL) { current->next = newNode; } else { newNode->next = current->next; current->next = newNode; } 

Hay tres problemas en su impl:

  1. debe agregar nuevos números al final, de modo que debe tener dos punteros en la lista: uno apunta a la cabeza, otro al final (también puede agregar al principio de la lista, entonces solo necesita un puntero, pero luego la lista está ordenada al revés)

  2. el código de encadenamiento de punteros es incorrecto, creo que desea intentar insertar nuevos elementos después de su nodo principal, por lo que su código debe escribirse como:

    actual = Encabezado-> siguiente; // el encabezado del nodo-> siguiente está apuntando actualmente a

    Header-> next = newNode; // dejar encabezado-> siguiente punto a nuevo ele

    newNode-> next = current; // deja que el nuevo punto de ele sea el viejo top ele

  3. el encabezado-nodo es de alguna manera especial e inútil, debe manejar una lista vacía como un caso especial, y el encabezado debería ser inicialmente 0, e insertnode funcionaría así:

    si (encabezado == 0)

      header=newNode 

    más

    // hacer las cosas como está escrito en 2.

Todo esto se puede hacer de una manera diferente, pero este es un enfoque común a ese problema de lista … (Hmm, de alguna manera, ¿los 4 espacios en blanco para el código no funcionan?)

funcionó, solo necesito descubrir cómo hacer las funciones printList y freeList

 #include  #include  struct listNode{ int data; //ordered field struct listNode *next; }; //prototypes void insertNode(struct listNode *Head, int x); int printList(struct listNode *Head, int x); int freeList(struct listNode *Head, int x); //main int main(){ struct listNode Head = {0, NULL}; int x = 1; printf("This program will create an odered linked list of numbers greater" " than 0 until the user inputs 0 or a negative number.\n"); while (x > 0){ printf("Please input a value to store into the list.\n"); scanf("%d", &x); insertNode(&Head, x); } printf("Program terminated.\n"); system("PAUSE"); } void insertNode(struct listNode * Head, int x){ struct listNode *newNode, *current; newNode = malloc(sizeof(struct listNode)); newNode->data = x; newNode->next = NULL; current = Head; while (current->next != NULL && current->data < x) { current = current->next; } if(current->next == NULL){ current->next = newNode; } else{ newNode->next = current->next; current->next = newNode; } }