Files
courses/2024_Praxis_der_Programmierung/ue5/polygonenzug.c
T
2024-11-28 11:27:09 +01:00

225 lines
4.8 KiB
C

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
// Structs
typedef struct point {
float x;
float y;
} Point;
typedef struct Node {
Point *pt;
struct Node *next;
} Node;
typedef struct Polygonenzug {
Node *head;
} Polygonenzug;
// Methods
Point *create_point(float a, float b){
Point *pt = (Point *)malloc(sizeof(Point));
if (pt == NULL) {
fprintf(stderr, "Memory allocation failed for Point.\n");
exit(EXIT_FAILURE);
}
pt->x=a;
pt->y=b;
return pt;
}
Polygonenzug* create_list() {
Polygonenzug* pzug = (Polygonenzug*)malloc(sizeof(Polygonenzug));
if (pzug == NULL) {
fprintf(stderr, "Memory allocation failed for Polygonzug.\n");
exit(EXIT_FAILURE);
}
pzug->head = NULL;
return pzug;
}
void append(Polygonenzug *pzug, Point *pt){
Node *new_node = (Node*)malloc(sizeof(Node));
if (new_node == NULL) {
fprintf(stderr, "Memory allocation failed for new_node in append.\n");
exit(EXIT_FAILURE);
}
new_node->pt = pt;
new_node->next = NULL;
if (pzug->head == NULL){
pzug->head = new_node;
} else {
Node * temp = pzug->head;
while(temp->next != NULL){
temp = temp->next;
}
temp->next = new_node;
}
}
void shorten(Polygonenzug *pzug){
// Wenn Liste leer
if (pzug->head == NULL){
printf("The list is empty.\n");
return;
}
// Wenn nur ein Knoten
if (pzug->head->next == NULL){
free(pzug->head->pt);
pzug->head->pt = NULL;
free(pzug->head);
pzug->head = NULL;
printf("Die Liste wurde geloescht.\n");
return;
}
// Wenn mehrere Knoten
Node * temp = pzug->head;
while(temp->next && temp->next->next != NULL){
temp = temp->next;
}
free(temp->next->pt);
free(temp->next);
temp->next = NULL;
}
void insert(Polygonenzug *pzug, Point *pt, int index){
Node *new_node = (Node*)malloc(sizeof(Node));
if (new_node == NULL) {
fprintf(stderr, "Memory allocation failed for new_node in insert.\n");
exit(EXIT_FAILURE);
}
new_node->pt = pt;
new_node->next = NULL;
// Wenn index 0
if(index == 0){
new_node->next = pzug->head;
pzug->head = new_node;
return;
}
// Groesse der liste checken
int i = 0;
Node *temp = pzug->head;
if(temp == NULL){
printf("Cannot insert at index %d in an empty list.\n", index);
free(new_node);
return;
}
while(temp != NULL && i < index - 1){
temp = temp->next;
i++;
}
// Wenn index > 0
if(temp != NULL){
new_node->next = temp->next;
temp->next = new_node;
} else{
printf("Index is outside the list bounds.\n");
free(new_node);
return;
}
}
Polygonenzug *mirror(Polygonenzug *pzug){
Polygonenzug *pzug2 = create_list();
Node *temp = pzug->head;
while(temp != NULL){
Node * new_node = (Node*)malloc(sizeof(Node));
if (new_node == NULL) {
fprintf(stderr, "Memory allocation failed for new_node in mirror.\n");
exit(EXIT_FAILURE);
}
Point *new_pt = create_point(temp->pt->x, temp->pt->y);
new_node->pt = new_pt;
new_node->next = pzug2->head;
pzug2->head = new_node;
temp = temp->next;
}
return pzug2;
}
void pretty_print(Polygonenzug *pzug){
Node *index = pzug->head;
while(index != NULL){
printf("%f , %f\n", index->pt->x, index->pt->y);
index = index->next;
}
}
void free_list(Polygonenzug *pzug){
Node *current = pzug->head;
while(current != NULL){
Node *next_node = current->next;
free(current->pt);
free(current);
current = next_node;
}
free(pzug);
}
int main(){
Point *p1 = create_point(3.0f,4.0f);
Point *p2 = create_point(5.0f,6.0f);
Point *p3 = create_point(8.0f, 9.0f);
Polygonenzug *pzug = create_list();
printf("Pzug after Append p1:\n");
append(pzug, p1);
pretty_print(pzug);
printf("Pzug after Append p2:\n");
append(pzug, p2);
pretty_print(pzug);
printf("Pzug after Insert p3:\n");
insert(pzug, p3, 1);
pretty_print(pzug);
Polygonenzug *pzug2 = mirror(pzug);
// Test shorten
printf("Pzug after Shorten:\n");
shorten(pzug);
pretty_print(pzug);
printf("Pzug after Shorten:\n");
shorten(pzug);
pretty_print(pzug);
// Test shorten liste loeschen
printf("Pzug after Shorten:\n");
shorten(pzug);
pretty_print(pzug);
// Test shorten leer
printf("Pzug after Shorten:\n");
shorten(pzug);
pretty_print(pzug);
// Test mirror
printf("Pzug2:\n");
pretty_print(pzug2);
free_list(pzug);
free_list(pzug2);
return 0;
}