Создать список из целых чисел. Подсчитать количество отрицательных элементов, создав из них новый список - 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;
}

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

  1. Создание списка из целых чисел.
  2. Создание двух указателей: один для списка a, другой для списка b.
  3. В каждой итерации цикла вводится число e и добавляется в начало списка a с помощью функции add_front.
  4. Если число e отрицательное, оно добавляется в начало списка b с помощью функции add_front.
  5. После завершения цикла, список a выводится на экран.
  6. Затем, список b выводится на экран.
  7. Функции free_mylist вызываются для освобождения памяти, занятой списками a и b.
  8. Программа возвращает 0, что означает успешное завершение работы.

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


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

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

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