2015-02-17 3 views
-1

При вставке узла в конец в связанном списке мой код работает в бесконечном цикле.
IDE Б-Затмения 64 бит ОСБесконечный цикл во вставке в связанном списке

#include<stdio.h> 
#include<stdlib.h> 
typedef struct Node 
    { 
    int info; 
    struct Node *next; 

    }node; 
    node *head; 
    node *ptr1; 
    void insert(int x); 
    void show(); 
    int main() 
    { 
    int i,x,n; 
    puts("Enter number of elements\n"); 
    scanf("%d",&n); 
    for(i=0;i<n;i++) 
     { 
     puts("Enter elements"); 
     scanf("%d",&x); 
     insert(x); 

     } 
    show(); 
    return 0; 
    } 

// Чтобы вставить данные в связанном списке

void insert(int x) 
    { 
     node *ptr; 
     ptr1=head; 
     ptr=(node*)malloc(sizeof(node)); 
     ptr->info=x; 
     if(head==NULL) 
     { 
     ptr->next=head; 
     head=ptr; 
     } 
     else 
     { 
     ptr1->next=NULL; 
     ptr1=ptr; 
     } 
     } 

// Для того, чтобы распечатать детали списка // Невозможно выяснить эту функцию

void show() 
    { 
    while(ptr1->next!=NULL) 
     { 
     printf("%d\n",ptr1->info); 
     ptr1=ptr1->next; 
     } 



} 
+0

Standard Предупреждение: [не отбрасывают] (http://stackoverflow.com/q/605845/ 2173917) возвращаемое значение 'malloc()' и family. –

+0

Похоже, что head-> next установлен в голову ... вызывая бесконечный цикл в вашей функции show – javajavajava

+0

Можете ли вы разместить свой ввод? –

ответ

0

ptr1 настроен на главу каждый раз, когда ваш код вводит функцию вставки, а затем устанавливает его в ptr в подразделении else, но ничего не указывает на какие-либо предыдущие элементы. Вот пример, если он вам нужен.

typedef struct Node 
{ 
int info; 
struct Node *next; 
}node; 

node *head = NULL; 
void insert(int x); 
void show(); 
int main() 
{ 
int i,x,n; 
puts("Enter number of elements\n"); 
scanf("%d",&n); 
for(i=0;i<n;i++) 
    { 
    puts("Enter elements"); 
    scanf("%d",&x); 
    insert(x); 

    } 
    show(); 
    return 0; 
} 

void insert(int x) 
{ 
    node *ptr = (node*)malloc(sizeof(node)); 
    ptr->info=x; 
    ptr->next=head; /* this will always add the new entry at the beginning of the list all you need it to initialize the head to NULL*/ 
    head = ptr; /* move the head so that it points to the newly created list element */ 
} 

void show() 
{ 
    node *ptr1 = head; 
    printf("%d\n",ptr1->info); /* print the head */ 
    while(ptr1->next!=NULL) /* now walk the list remember it first looks if the next pointer in the list is null first then it jumps on next element in case it is not*/ 
    { 
     ptr1=ptr1->next; 
     printf("%d\n",ptr1->info); 
    } 
} 

Не забудьте создать функцию, чтобы высвободить элементы списка перед выходом из основного.

+0

Этот код не вставляет узел в конец, он вставляет его в начало. – Dumb

+0

Как указано в комментариях :). Все зависит от вас, чтобы сортировать элементы и даже больше как упражнения. – weaz

0

Ваши две функции могут быть упрощены. Одиночный список очень прост в реализации. Я бы также улучшил функции, указав указатель списка в качестве аргумента, а в случае insert() верните новый заголовок списка, но сначала запустите его! Обратите внимание, что нет причин или необходимости объявлять глобальные переменные, когда их единственное использование является локальным для функции.

// insert new node at head of the list 
void insert(int x) { 
    node *ptr = malloc(sizeof(node)); 
    if (ptr == NULL) { 
     printf ("malloc failure\n"); 
     exit (1); 
    } 
    ptr->info = x; 
    ptr->next = head;   // append existing list 
    head = ptr;     // new head of list 
    } 

// show the linked list 
void show() { 
    node *ptr = head;   // start at head of list 
    while (ptr != NULL) { 
     printf("%d\n", ptr->info); 
     ptr = ptr->next;  // follow the link chain 
    } 
} 

EDIT здесь код, чтобы добавить к хвосту связанного списка

// insert new node at tail of the list 
void insert2(int x) { 
    node *tail = head; 
    node **last = &head; 
    node *ptr; 
    while (tail) { 
     last = &tail->next; 
     tail = tail->next; 
     } 
    ptr = malloc(sizeof(node)); 
    if (ptr == NULL) { 
     printf ("malloc failure\n"); 
     exit (1); 
    } 
    ptr->info = x; 
    ptr->next = NULL; 
    *last = ptr; 
} 
+0

Это не вставка узла в конец, это скорее вставка его в начало. – Dumb

+0

Вот как вы используете связанный список. Это стек LIFO. –

+0

Нет, но я пытаюсь печатать узлы в Связанном списке по пути FIFO, и я не могу понять, как? – Dumb

Смежные вопросы