Создание и удаление 2-х списков - C (СИ)

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

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

Помогите пожалуйста , не могу никак понять почему винда выдаёт ошибку - "прекращена работа прграммы ххх - закрыть\отладить\поиск решения в интернете" .
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
typedef struct p
{
 int a;
  struct p *n;
} p;
void del(p**g)//освоб памяти
{
p*t;
while ((*g)->n!=NULL)
{
 t=*g;
 //printf("%d\n",t->a);
 *g=(*g)->n;
free(t);
}
free(*g);
}
int main()
{
p*t,*q,*g1=(p*)(malloc(sizeof(p))),*g2=(p*)(malloc(sizeof(p)));
int i;
srand(time(NULL));
i=rand()%100;
g1->a=i;
q=g1;
while(--i>0)
{
 t=(p*)(malloc(sizeof(p)));
 t->a=i;//rand()%1000;
 q->n=t;
 q=q->n;
}
q=g2;
i=rand()%100;
g2->a=i;
while(--i>0)
{
 t=(p*)(malloc(sizeof(p)));
 t->a=i;//rand()%1000;
 q->n=t;
 q=q->n;
}
del(g1);
del(g2);
free(q);
free(t);
 
    return 0;
}

Решение задачи: «Создание и удаление 2-х списков»

textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
 
typedef struct list {
    int val;
    struct list *next;
} list_t;
 
int list_add ( list_t **head, list_t **node, int value ) {
 
    list_t *p = NULL;
 
    if ( ( p = (list_t *) malloc( sizeof( list_t ) ) ) == NULL )
        return 0;
    else {
 
        p->val = value;
        p->next = NULL;
 
        if ( *head == NULL ) {
            *head = p;
            *node = *head;
        }
        else {
            (*node)->next = p;
            *node = (*node)->next;
        }
        return 1;
    }
}
 
void list_remove( list_t *head ) {
 
    list_t *p = head;
 
    while( p ) {
        head = head->next;
        free( p );
        p = head;
    }
}
 
void list_prnt( list_t *head ) {
    list_t *p = head;
 
    while( p ) {
        printf( "%3i", p->val );
        p = p->next;
    }
    puts("");
}
 
int main() {
 
    list_t *head = NULL, *current = head;
    size_t i = 10;
 
    while( i )
        if ( !( list_add( &head, ¤t, i-- ) ) )
            return -1;
    list_prnt( head );
    list_remove( head );
 
    return 0;
}

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

  1. Создание двух списков: Код создает два указателя на вершину списка, head и current, которые изначально указывают на NULL, что означает, что списки пустые.
  2. Добавление элементов в список: Функция list_add добавляет элемент в список. Она принимает два указателя: head и current. Первый указатель указывает на голову списка (первый элемент), а второй указатель указывает на текущий элемент списка, который будет последним элементом списка после добавления нового элемента. Функция также принимает значение value, которое будет добавлено в список.
  3. Удаление элементов из списка: Функция list_remove удаляет все элементы из списка. Она начинает с указателя head и последовательно удаляет каждый элемент, пока не будет достигнут NULL. Функция использует функцию free для освобождения памяти, выделенной для каждого элемента списка.
  4. Печать списка: Функция list_prnt печатает все элементы списка. Она начинает с указателя head и последовательно переходит к каждому элементу списка, печатая значение каждого элемента.
  5. Основной код программы: В основном коде программы создается список из 10 элементов, начиная с head и current равных NULL. Затем в цикле вызывается функция list_add, которая добавляет элемент в список. Если функция list_add возвращает NULL, значит произошла ошибка и программа возвращает -1. После завершения цикла, список печатается с помощью функции list_prnt. Затем все элементы списка удаляются с помощью функции list_remove. Программа возвращает 0, если все операции были успешно выполнены.

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


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

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

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