Добавление элемента в однонаправленный список - C (СИ)

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

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

Итак, задача: написать мини-программку, которая создает однонаправленный список и выводить его на экран. Элементы добавлять нужно в конец списка. Все было бы просто, но функцию добавления нужно написать без if (проверки пустого списка) или подобной проверки (у меня while), то есть универсальную функцию. Ломаю голову уже неделю над этой задачей, но без проверки не могу... Помогите советом, пожалуйста. Спасибо
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
 
struct wyrazy{
    int data;
    struct wyrazy* next;
};
 
struct wyrazy* dodaj(struct wyrazy* aktualny){
    struct wyrazy* akt;
    struct wyrazy* nowy = NULL;
    
    nowy = malloc(sizeof(struct wyrazy));
    printf("data: ");
    scanf("%d", &nowy->data);
    nowy->next = NULL;
    while (aktualny == NULL){
        aktualny = nowy;
        return;
    }
    akt = aktualny;
    while (akt->next){
        akt = akt->next;
    }
    akt->next = nowy;
    return aktualny;
}
void wypisz(struct wyrazy* akt){
    while (akt){
        printf("\n%d", akt->data);
        akt = akt->next;
    }
};
int main(){
    struct wyrazy* koniec = NULL;
    int c;
    do{
        printf("\n1. dodaj element\n2. wypisz\n3.exit\n");
        scanf("%d", &c);
        switch (c){
        case 1: 
            koniec = dodaj(koniec); 
            break;
        case 2:
            wypisz(koniec);
            break;
        default: break;
        }
    } while (c < 3);
}

Решение задачи: «Добавление элемента в однонаправленный список»

textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
 
typedef struct NODE {
    int value;
    struct NODE * next;
} node_t, * list_t;
 
node_t * node_new(const int value) {
    node_t * pNode = malloc(sizeof(node_t));
    assert( pNode );
    pNode->value = value;
    pNode->next = NULL;
    return pNode;
}
 
int list_add(list_t * pList, node_t * pNode) {
    return ( *pList && list_add(&((*pList)->next), pNode) || ( *pList = pNode ) );
}
 
void list_purge(list_t list) {
    if ( list ) {
        list_purge(list->next);
        free(list);
    }
}
 
void list_dump(list_t list) {
    if ( list ) {
        printf("%d ", list->value);
        list_dump(list->next);
    }
}
 
int main(void) {
    list_t list = NULL;
    
    list_add(&list, node_new(1));
    list_add(&list, node_new(2));
    list_add(&list, node_new(3));
    list_add(&list, node_new(4));
    list_add(&list, node_new(5));
    
    list_dump(list);
    list_purge(list);
    
    return 0;
}

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

  1. Создание структуры для хранения списка: typedef struct NODE { int value; struct NODE next; } node_t, list_t;
  2. Создание нового элемента списка: node_t node_new(const int value) { node_t pNode = malloc(sizeof(node_t)); assert( pNode ); pNode->value = value; pNode->next = NULL; return pNode; }
  3. Добавление элемента в список: int list_add(list_t pList, node_t pNode) { return ( pList && list_add(&((pList)->next), pNode) || ( *pList = pNode ) ); }
  4. Очистка списка: void list_purge(list_t list) { if ( list ) { list_purge(list->next); free(list); } }
  5. Вывод списка на экран: void list_dump(list_t list) { if ( list ) { printf(%d, list->value); list_dump(list->next); } }
  6. Создание списка в основной функции: list_t list = NULL;
  7. Добавление элементов в список: list_add(&list, node_new(1)); list_add(&list, node_new(2)); list_add(&list, node_new(3)); list_add(&list, node_new(4)); list_add(&list, node_new(5));
  8. Вывод списка на экран: list_dump(list);
  9. Очистка списка: list_purge(list);
  10. Завершение работы программы: return 0;

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


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

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

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