Ошибка 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»
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;
}
Объяснение кода листинга программы
- Структура данных
SPсодержит поля: A (тип float), pr (указатель на следующий элемент), pos (указатель на предыдущий элемент). - В функции main() создаются указатели на элементы структуры SP: tek, sled, nach, con, cur, cc, news, nn.
- В цикле while с помощью функции scanf() происходит ввод чисел в список.
- После ввода каждого числа, создается новый элемент структуры SP с помощью функции malloc(), и он добавляется в список.
- В конце списка создается специальный элемент с NULL-указателем, чтобы отметить его конец.
- После заполнения списка, происходит его вывод с помощью функции printf().
- Затем начинается поиск последнего отрицательного числа в списке.
- Если отрицательное число найдено, оно помечается как
последнее отрицательное числои происходит перенос элементов после него в новый список. - Новый список выделяется динамически с помощью функции malloc().
- Затем происходит вывод нового списка с помощью функции printf().