Создать список из целых чисел. Подсчитать количество отрицательных элементов, создав из них новый список - C (СИ)
Формулировка задачи:
Создать список из целых чисел. Подсчитать количество отрицательных элементов, создав из них новый список. Срочно надо, курсач сдавать через 3 часа. Есть готовое решение, но оно не работает, а разбираться некогда. Помогите пожалуйста!
#include <stdio.h>
#include <string.h>
#include <conio.h>
#include <locale.h>
#include <stdlib.h>
struct stack //описание стека stack
{int inf; stack *next;};
stack *init_stack() //инициализация стека
{return NULL;}
void push(stack *&s,int item) //добавление элемента в стек.
{
stack *r;
r=(stack*)malloc(sizeof(stack));
r->inf=item;r->next=s;s=r;
}
int pop(stack *&s) //выбор верхнего элемента из стека
{
stack *r=s;
int i=r->inf;s=r->next;
free(r);
return i;
}
int peek(stack *s) //просмотр верхнего элемента стека
{
return s->inf;
}
int empty_stack(stack *s) //определение пустоты стека
{return(s)?0:1;}
int main()
{
setlocale(0,"Russian");
printf("\nСоздать список из целых чисел. Подсчитать количество отрицательных элементов,\nсоздав из них новый список.\n\n");
FILE *h=fopen("Stek_in.txt", "r");
FILE *s=fopen("Stek_out.txt", "w");
int i, k=0;
stack *head=init_stack();
stack *head1=init_stack();
while (!feof(h))
{
fscanf(h, "%d", &i);
push (head, i);
}
while (!empty_stack(head))
{
i=pop(head);
if (i<0)
{
push(head1, i); k++;
}
}
while (!empty_stack(head1))
{
i=pop(head1);
fprintf(s,"%d ", i); }
printf("Файл записан %d", k);
fcloseall();
getch();
}Решение задачи: «Создать список из целых чисел. Подсчитать количество отрицательных элементов, создав из них новый список»
textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#define NUMELEM 5
typedef struct mylist
{
int val;
struct mylist *next;
}mylist;
mylist *new_node(int v)
{
mylist *new;
if((new=(mylist*)malloc(sizeof(mylist)))==NULL)return NULL;
new->val=v;
new->next=NULL;
return new;
}
mylist *add_front(mylist *p, mylist *n)
{
n->next=p;
return n;
}
void print_mylist(mylist *l)
{
for(; l!=NULL; l=l->next)
{
printf("%d ", l->val);
}
}
void free_mylist(mylist *l)
{
mylist * n;
for(; l!=NULL; l=n)
{
n=l->next;
free(l);
}
}
int main(void)
{
mylist* a=NULL, *b=NULL;
int e=0, c=0;
for(int i=1; i<=NUMELEM; ++i)
{
scanf("%d", &e);
a=add_front(a, new_node(e));
if(e<0)b=add_front(b, new_node(e));
}
print_mylist(a);
puts("");
if(b!=NULL)print_mylist(b);
free_mylist(a);
free_mylist(b);
return 0;
}
Объяснение кода листинга программы
- Создание списка из целых чисел.
- Создание двух указателей: один для списка a, другой для списка b.
- В каждой итерации цикла вводится число e и добавляется в начало списка a с помощью функции add_front.
- Если число e отрицательное, оно добавляется в начало списка b с помощью функции add_front.
- После завершения цикла, список a выводится на экран.
- Затем, список b выводится на экран.
- Функции free_mylist вызываются для освобождения памяти, занятой списками a и b.
- Программа возвращает 0, что означает успешное завершение работы.