2015-05-20 4 views
0

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

Вот код

#include<stdio.h> 
#include<stdlib.h> 
#include<stdbool.h> 
void add(num); 
void insert(); 
void display(); 
struct node 
{ 
int val; 
struct node *next; 
}; 

struct node *head =NULL; 

main() 
{ 

int data,i=0; 
head = (struct node *)malloc(sizeof(struct node)); 
while(1) 
    { 
     printf("enter your choice"); 
     scanf("%d",&i); 

     switch(i) 
     { 
     case 1: 
     insert(); 
     break; 

     case 2: 
     display(); 
     break; 

     default: 
     printf("thankyou"); 

     } 

     } 



} 

void add(num) 
{ 
    struct node *temp; 
    temp=(struct node *)malloc(sizeof(struct node)); 
    temp->val=num; 
    if (head== NULL) 
     { 
     head=temp; 
     head->next=NULL; 
     } 
    else 
     { 
     head->next = temp 
     head=temp; 
     } 
} 

void insert() 
{ 
    int ch; 
    if (head->val == NULL) 
    { 
     printf("Enter the value for the first node :"); 
     scanf("%d",&ch); 
     add(ch); 
     } 
    else if(head->val != NULL) 
     { 
     printf("Enter the value to insert :"); 
     scanf("%d",&ch); 
     add(ch); 
     } 
    } 

void display() 
{ 
struct node *newnode; 
newnode = head; 
    if(newnode == NULL) 
     printf("invalid list"); 
    else 
    { 
     while(newnode!=NULL) 
     { 
      printf("%d \t\t",newnode->val); 
      newnode=newnode->next; 

     } 
    } 
} 

ответ

0

Вы можете добавить каждый новый объект в конце списка:

void add(num) 
{ 
    struct node *temp, *temp2; 
    temp=(struct node *)malloc(sizeof(struct node)); 
    temp->val=num; 
    if (head== NULL) 
     { 
     head=temp; 
     head->next=NULL; 
     } 
    else 
     { 
     temp2 = head; 
     while (temp2->next != NULL) 
      temp2 = temp2->next; 

     temp2->next = temp; 
     temp->next = NULL; 
     } 
} 
0

код не выглядит хорошо для меня, потому что в конце все вставляет точки головы в последний элемент списка с полем next, неинициализированным. Это не печатает список в обратном порядке, это будет печатать последний вставленный элемент, а затем поведение будет неопределенным. Кроме того, когда вы теряете указатель на голову, вы потеряли список и всю выделенную память (утечку).

Я рекомендую поддерживать указатель tail, который всегда будет указывать на хвост списка. Функция append может просто добавить новый узел после tail и обновить tail, продвигая его. head остается неизменным и указывает первый элемент списка. Вы также можете присвоить значение head во временную переменную, перебрать ее в конец списка и вставить, но в этом случае вставка будет дорогостоящей.

1

Вместо того чтобы делать

 
    head->next = temp; 
    head=temp; 

сделать

 
    temp->next=head; 
    head=temp;