Ошибка Null pointer assigment - C (СИ)

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

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

# include <stdio.h>
# include <stdlib.h>
# include <conio.h> 
main() {     struct SP 
                {                     float A;                     struct SP *pr,*pos;                 }; 
struct SP *tek,*sled,*nach,*con,*cur,*c,*news,*n; 
float AA, min, max; 
 
/*Ввод списка*/ 
  tek=(struct SP*)malloc(sizeof(struct SP)); 
nach=tek; 
cur=NULL; 
printf("vvedite chislo\n"); 
scanf("%f",&AA); 
while(AA!=10)     
{         
tek->pr=cur; 
        tek->A=AA;         
sled=(struct SP*)malloc(sizeof(struct SP)); 
        tek->pos=sled; 
        printf("vvedite chislo\n"); 
        scanf("%f",&AA); 
        cur=tek;         tek=sled;     
}   
 
/*Вывод списка*/ 
  printf("vivod\n"); 
tek->pos=NULL; 
con=cur; 
tek=nach; 
    while(tek->pos!=NULL)         
{             
printf("%5.1f",tek->A); 
            tek=tek->pos;         
} 
printf("\n"); 
 
/*Нахождение последнего отрицательного числа*/   
tek=con; 
while(tek->pr!=NULL) 
{ 
      AA=tek->A; 
    if(AA<0) 
        { 
            n=tek;             
break; 
        } 
    tek=tek->pr; 
} 
printf("poslednee otrichatelnoe=%3.1f\n",n->A);   
 
/*Переносим элементы после последнего отрицательного в новый список*/ 
tek=nach; 
tek=n->pos; 
news=(struct SP*)malloc(sizeof(struct SP)); 
news=tek; 
nach=news; 
cur=NULL; 
while(tek->pos!=NULL) 
    { 
        tek=news;         
c=(struct SP*)malloc(sizeof(struct SP)); 
        c=sled->pos;         news=tek->pos; 
    } 
printf ("vipolneno yspeshno\n");   
 
/*Вывод нового списка*/ 
  printf("vivod novogo spiska\n"); 
news->pos=NULL; 
con=NULL; 
news=nach; 
    while(news->pos!=NULL) 
        { 
            printf("%5.1f",news->A); 
            news=news->pos; 
        } 
printf("\n"); 
}
Программа работает, все выводит, но в конце выдает ошибку Null pointer assigment. Подскажите в чем проблема. Заранее спасибо!

Решение задачи: «Ошибка Null pointer assigment»

textual
Листинг программы
# include <stdio.h>
# include <stdlib.h>
# include <conio.h>
 
struct SP
{ 
   float          A; 
   struct SP*     pr;
   struct SP*     pos; 
};
 
int main(int argc,char** argv) 
{ 
   struct SP*     tek  = NULL;
   struct SP*     sled = NULL;
   struct SP*     nach = NULL;
   struct SP*     con  = NULL;
   struct SP*     cur  = NULL;
   struct SP*     cc   = NULL;
   struct SP*     news = NULL;
   struct SP*     nn   = NULL;
 
   float    AA = 0.0f; 
 
   /*Ввод списка*/
   tek = (struct SP*)malloc(sizeof(struct SP));
 
   nach = tek;
   cur  = NULL;
 
   printf("vvedite chislo\n");
 
   scanf("%f",&AA);
 
   while (AA != 10)
   {
      tek->pr = cur;
      tek->A  = AA;
 
      sled = (struct SP*)malloc(sizeof(struct SP));
 
      tek->pos = sled;
 
      printf("vvedite chislo\n");
 
      scanf("%f",&AA);
 
      cur = tek; 
      tek = sled;
   }
 
   /*Вывод списка*/
   printf("vivod\n");
 
   tek->pos = NULL;
 
   con = cur;
   tek = nach;
 
   while (tek->pos)
   {
      printf("%5.1f",tek->A);
 
      tek = tek->pos;
   }
 
   printf("\n");
 
   /*Нахождение последнего отрицательного числа*/
   tek = con;
 
   while (tek->pr)
   {
      AA = tek->A;
 
      if (AA < 0)
      {
         nn = tek;
         break;
      }
 
      tek = tek->pr;
   }
 
   if (nn)
   {
      printf("poslednee otrichatelnoe = %3.1f\n",nn->A);
 
      /*Переносим элементы после последнего отрицательного в новый список*/
      tek = nach;
      tek = nn->pos;
   }
 
   news = tek;
   nach = news;
   cur  = NULL;
 
   while (tek->pos)
   {
      tek  = news;
      cc   = (struct SP*)malloc(sizeof(struct SP));
      cc   = sled->pos; 
      news = tek->pos;
   }
 
   printf ("vipolneno yspeshno\n");
 
   if (news)
   {
      /*Вывод нового списка*/
      printf("vivod novogo spiska\n");
 
      news->pos = NULL;
 
      con  = NULL;
      news = nach;
 
      while (news->pos)
      {
         printf("%5.1f",news->A);
 
         news = news->pos;
      }
 
      printf("\n");
   }
 
   return 0;
}

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

  1. Структура данных SP содержит поля: A (тип float), pr (указатель на следующий элемент), pos (указатель на предыдущий элемент).
  2. В функции main() создаются указатели на элементы структуры SP: tek, sled, nach, con, cur, cc, news, nn.
  3. В цикле while с помощью функции scanf() происходит ввод чисел в список.
  4. После ввода каждого числа, создается новый элемент структуры SP с помощью функции malloc(), и он добавляется в список.
  5. В конце списка создается специальный элемент с NULL-указателем, чтобы отметить его конец.
  6. После заполнения списка, происходит его вывод с помощью функции printf().
  7. Затем начинается поиск последнего отрицательного числа в списке.
  8. Если отрицательное число найдено, оно помечается как последнее отрицательное число и происходит перенос элементов после него в новый список.
  9. Новый список выделяется динамически с помощью функции malloc().
  10. Затем происходит вывод нового списка с помощью функции printf().

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


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

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

13   голосов , оценка 3.846 из 5