przenoszenie w liście jednokierunkowej

0

Hej
Pojawił mi się problem na studiach, chodzi dokładniej o listę dwukierunkową. Otóż, nie mogę wyjść z podziwu dla samego siebie, że napisałem program który taką listę tworzy. Zobaczcie kod, program jak byk tworzy 12 strukturek. Skakanie wokół komputera nie trwało jednak długo gdyż szanowny pan z programowania zażyczył sobie dorobić kilka linijek kodu aby po podaniu numeru dana struktura wskakiwała na podane miejsce. Ma to wyglądać jakoś tak:

(teraz)
1 2 3 4 5 6 7 8 9 10

(podajemy np 7[enter]3 i siódmy numerek przeskakuje na miejsce trzeciego)
1 2 7 3 4 5 6 8 9 10

Pewnie jest tak, że dla kogoś kto się na tym zna rozwiązanie jest banalne, ale ja siedzę i siedzę i myślę i myślę.

kod programu

#include "stdafx.h"
#include <stdlib.h>
#include <string.h>
#include <stdio.h>



    struct baza {
        char nazwisko[20];
        int id;
        baza* poprzedni;
        baza* nastepny;
    };

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

    //baza* poczatek;
    //baza* ostatni;
    baza* temp;


    temp=(baza*)malloc(sizeof(baza));
    temp->id=1;
    temp->nastepny=NULL;
    temp->poprzedni=NULL;
    strcpy(temp->nazwisko, "pierwszy");
    printf("%d %s\n", temp->id, temp->nazwisko);

    for(int i=0;i<10;i++)
{
        temp=(baza*)malloc(sizeof(baza));   
        temp->id=i+2;
        temp->nastepny=temp;
        strcpy(temp->nazwisko, "wyzerowane");
        printf("%d %s\n", temp->id, temp->nazwisko);
}
    temp=(baza*)malloc(sizeof(baza));
    temp->nastepny=NULL;
    temp->poprzedni=temp;
    
      strcpy(temp->nazwisko, "ostatni");
    printf("%d %s\n", temp->id, temp->nazwisko);
    printf("\n \n");
    
    printf("%d %s", temp->id[2], temp->nazwisko[2]);
system("PAUSE");
}

Pomożecie?

0

Wypinasz element nr 7 (czyli adres elementu 7 łapiesz do wskaźnika tymczasowego, jakiegoś temp, potem *następny elementu 6 ustawiasz na 8, *poprzedni elementu 8 ustawiasz na 7)
Następnie wpinasz element nr 7 (trzymany za adres w tmp) między 3 i 2 (*następny elementu nr 7 ustawiasz na 3, *poprzedni 7 ustawiasz na 2, *poprzedni elementu 3 ustawiasz na 7, *następny 2 ustawiasz na 7)
W czym problem? Pamiętaj żeby robić to w dobrej kolejności, żeby sie nie okazało ze zgubisz sobie wskaźnik ;]
No i pamiętaj zeby sprawdzać przypadki skrajne -> element nr 3 nie istnieje, lista jest pusta, wstawianie na początek listy

0

O, to już coś :) Tylko mam problem z zapisaniem tego... Chodzi mi np o odwołanie się to któregoś z elementów - jak mogę zmienić kogo on przyjmuje za poprzednika/następnika. Nie chodzi mi o podawanie całego gotowego kodu, proszę jedną linijkę która pokazuje jak odwołać się np to 8. elementu.

0
baza* advance(baza *p,int n)
{
	if(n > 0) while(n-- > 0 && p) p = p->nastepny;
	else while(n++ < 0 && p)p = p->poprzedni;
	return p;
}

...

baza* x = advance(root,8);
0

Witam,
możesz po prostu przechodzić sobie po elementach listy wskaźnikiem określoną ilośc razy. Napisać funkcję dodającą, która przyjmie za parametr np. konkretny obiekt gotowy do wstawienia, i index, w które miejsce listy go wstawić. Następnie, na początku funkcji, zrobić pętlę, która będzie wskaźnikiem na taką strukturę chodzić po obiektach tyle razy, żeby znaleźć się na odpowiednim indeksie.
;)
Jak bęziesz miał element listy pod wskaźnikiem, jesteś w domu :)

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