Skocz do zawartości
Zamknięcie Forum PC LAB

Szanowny Użytkowniku,

Informujemy, że za 30 dni tj. 30 listopada 2024 r. serwis internetowy Forum PC LAB zostanie zamknięty.

Administrator Serwisu Forum PC LAB - Ringier Axel Springer Polska sp. z o.o. z siedzibą w Warszawie: wypowiada całość usług Serwisu Forum PC LAB z zachowaniem miesięcznego okresu wypowiedzenia.

Administrator Serwisu Forum PC LAB informuje, że:

  1. Z dniem 29 listopada 2024 r. zakończy się świadczenie wszystkich usług Serwisu Forum PC LAB. Ważną przyczyną uzasadniającą wypowiedzenie jest zamknięcie Serwisu Forum PC LAB
  2. Dotychczas zamowione przez Użytkownika usługi Serwisu Forum PC LAB będą świadczone w okresie wypowiedzenia tj. do dnia 29 listopada 2024 r.
  3. Po ogłoszeniu zamknięcia Serwisu Forum od dnia 30 października 2024 r. zakładanie nowych kont w serwisie Forum PC LAB nie będzie możliwe
  4. Wraz z zamknięciem Serwisu Forum PC LAB, tj. dnia 29 listopada 2024 r. nie będzie już dostępny katalog treści Forum PC LAB. Do tego czasu Użytkownicy Forum PC LAB mają dostęp do swoich treści w zakładce "Profil", gdzie mają możliwość ich skopiowania lub archiwizowania w formie screenshotów.
  5. Administrator danych osobowych Użytkowników - Ringier Axel Springer Polska sp. z o.o. z siedzibą w Warszawie zapewnia realizację praw podmiotów danych osobowych przez cały okres świadczenia usług Serwisu Forum PC LAB. Szczegółowe informacje znajdziesz w Polityce Prywatności

Administrator informuje, iż wraz z zamknięciem Serwisu Forum PC LAB, dane osobowe Użytkowników Serwisu Forum PC LAB zostaną trwale usunięte ze względu na brak podstawy ich dalszego przetwarzania. Proces trwałego usuwania danych z kopii zapasowych może przekroczyć termin zamknięcia Forum PC LAB o kilka miesięcy. Wyjątek może stanowić przetwarzanie danych użytkownika do czasu zakończenia toczących się postepowań.

Temat został przeniesiony do archiwum

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

Antares

2 listy dwukierunkowe w jednym programie. [C]

Rekomendowane odpowiedzi

Witam,

Czy da się operować na 2 listach w jednym programie. Zadanie brzmi. Na podstawie istniejącej listy stwórz nową listę i przepisz do niej zawartość poprzedniej, i na koniec dodaj liczbę wczytaną z klawiatury. Da się potem wyświetlić i jedną i drugą listę?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Pewnie że się da :)

Żaden problem :) Pokaż co już masz i z czym dokładnie masz problem ??

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Pewnie że się da :)

Żaden problem :) Pokaż co już masz i z czym dokładnie masz problem ??

Dajmy na to odwracanie listy

struct element* lista_odwroc(struct element *head) {
  struct element* temp = NULL, *x = NULL, *y = NULL;
  x = head;
  while(x != NULL) {
     y = (struct element *)malloc(sizeof(struct element));
     y->k=x->k;
     temp = lista_dodaj(temp, y);
     x=x->next;
  }
  return temp; 
}

Z tego co było na wykładach to powyższy fragment tworzy nową listę i zapisuje do niej elementy od końca bierzącej listy? mam rację. W programie teraz są dwie listy? jedna podstawowa, a druga odwrócona. Jak teraz wyswietlic obie listy?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

k w strukturze oznacza poprzedni element ??

 

Jeśli chodzi o wyświetlanie to wystarczy napisać funkcje która pobierze początek lub koniec listy i po kolei będzie wyświetlać elementy. Nie wiem dokładnie czy o to Ci chodzi :/

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

k w strukturze oznacza poprzedni element ??

 

Jeśli chodzi o wyświetlanie to wystarczy napisać funkcje która pobierze początek lub koniec listy i po kolei będzie wyświetlać elementy. Nie wiem dokładnie czy o to Ci chodzi :/

ALe funckja odwróć tworzy nową listę bo nie jestem pewien.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Więcej kodu... Nie będę zgadywać co oznacza k i jak działa funkcja lista_dodaj().

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
struct element
{
int k;
struct element *prev;
struct element *next;
};
void lista_wyswietl( struct element *head);
struct element* lista_dodaj(struct element *head, struct element *nowy);
struct element* lista_szukaj(struct element *head, int sz);
struct element* lista_usun(struct element *head, struct element *x);
struct element* lista_odwroc(struct element *head);
struct element* lista2(struct element *head);
struct element* lista3(struct element *head);
struct element* lista4(struct element *head);
int main()
{
struct element *head=NULL, *nowy=NULL, *temp=NULL;
int liczba;
char z;
while(1)
{
	printf("\nd-dodaj\n");
	printf("w-wyswietl\n");
	printf("s-szukaj\n");
	printf("q=wyjscie\n");
	z=getchar();
	switch(z)
	{
		case 'w': lista_wyswietl(head);
		getch();
		break;

		case 'd': nowy=(struct element *)malloc(sizeof(struct element));
		printf("Podaj wartosc do dodania \n");
		scanf("%d", &liczba);
		nowy->k=liczba;
		head = lista_dodaj(head, nowy);
		break;
		case 's': printf("Podaj element do szukania \n");
		scanf("%d", &liczba);
		temp=lista_szukaj(head, liczba);
		if(temp!=NULL)
		printf("Znaleziono element\n");
		else
		printf("Nie znaleziono elementu\n");
		getch();
		break;
		case 'u': lista_wyswietl(head);
		printf("Podaj element do usuniecia\n");
		scanf("%d", &liczba);
		temp=lista_szukaj(head, liczba);
		if(temp!=NULL)
		head=lista_usun(head, temp);
		break;
		case 'o': if(head!=NULL)
		{
		head = lista_odwroc(head);
		printf("Lista odwrócona\n");
		lista_wyswietl(head);
		getch();
		}
		break;
		case '2': if(head!=NULL)
		{
		head=lista2(head);
		printf("Usunieto elementy!\n");
		lista_wyswietl(head);
		getch();
		}
			break;
		case '3': if(head!=NULL)
		{
		head=lista3(head);
		printf("Wyzerowano elementy wieksze od 10!\n");
		lista_wyswietl(head);
		getch();
		}
			break;
		case '4': if(head!=NULL)
		{
		head=lista4(head);
		printf("Usunieto elementy!\n");
		lista_wyswietl(head);
		lista_wyswietl(temp);
		getch();
		}
			break;	
		case 'q': 
		return 0;
		break;
	}
	system("cls");
}
}
void lista_wyswietl( struct element *head)
{
struct element *x=head;
while(x!=NULL)
{
	printf("%d ", x->k);
	x=x->next;
}
}
struct element* lista_dodaj(struct element *head, struct element *nowy)
{
nowy->next=head;
if(head!=NULL)
{
	head->prev=nowy;
}
head=nowy;
nowy->prev=NULL;
}
struct element* lista_szukaj(struct element* head, int sz)
{
struct element *x=head;
while(x!=NULL &&x->k!=sz)
x=x->next;
return x;
}
struct element* lista_usun(struct element* head, struct element* x)
{
struct element *temp;
if(x->prev!=NULL)
x->prev->next=x->next;
else
head=x->next;
if(x->next!=NULL)
x->next->prev=x->prev;
return head;
}
struct element *lista_odwroc(struct element*head)
{
struct element *LP=NULL,*x=head;
while(head!=NULL)
{
	LP=head->next;
	head->next=head->prev;
	head->prev=LP;
	if(head->prev==NULL)
	return head;
	head=head->prev;
} 
return head;
}
struct element *lista2(struct element *head)
{
int i=1;
struct element *x=head;
while(x!=NULL)
{	
	if(i%2==0)
	{
	lista_usun(head, x);
	}
	i++;
	x=x->next;
}
return head;
}
struct element *lista3(struct element *head)
{
struct element *x=head;
while(x!=NULL)
{	
	if(x->k>=10)
	{
	lista_usun(head, x);
	}
	x=x->next;
}
return head;
}
struct element* lista4(struct element *head) {
  struct element* temp = NULL, *x = NULL, *y = NULL;
  x = head;
  int i=0;
  while(x != NULL) 
  {
  	if(i%2==0)
  	{
     y = (struct element *)malloc(sizeof(struct element));
     y->k=x->k;
     temp = lista_dodaj(temp, y);
 	}
     x=x->next;
     i++;
  }
  return temp; 
}

Jeszcze raz od nowa. Mamy powyższy program.

po wywołaniu funkcji lista_4 w programie tworzy się nowa lista która przechowuje co drugi znak istniejącej już listy? ja tak to rozumiem? W sumie mam 2 listy.

Jedyne co mi brakuje aby rozwiązać kolejne zadania, to wyświetlenie obu list.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Ale bałagan. A to nie działa?

lista_wyswietl(head);

lista_wyswietl(temp);

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Hmm... Nie jestem pewny, a nie mam dostępu do kompilatora, ale wydaje mi się że:

head=lista4(head);

Ta funkcja rzeczywiście stworzy listę która przechowuje co drugi element, ale po wywołaniu powyższej linijki, head stanie się wskaźnikiem na początek nowo utworzonej listy, a chyba tak ma nie być.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Ale bałagan. A to nie działa?

lista_wyswietl(head);

lista_wyswietl(temp);

Działa ale wyświetla jedną listę.

 

Hmm... Nie jestem pewny, a nie mam dostępu do kompilatora, ale wydaje mi się że:

head=lista4(head);

Ta funkcja rzeczywiście stworzy listę która przechowuje co drugi element, ale po wywołaniu powyższej linijki, head stanie się wskaźnikiem na początek nowo utworzonej listy, a chyba tak ma nie być.

Tak działa ja mówisz, skąd wziąć wskażnik na listę poprzednią.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Masz za sobą taki program a pytasz o takie proste rzeczy ??

 

No chyba wystarczy nie nadpisywać listy. A tą drugą którą tworzy funkcja przypisać do innego wskaźnika.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

już chyba wiem

zamiast

head=lista4(head);

należy

temp=lista4(head);

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Jeszcze jeden problem, troche sie zamotałem

funkcja lista_4 przepisuje co drugi znak do nowej listy, ale robi to od tyłu

np dla liczb

1 2 3 4

dodaje 3 1

a powinna zaczynać od początku

czyli dodać

1 3

Jak to zmienić?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Proponuje prześledzić działanie funkcji lista_dodaj, zastanowić się, wyciągnąć wnioski i poprawić.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Proponuje prześledzić działanie funkcji lista_dodaj, zastanowić się, wyciągnąć wnioski i poprawić.

aha, czyli zawsze dodaje na początek nową wartosc?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Lista dwukierunkowa ma to do siebie że łatwo jest ją wyświetlić zaczynając jak i z jednego jak i z drugiego końca. To jest chyba najprostsze wyjście z sytuacji.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Lista dwukierunkowa ma to do siebie że łatwo jest ją wyświetlić zaczynając jak i z jednego jak i z drugiego końca. To jest chyba najprostsze wyjście z sytuacji.

Czyli powienem x nadać wartosc tail? i x=x->prev?

Albo powiedz Pan wprost jak bo chyba się nie domyślę.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Mam nadzieję że nie wiążesz przyszłości z karierą programisty.

Twoja funkcja zwraca wskaźnik na początek listy. Wystarczy że zwrócisz wartość na jej koniec, wtedy lista zostanie wyświetlona "od końca".

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Mam nadzieję że nie wiążesz przyszłości z karierą programisty.

Wiąże, albo jeszcze nie wiem, tylko ja tak mam że nie od razu wszystko załapię.

A tak bardziej serio, to nie było tego na wykłądzie bo przepadł, a samemu ciężko mi się nauczyć.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

To albo się weź do roboty albo się nie miło rozczarujesz.

Mam nadzieję że poprawisz już sam program i nie będzie o nic pytać.

Pozdrawiam, narka.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

  • Ostatnio przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników przeglądających tę stronę.

  • Tematy

  • Odpowiedzi

    • Ciekawy filozoficzny post, ja to odbieram inaczej - 9800X3D potrafi być 30% szybszy od 7800X3D i to przyrost w 18 miesięcy. Jeżeli upgrade dokonujesz w tej samych "widełkach" wydajnościowych zmieniajac starsze i5 na nowsze i5 to przyrost potrafi być przez 2 lata mniejszy niż nawet 5% za to energetycznie bywa że jest 30% lepiej, ostatecznie jest to jakaś ewolucja - pamiętaj że rozwój technologii jest iteratywny i polega na małych przyrostach które ostatecznie składają się na coś wielkiego ale ostatecznie masz rację - i7-2600 do dzisiaj może stanowić podstawę użytecznego komputera biurowego, skylake posłuszy pewnie i do 2030 w takich celach. Rasteryzacja w kartach graficznych faktycznie stoi nieco w miejscu, nVidia próbuje zrewolucjonizować rynek vendorlockowymi technikami jak swoje DLSSy, ostatecznie doprowadzi to do stagnacji gdzie bez zamydlonego ekranu nie pogramy w 4K, silniki graficzne też nie rozwijają się w oczekiwanym tempie - unity rozpadło się przez kiepski zarząd, unreal engine 5 to król mikroopóźnień, od zakończenia akceleracji sprzętowej dźwięku w windows vista (okolice 2007) nie było w audio żadnej rewolucji a wręcz ewolucji - id Tech to do dzisiaj jedyny engine który potrafi wyrysować łuk a nie koła z nakładanych trójkątów... Także sygnałów że branża kuleje nigdy nie brakowało - grunt to realizować swoje cele i jak tak jak ja od lat 2000 celujesz w średnią półkę cenową - szukać takich upgrade które faktycznie coś dają no i mieć świadomość że rtx 5090 to będzie 600w potwór z gddr7 i ceną na poziomie 12000 pln, takiej wydajności w kartach do 2000zł nie zobaczymy do 2030r. Pamiętam WOW jakie zrobił na mnie Teoria Chaosu splinter cella (mądrze zaprogramowana gra działająca również na konsolach) Far Cry 1 (był nieziemski na premierę) Crysis wyrywał z butów (8800gtx ledwo dawał radę), wszystko potem to sidegrade z momentami które pokazywały że 200 mln usd budżetu może dać jakościowy tytuł jak Red Dead 2, przez ostatnie 20 lat dobrych gier pctowych nie brakowało ale większość to ciągły sidegrade niepotrzebujący najmocniejszych sprzętów, dobieranie timingów pamięci to zawsze była nieco sztuka dla sztuki
    • Na ITH podobna wolność słowa jak na X/Twitterze. No cóż, trzeba będzie po prostu listę ignorowanych wydłużyć  
    • Tak, ale są związane z usługą udostępnienia platformy z ramienia podmiotu X. W tym wypadku RASP. Jeśli treść, nawet przerobioną na anonimową, przetwarzać zacząłby ktoś inny, nie wiem czy przypadkiem nie potrzeba uzyskać ponownie zgody na przetwarzanie wtórne/dziedziczne. Być może bezpośrednio z RASP, ale już stwierdzono, że nie ma takiej opcji. Głośno myślę jedynie, nie wczytywałem się tak głęboko w przepisy. Ok, ale co jeśli posty zawierają informacje mogące przyczynić się do ustalenia tożsamości piszącego/piszących? Tu już robi się niestety grubiej.    
    • Ja odpowiem bo nie wybieram się na tamto forum. Zależy czy masz boxy, gwarancję i jak szybko chcesz sprzedać ale coś koło 2100.
    • Polecam zapytać na Forum ITHardware.pl tutaj już raczej nikt ci nie odpowie, to forum się zamyka i wszyscy przeszli na ith.   @MuziPL .
  • Aktywni użytkownicy

×
×
  • Dodaj nową pozycję...