Lista dwukierunkowa – problem ze wstawieniem elementu na zadaną pozycję

0

Cześć, mam problem z funkcją w Liście dwukierunkowej. Dokładnie chodzi o dodanie elementu na podaną pozycję, bez usuwania elementu który tam był,wszystko to co było na liście ma być plus nowy element który wstawiamy na daną pozycję. Dodaję kod, proszę o pomoc.

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


struct element {
int x;
struct element *next;
struct element *prev;   };


struct lista2 {

struct element *pocz;
struct element *koniec;
int ilosc;    };



void dodajtyl(int newx, struct lista2* list){                                          // dziala
struct element* newel =(struct element*)malloc(sizeof(struct element));
newel->x=newx;
newel->next = NULL;
if(list->ilosc == 0){
    list ->pocz=newel;
    list->koniec=newel;
    newel->prev =NULL;



} else{

newel->prev=list->koniec;
list->koniec->next=newel;
list->koniec=newel;


}
list->ilosc++ ;



}
void dodajnapoczatek(struct lista2 *L, int newx){    //dziala

    struct element *p=(struct element*)malloc(sizeof(struct element));
   p->x = newx;
   p->prev = NULL;
   p->next = L->pocz;
   L->pocz=p;
   L->ilosc++;
   if(p->next) p->next->prev = p;
   else L->koniec =p;




   }                                                                         //tu nizej problem : (

 void dodajNapozycje(struct lista2 *L, int newx, int pozycja){  // ma dodac element na podaną pozycje bez usuwania elementu, który tam stoi

       if(pozycja <0 || pozycja > L->ilosc-1){                                  // I mozliwość
	dodajtyl(newx,L);                              // gdy nie ma takiej pozycji ma dodac na koniec  (działa)
     return;

    }else if(pozycja == 0){
        dodajnapoczatek(L,newx);               // dodaje na poczatek  (działa)        II możliwośc
       return;

 } else {                                                                //  ( NIE DZIAŁA )    <--   III możliwość

   int licznik=0;
       struct element *p=(struct element*)malloc(sizeof(struct element));
      struct element *temp;
     temp=L->pocz;


        while( temp != NULL ){

                if(licznik == (pozycja -1)){
                p->x=newx;
                p->next=temp->next;
               temp=p;
               L->ilosc++;
  
                        return;
                }
                  licznik++;
                temp= temp->next;
        }}


 }


  void wyswietlStart(struct lista2 *L){                        

  struct element *p = (struct element*)malloc(sizeof(struct element));

  printf("\nOd poczatku \n");
  p= L->pocz;
  while(p!=0){
    printf(" %d",p->x);
    p=p->next;

  }

  printf("\n");


  }



    int menu(){

int nr;

  printf("\nMENU: \n");
  printf("\n1.Dodaj na podana pozycje\n2.Wydruk listy\n3.Koniec. \n");

printf("\nWybor:  ");
scanf("%d",&nr);



return nr;}




 int main()
 {
    struct lista2 *L = (struct lista2*)malloc(sizeof(struct lista2)); // Tworze liste
    L->pocz = NULL;
    L->koniec = NULL;
    L->ilosc = 0;
int newx, pozycja,nr;


 do{
   nr=menu();
       switch (nr){

    case 1:
        printf("\nDodaj element ");
       scanf("%d",&newx);

     printf("\n\nz jaka pozycje  ");
    scanf("%d",&pozycja);

     dodajNapozycje(L,newx,pozycja);       //     ' ma dodawac na podaną pozycje '  element ktory tam byl dalej ma byc na liscie
        system("PAUSE");
        break;

     case 2:
        wyswietlStart(L);
        //system("PAUSE");
                //wyswietla od poczatku
        case 3:break ;

}

  system("PAUSE");
  system("cls");
  }while(nr!=3);
    return 0;
 }
1

Pierwsza rzecz – skoro używasz indeksów do określania pozycji w węzłach, to bardzo przydatna będzie funkcja zwracająca węzeł na podstawie tego indeksu. Do tego przyda się funkcja, która utworzy węzeł w pamięci i wypełni go danymi z parametrów. Te dwie funkcje znacząco uproszczą kod, a przy okazji go skrócą.


Jeśli indeks węzła jest większy niż ich liczba, to wywołaj funkcję dodającą węzeł na koniec listy.

W przeciwnym razie utwórz nowy węzeł i wypełnij go danymi (tu użyj funkcji tworzącej węzeł). Jeśli indeks jest równy 0 to zaktualizuj głowę listy – tyle wystarczy. A jeśli indeks jest większy niż 0 to znajdź węzeł istniejący na danej pozycji (tu przyda się ww. funkcja wyszukująca węzeł) i na jego podstawie zaktualizuj wskaźniki na poprzedni i następny.

Przykład w Pascalu znajduje się tutaj. Wiem że to inny język, ale chodzi mi o ogólną koncepcję.

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