Односвязный список, вывод элементов не работает - C (СИ)

Узнай цену своей работы

Формулировка задачи:

ЯЗЫК СИ. ПОМОГИТЕ! Что надо поменять??? На ВХОД Длина списка и потом сами элементы списка. ВЫХОД Элементы списка. ПРОБЛЕМА В ТОМ, ЧТО ПРОГА ЦИКЛИТСЯ И ВЫВОДИТ ПОСЛЕДНИЙ ВВЕДЕННЫЙ ЭЛЕМЕНТ #include <stdio.h>
#include <stdlib.h>
typedef struct type_node //Односвязный список
{
   int data;
   struct type_node *next;
} node;
 
int main(void)
{
  node *spis , *tmp;
  int n, i , a;
  scanf("%d", &n);
  for (i=0; i < n; i++)
{
  spis = malloc(sizeof(node));
  scanf("%d", &a); 
  spis->data = a;
  spis = spis->next;
}
  spis->next = NULL;
  while(spis != NULL)
  {
      printf("%d", spis->data);
      spis->next = spis;
  }
  while(spis != NULL)
  {
       printf("%d", spis->data);
       spis = spis->next;
}
return 0;
}

Решение задачи: «Односвязный список, вывод элементов не работает»

textual
Листинг программы
#pragma hdrstop
#pragma argsused
 
#include <stdio.h>
#include <tchar.h>
#include <stdlib.h>
 
typedef struct type_node //Односвязный список
{
   int data;
   struct type_node *next;
} node;
 
int _tmain(int argc, _TCHAR* argv[])
{
    node *spis , *tmp, *first, *prev = NULL;
    int n, i , a;
    char timeout;
    printf("Please enter size list: ");
    scanf("%d", &n);
    for (i=0; i < n; i++)
    {
      spis = malloc(sizeof(node));
      printf("Please enter element %d list: ", i);
      scanf("%d", &a);
      spis->data = a;
      if (i == 0) {
        first = spis;
        prev = first;
      }else
      {
        prev->next = spis;
        prev = prev->next;
      }
      //память не выделена, а вы двигаетесь вперед
      //spis = spis->next;
    }
    //spis последний элемент списка
    spis->next = NULL;
    //присвоение первом элементу
    spis = first;
    printf("Elements list: ");
    while(spis != NULL)
    {
 
        printf("%d ", spis->data);
        /*
            Ваш:
            spis->next = spis; Циклится вокруг последнего элемента
        */
        spis = spis->next;
    }
    printf("\r\n");
    //Лишний код
    /*
    while(spis != NULL)
    {
        printf("%d", spis->data);
        spis = spis->next;
    } */
    //Задержка экрана
    printf("Please Press Enter symbol 'e' for exit program...");
    while (1)
    {
        scanf("%c", &timeout);
        if (timeout == 'e') break;
    }
    return 0;
}

Объяснение кода листинга программы

  1. Включаются необходимые заголовочные файлы: , , .
  2. Определяется структура узла односвязного списка (node). Узел содержит целочисленное значение и указатель на следующий узел.
  3. Задаётся размер списка, для чего пользователю предлагается ввести число с клавиатуры.
  4. В цикле формируется список, где каждый узел заполняется значениями, введёнными пользователем.
  5. Последний элемент списка не указывает на следующий узел, инициализируется как NULL.
  6. Указатель spis получает значение first, то есть ссылку на первый элемент списка.
  7. В цикле по всем элементам списка выводятся значения этих элементов.
  8. В конце программы запрашивается символ 'e' для выхода из программы. Пока этот символ не будет введен, программа будет продолжать выводить на экран список.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 3.917 из 5
Похожие ответы