Nie mogę usunąć elementu z listy (czysty C)

0

Witam,
Mam nastepujacy problem. mam sobie liste jednokierunkowa na ktorej sa przechowywane elementy, kazdy element listy zawiera:

char nazwa_produktu[30];
    char jednostka[30];
    float liczba_jednostek;

Zrobilem sobie opcje w programie ze user usuwa sobie dowolny element z listy, wszystko smiga jak nalezy az do momentu gdy user usunie wszystkie elementy i zostanie jeden element lub po prostu jak jest tylko jeden element na liscie. W tej sytuacji program sie wyklada tzw. user se wybiera ze chce usunac element nr 1, ale w programie nie jest on usuwany. Chodzi o to ze jak usuna pierwszy i zarazem ostatni i jedyny element na liscie??
Kombinowalem takie cos ale nie smiga dobrze ;/

if(help->next == NULL)
                            {
                                if(PoczatekListy != NULL)
                                {
                                    free(help);
                                }
                                else
                                {
                                    printf("Lista produktow jest pusta.\n");
                                }
                            }

przy czym help to:

struct lista *help = PoczatekListy;

Rozumiem to w taki sposob co napisalem:

  1. Jezeli nie istnieje nastepny element listy (tzw. jezeli istnieje tylko jeden element listy lub zaden nie istnieje) to wjezdzamy do ifa.
  2. Jezeli istnieje jeden element listy to wjezdzamy do drugiego ifa i zwalniamy miejsce pierwszego elementu listy.
  3. Jezeli nie istnieje zaden element listy to wywalamy komunikacik
0

Podejrzewam że do funkcji przekazałeś ten PoczatekListy w funkcji go zmieniasz na NULL zaś po powrocie z funkcji jest nadal taki sam.

0

@_13th_Dragon
Wiesz ten ja juz w sumie rozwiązałem ten problem, cos pokombinowalem i zrobilem ostatecznie tak i smiga fajnie:

if(help->next == NULL)
                            {
                                {
                                    if(PoczatekListy != NULL)
                                    {
                                        element *help = PoczatekListy;
                                        PoczatekListy = PoczatekListy->next;
                                        free(help);
                                    }
                                    else
                                    {
                                        printf("Lista jest pusta.\n");
                                    }
                               }
                            }

Tylko w sumie nie wiem do konca jak to dziala tzw. nie dokonca rozumiem, ale juz chce skonczyc swoj projekcik i wziac sie za normalna nauke krok po kroku a nie tak z doskoku podczas robienia projektu ;s

0

Zrób usuwanie np. w ten sposób:

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

struct node{
    int key;
    struct node* next;
};

void add(struct node** root, int key){
    struct node* element = (struct node*)malloc(sizeof(struct node));
    element->key = key;
    element->next = NULL;

    if(*root){
        element->next = *root;
        *root = element;
    }
    else *root = element;
}

void rem(struct node** root, int key){
    if(*root){
        struct node* temp = *root;
        if(temp->key == key) {
            *root = temp->next;
            free(temp);
        }
        else{
            while(temp->next){
                if(temp->next->key == key){
                    struct node* help = temp->next;
                    temp->next = help->next;
                    free(help);
                    break;
                }
                temp = temp->next;
            }
        }
    }
}

void destroy(struct node* root){
    if(root){
        struct node* temp = root;
        struct node* help = root;
        do{
            help = temp;
            temp = temp->next;
            free(help);
        }while(temp);
    }
}

int main(){
    struct node* list = NULL;
    add(&list,12);
    add(&list,14);
    add(&list,16);

    rem(&list,16);
    rem(&list,12);
    rem(&list,14);

    destroy(list);
    return 0;
}

Przy liście jednokierunkowej potrzebny jest wskaźnik na poprzednika elementu, który będzie usuwany. Jest niestety gorzej niż w dwukierunkowej.

1

@grzesiek51114, strasznie utrudniasz sobie życie: http://ideone.com/VQuPa7

#include <stdio.h>
#include <stdlib.h>
 
struct node
  {
   int key;
   struct node *next;
  };

void add(struct node **root,int key)
  {
   struct node *temp=(struct node*)malloc(sizeof(struct node));
   temp->key=key;
   temp->next=*root;
   *root=temp;
  }

void rem(struct node **root,int key)
  {
   struct node *temp,**curr;
   for(curr=root;*curr;curr=&(*curr)->next)
     {
      if((*curr)->key==key)
        {
         temp=*curr;
         *curr=temp->next;
         free(temp);
         break;
        }
     }
  }

void destroy(struct node *root)
  {
   struct node *temp;
   while(root)
     {
      temp=root;
      root=root->next;
      free(temp);
     }
  }
  
void show(struct node *list)
  {
   printf("{");
   for(;list;list=list->next) printf(" %d",list->key);
   printf(" }\n");
  }
  
int main()
  {
   struct node *list=NULL;
   add(&list,12); show(list);
   add(&list,14); show(list);
   add(&list,16); show(list);
 
   rem(&list,16); show(list);
   rem(&list,12); show(list);
   rem(&list,14); show(list);
 
   destroy(list);
   return 0;
  }

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