Создание и удаление 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; }
Объяснение кода листинга программы
- Создание двух списков:
Код создает два указателя на вершину списка,
head
иcurrent
, которые изначально указывают наNULL
, что означает, что списки пустые. - Добавление элементов в список:
Функция
list_add
добавляет элемент в список. Она принимает два указателя:head
иcurrent
. Первый указатель указывает на голову списка (первый элемент), а второй указатель указывает на текущий элемент списка, который будет последним элементом списка после добавления нового элемента. Функция также принимает значениеvalue
, которое будет добавлено в список. - Удаление элементов из списка:
Функция
list_remove
удаляет все элементы из списка. Она начинает с указателяhead
и последовательно удаляет каждый элемент, пока не будет достигнутNULL
. Функция использует функциюfree
для освобождения памяти, выделенной для каждого элемента списка. - Печать списка:
Функция
list_prnt
печатает все элементы списка. Она начинает с указателяhead
и последовательно переходит к каждому элементу списка, печатая значение каждого элемента. - Основной код программы:
В основном коде программы создается список из 10 элементов, начиная с
head
иcurrent
равныхNULL
. Затем в цикле вызывается функцияlist_add
, которая добавляет элемент в список. Если функцияlist_add
возвращаетNULL
, значит произошла ошибка и программа возвращает-1
. После завершения цикла, список печатается с помощью функцииlist_prnt
. Затем все элементы списка удаляются с помощью функцииlist_remove
. Программа возвращает0
, если все операции были успешно выполнены.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д