C lista problem.

0

Mam mały problem z programem na laborki. Nie chce działać usuwanie i edytowanie elementów listy. Sam przeglądałem kod już kilkakrotnie i dalej nie widzę dlaczego. Pewnie to jakaś pierdoła, której nie dostrzegam więc zwracam się do Was z prośbą o pomoc :D

 /* 
 * File:   main.c
 * Author: BSCOMP
 *
 * Created on 16 kwiecień 2012, 18:38
 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

/*
 * 
 */
typedef struct liczba {
    int imaginary, info;

    union {
        double realf;
        int reali;
    } u;
    struct liczba *kolejna;
} el_listy;

el_listy *pierwszy;
void menu(struct liczba *pierwszy);

void wstaw(struct liczba *pierwszy) {
    char *pomoc;
    int check = 0, i, j = 0;
    struct liczba *element, *suwak;

    if (pierwszy == NULL) {
        pierwszy = malloc(sizeof (el_listy));
        j = 1;
    } else {
        suwak = pierwszy;
        while (suwak->kolejna != NULL) {
            suwak = suwak->kolejna;
        }
    }
    element = malloc(sizeof (el_listy));
    pomoc = malloc(12);
    printf("\npodaj czesc rzeczywista: \n");
    scanf("%s", pomoc);
    for (i = 0; i != (strlen(pomoc)); ++i) {
        if ((isdigit(pomoc[i])) == 0)check = 1;
    }
    if (check != 0) {
        element->u.realf = atof(pomoc);
    } else {

        element->u.reali = atoi(pomoc);
    }
    printf("\npodaj czesc urojona: ");
    scanf("%s", pomoc);
    element->imaginary = (atoi(pomoc));
    printf("\n%d\n", element->imaginary);
    element->info = check;
    if (j != 0) {
        pierwszy = element;
    } else {
        suwak->kolejna = element;
    }
    free(pomoc);
    menu(pierwszy);
}

void wypisz(struct liczba *pierwszy) {
    if (pierwszy != NULL) {
        el_listy *suwak = pierwszy;
        while (suwak != NULL) {
            printf("\nczesc rzeczywista:");
            if (suwak->info != 0) {
                printf("%.3f", suwak->u.realf);
            } else printf("%d", suwak->u.reali);
            printf("\nczesc urojona:%d", suwak->imaginary);
            suwak = suwak->kolejna;
        }

    } else {
        printf("\nlista jest pusta!");
    }
    menu(pierwszy);
}

void po(struct liczba *pierwszy, struct liczba *element, int *pom) {
    el_listy *suwak;
    char *pomoc;
    int check = 0, i, k = 0, pomoc2, prawda = 0;

    pomoc = malloc(12);
    printf("\npodaj czesc rzeczywista po ktorej chcesz szukac: \n");
    scanf("%s", pomoc);
    for (i = 0; i != (strlen(pomoc)); ++i) {
        if ((isdigit(pomoc[i])) == 0)check = 1;
    }
    if (check != 0) {
        element->u.realf = atof(pomoc);
    } else {
        element->u.reali = atoi(pomoc);
    }
    printf("\npodaj czesc urojona po ktorej chcesz szukac: \n");
    scanf("%d", &pomoc2);
    element->imaginary = pomoc2;
    suwak = pierwszy;
    while (suwak != NULL) {
        if (check != 0) {
            if (suwak->u.realf == element->u.realf) {
                k = 1;
                if (suwak->imaginary == element->imaginary)k = ++k;
                if (k == 2) {
                    element = suwak;
                    prawda = 1;
                }
            }
        } else {
            if (suwak->u.reali == element->u.reali) {
                k = 1;
                if (suwak->imaginary == element->imaginary)k = ++k;
                if (k == 2) {
                    element = suwak;
                    prawda = 1;
                }
            }
        }
        if(k==2){break;} else 
        suwak = suwak->kolejna;
    }
    if (prawda != 1) {
        printf("\n nie znaleziono elementu\n");
    } else {
        *pom = 1;
    }

}

void usun(struct liczba *pierwszy) {
    struct liczba *element;
    struct liczba *suwak;
    int pomoc = 0;
    int *ppomoc;
    ppomoc = &pomoc;
    element = malloc(sizeof (el_listy));
    po(pierwszy, element, ppomoc);

    if (pomoc == 1) {
        suwak = pierwszy;
        if (pierwszy == element) {
            pierwszy = pierwszy->kolejna;
        } else {
            while (suwak->kolejna != NULL) {
                if (suwak->kolejna == element) {
                    suwak->kolejna = element->kolejna;
                }
                suwak = suwak->kolejna;
            }
        }
        free(element);
    }
    menu(pierwszy);
}

void edytuj(struct liczba *pierwszy) {
    struct liczba *element;
    struct liczba *suwak;
    char *pomoc;
    int check = 0, i, j = 0;
    int pom = 0;
    int *ppomoc;
    double realf;
    int reali,imaginary;
    ppomoc = &pom;
    element = malloc(sizeof (el_listy));
    po(pierwszy, element, ppomoc);
    if (pom == 1) {
        printf("\npodaj czesc rzeczywista: \n");
        scanf("%s", pomoc);
        for (i = 0; i != (strlen(pomoc)); ++i) {
            if ((isdigit(pomoc[i])) == 0)check = 1;
        }
        if (check != 0) {
            realf = atof(pomoc);
        } else {

            reali = atoi(pomoc);
        }
        printf("\npodaj czesc urojona: ");
        scanf("%s", pomoc);
       imaginary = (atoi(pomoc));
        suwak = pierwszy;
        while (suwak != NULL) {
            if (suwak == element) {
                suwak->imaginary = imaginary;
                if (check != 0) {
                    suwak->u.realf = realf;
                } else {
                    suwak->u.reali = reali;
                }
            }
            suwak = suwak->kolejna;
        }
    }
    menu(pierwszy);
}

void wyszukaj(struct liczba *pierwszy) {

    int y;

    if (pierwszy == NULL) {
        printf("\nlista jest pusta\n");
        menu(pierwszy);
    } else {
        printf("\n1-...usun\n2-...edytuj\n");
        scanf("\n%d", &y);
        switch (y) {
            case 1:
            {
                usun(pierwszy);
                break;
            }
            case 2:
            {
                edytuj(pierwszy);
                break;
            }
        }
    }
    wypisz(pierwszy);
}

void menu(struct liczba *pierwszy) {
    int x;

    printf("\n1-dodaj\n2-wypisz liste\n3-wyszukaj i...\n4-koniec\n");
    scanf("\n%d", &x);
    switch (x) {
        case 1: wstaw(pierwszy);
            break;
        case 2: wypisz(pierwszy);
            break;
        case 3: wyszukaj(pierwszy);
            break;
        case 4: exit(0);
            break;

    }


}

int main(int argc, char** argv) {

    pierwszy = NULL;

    menu(pierwszy);
    return (EXIT_SUCCESS);
}

0
  1. wstaw to:
    el_listy *pierwszy; (i tak masz wskaźnik na pierwszy w parametrze każdej funkcji)
    do funkcji main

  2. masz błąd logiczny. twoje funkcje od czasu do czasu zmieniają wskaźnik "pierwszy", a ten jest przekazywany przez wartość
    w każdej funkcji, której parametrem jest pierwszy zamień:
    funkcja(struct liczba *pierwszy,...)
    na
    funkcja(struct liczba **pierwszy,...)

i do tego dostosuj resztę kodu.

Jeszcze lepszym rozwiązaniem było

jeszcze lepszym rozwiązaniem byłoby zrobienie struktury o nazwie lista, która przechowywać będzie pierwszy element listy i wskaźnik na tą strukture przekazywać w parametrze funkcji (nie podwójny).

ideoowo powinno to wyglądać tak:
int main()
{
list* lista = create_list(); // tworzy strukture i ustawia wskazniki na NULLe (struktura moze przechowywac rowniez ilosc elementow oraz wskaznik na ostatni element)
menu(lista);
free_list(lista);
return 0;
}

nie sprawdzałem kodu pod kątem innych błędów. zakładam, że sam je sprawdziłeś.

1 użytkowników online, w tym zalogowanych: 0, gości: 1