C-Programmierung: Listen (Teil 1)

preview_player
Показать описание

Рекомендации по теме
Комментарии
Автор

Endlich mal das vernünftige Video über C! Like!👍

xyvadimxy
Автор

Hallo Herr Dierks, wie kann man sie per E-Mail erreichen?

lelolelo
Автор

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define FILENAME "ToDos.dat"


struct todo {
char aufgabe[100];
int tag;
int monat;
int jahr;
struct todo *next;
};


void ausgabe(struct todo * anfang);
void speichern(struct todo * anfang);

struct todo *neues_element(struct todo * anfang);
struct todo *element_loeschen(struct todo * anfang);
struct todo *laden();


int main(int argc, char *argv[]) {
int wahl;

struct todo *anfang = NULL;//Anfang der liste
anfang = laden();



do{

printf("0 - Beenden\n");
printf("1 - Ausgabe der liste\n");
printf("2 - Neue Eingabe\n");
printf("3 - Löschen eines Elementes\n");

printf("Bitte geben sie ihre Wahl ein:\n");
scanf("%d", &wahl);

switch (wahl) {
case 1:
ausgabe(anfang);
break;
case 2:
anfang = neues_element(anfang);
break;
case 3:
anfang = element_loeschen(anfang);
break;
case 0:
speichern(anfang);
break;
default:
printf("Fehler!\n");

}
} while (wahl != 0);
}


void ausgabe (struct todo *anfang){

struct todo *aktuell = anfang;
int counter = 0;
if (aktuell == NULL){
printf("Liste ist leer!\n\n\n");

}
else{
printf("\n\n\nDie Liste der Todos:\n");
while(aktuell != NULL){
counter++;
printf("\n%02d: %50s\t %02d. %02d. %04d.\n",
counter,
aktuell->aufgabe,
aktuell->tag,
aktuell->monat,
aktuell->jahr);

aktuell = aktuell->next;
}
}
}

struct todo *neues_element(struct todo *anfang){
struct todo *neu = NULL;
neu = (struct todo *)malloc (sizeof(struct todo));

if (neu == NULL){
printf("Kein Speicher da!");
return anfang;
}
else {

printf("\n\nAufgabe:\n");
fflush(stdin);
scanf("%s", &neu->aufgabe);
printf("Tag:");
scanf("\n%d", &neu->tag);
printf("Monat:");
scanf("\n%d", &neu->monat);
printf("Jahr:");
scanf("\n%d", &neu->jahr);

neu->next = anfang;
return neu;
}
}

struct todo *laden(){
struct todo *neu;
struct todo *anfang = NULL;
FILE *fp = NULL;
fp = fopen(FILENAME, "r");

int read;
if (fp == NULL){
printf("\nFehler beim Öffnen der Datei!\n");
return NULL;
}
else {
while(! feof(fp)){
neu = (struct todo *) malloc(sizeof(struct todo));
if (neu == NULL){
printf("Kein Speicher");
return anfang;
}
read = fread(neu, sizeof(struct todo), 1, fp);
if (read == 1){
neu->next = anfang;
anfang = neu;
}
}
fclose(fp);
return anfang;
}
}
void speichern (struct todo *anfang){
FILE *fp = NULL;
struct todo *aktuell = anfang;
int written, counter;

fp = fopen(FILENAME, "w");

if (fp == NULL){
printf("Fehler beim spechern");
return;
}
else {
while (aktuell != NULL){
written += fwrite(aktuell, sizeof(struct todo), 1, fp);
counter++;
aktuell = aktuell -> next;
}

printf("insgesamt %d von %d ToDos geschrieben\n", written, counter);
fclose(fp);
}
}

struct todo *element_loeschen(struct todo *anfang){
struct todo *aktuell = anfang;
struct todo *nach_loesch_mich = NULL;
struct todo *loesch_mich = NULL;
char text[100];

if (anfang == NULL){
return anfang;
}


printf("Zu löschenen Aufgaben Text bitte eingeben:");
fflush(stdin);
scanf("%s", text);

if (strcmp(anfang -> aufgabe, text) == 0){
loesch_mich = anfang;
nach_loesch_mich = anfang-> next;

anfang = nach_loesch_mich;
free(loesch_mich);
return anfang;
}
else{
while (aktuell -> next != NULL){
if (strcmp(aktuell->next -> aufgabe, text) == 0){
loesch_mich = aktuell -> next;
nach_loesch_mich = loesch_mich -> next;

aktuell -> next = nach_loesch_mich;
free(loesch_mich);
return anfang;
}

aktuell = anfang -> next;
}
return anfang;
}
}

tasksource