C++ řazení seznamu – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

C++ řazení seznamu – C / C++ – Fórum – Programujte.comC++ řazení seznamu – C / C++ – Fórum – Programujte.com

 

Petr
~ Anonymní uživatel
746 příspěvků
23. 7. 2012   #1
-
0
-

Zdravím, předem bych chtěl poděkovat všem za jakoukoliv snahu. Ve škole jsem dostal za úkol udělat program v C++ na řazení celých kladných čísel metodou Radix sort. V programu se musí využít seznam.

Tímto úkolem se již zabývám druhý den a zdá se mi, že se v tom čím dál víc zamotávám. Ze začátku jsem převzal kód z linuxsoft.cz a snažil se ho upravit. Našel jsem dokonce knihu na books.google.com, kde se tato problematika popisuje, ale pořad mi něco uniká a nechce to pracovat, ať to zkouším, jak to chci.

Nejvíce by mi pomohlo, kdyby mi někdo poradil, jak mam vytvořit seřazený seznam. Jinak řečeno, bych potřeboval, aby se mi vygenerovalo číslo, zavolala se funkce přidat, kde by se spustil nějaký cyklus, který by porovnával čísla, až by našel místo kam to číslo patří, seznam by se rozpojil a číslo bylo vnořené.

Přidávám kód, se kterým jsem to zkoušel udělat.

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>
int i;
int pole[10];


typedef struct seznam {  // udela typ seznam, do ktereho se ulozi data a ukazatel na dalsi data
  int data;
  struct seznam *dalsi;
} SEZNAM;
SEZNAM *zarazka;

void vypis(const SEZNAM *ps) {
  while (ps != NULL)  {       /* Dokud nejsme na konci, */
    printf("%i\n", ps->data); /* vypią aktuální prvek   */
    ps = ps->dalsi;           /* a posuň se na daląí.   */
  }

}

void pridej(SEZNAM **pps, int prvek) {
  SEZNAM *ps;

  ps = (SEZNAM *) malloc(sizeof(SEZNAM));
  if (!ps) {			
    return;
  }


  ps->data = prvek;
  ps->dalsi = *pps;
  *pps = ps;

  while (ps != NULL)  {       /* Dokud nejsme na konci, */
    printf("%i\n ---", ps->data); /* vypią aktuální prvek   */
    ps = ps->dalsi;           /* a posuň se na daląí.   */	
  }



}

void mazejvse(SEZNAM **pps) {
  SEZNAM *ps;

  ps = *pps;
  while (ps) {
    *pps = ps->dalsi;
    free(ps);
    ps = *pps;
  }
  	getch();
}


int main(void) {
  SEZNAM *s;
  srand(time(0));
  int prvek;

  s = NULL; /* Důleľité, v opačném případě by nebyl seznam ukončen. */
	for (i = 0; i < 10; i++) {	
		pole[i] = (rand() % 100);				
	}

	puts("Vygenerovane hodnoty v poli:");
	puts("----------------------------");
	for (i = 0; i < 10; i++) {	
		printf("%i\n", pole[i]);
		pridej(&s, pole[i]);
	}


	puts("\n");
	puts("Seznam:");
	puts("----------------------------");
	vypis(s);


	mazejvse(&s);
	return 0;
  	getch();
}
Nahlásit jako SPAM
IP: 89.102.165.–
jano
~ Anonymní uživatel
85 příspěvků
23. 7. 2012   #2
-
0
-

tak kodit to nebudem lebo by tam boli chyby

ale postup by som zvolil nasledovny najprv

  1. zistit ci je novy prvok najvacsi teda vacsi ako prvy ak ano vlozit na zaciatok
  2. prechadzat  zoznam az po koniec kym ps->dalsi!=NULL alebo kym ps->dalsi->data > novyprvok
  3. potom novy->dalsi=ps->dalsi; ps->dalsi=novy;

tak dako ;)

Nahlásit jako SPAM
IP: 85.135.160.–
Petr
~ Anonymní uživatel
746 příspěvků
24. 7. 2012   #3
-
0
-

Už jsem to řazení vyřešil, chtěl bych poděkovat všem poděkovat za ochotu, hlavně JANO 

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>
#include <iostream>

using namespace std;
int i;
int pole[10];


typedef struct seznam{  
  int data;
  struct seznam *dalsi;
} SEZNAM;
SEZNAM *zarazka;



void vypis(const SEZNAM *ps) {
  while (ps != NULL)  {       
    printf("%i\n", ps->data); 
    ps = ps->dalsi;           
  }

}


void pridej(SEZNAM **prvniPrvekSeznamu, int prvek, SEZNAM *s) {

	SEZNAM *s2, *s3, *s1;

	s1 = s;
	s2 = s;

	cout << "gener "  << prvek << endl;
	if (s1 != NULL) cout << "s "  << s1->data << endl;



	if (s1 == NULL){
		s1 = (SEZNAM *) malloc(sizeof(SEZNAM));
		s1->data = prvek;
		s1->dalsi = *prvniPrvekSeznamu;
		*prvniPrvekSeznamu = s1;
	}
	else {
		while (s1 != NULL)  { 
				if (prvek < s1->data){  

					cout << prvek << " mensi "  << s1->data << endl;

					cout << " dalsi "  << s1->dalsi << endl;

					if (s1->dalsi == NULL){
						cout << " pridat pred " << s1->data << endl;
						s3 = (SEZNAM *) malloc(sizeof(SEZNAM));

						s2 = s1->dalsi;
						s3->data= prvek;
						s3->dalsi= s2;

						s1->dalsi = s3;

							if (s1 == s){											// nastaveni prvniho prvku
								cout << " prvni prvek je - "  << s->data << endl;
								*prvniPrvekSeznamu = s;
								break;
							}else{
								cout << " prvni prvek je - "  << s->data << endl;
								*prvniPrvekSeznamu = s;
								break;
							}
						
					}


					s2 = s1;
					s1 = s2->dalsi;
				}

				if (prvek >= s1->data){  

						if (s1 == s){										// pokud se jedna o prvni prvek v seznamu
							cout << " pridat pred " << s->data <<  endl;
							s = (SEZNAM *) malloc(sizeof(SEZNAM));

						
							s->data = prvek;
							s->dalsi = *prvniPrvekSeznamu;



							
							cout << " prvni prvek je - "  << s->data << endl;   // nastaveni prvniho prvku
							
							*prvniPrvekSeznamu = s;
							break;
						}
						else{
						
							cout << s1->data << " neni mensi - pridat "  << prvek << endl;

							s3 = (SEZNAM *) malloc(sizeof(SEZNAM));
							s3->data = prvek;
							s3->dalsi = s1;
							s2->dalsi = s3;


							*prvniPrvekSeznamu = s;

							break;



						}


				}

		}
		
    
		}


  
		cout << " "  << endl; 
		while (s != NULL)  {     
			cout << "vypis------ "  << s->data << endl; 
			s = s->dalsi;    
			} 	


return;











}

void mazejvse(SEZNAM **prvniPrvekSeznamu) {
  SEZNAM *ps;

  ps = *prvniPrvekSeznamu;
  while (ps) {
    *prvniPrvekSeznamu = ps->dalsi;
    free(ps);
    ps = *prvniPrvekSeznamu;
  }
  	getch();
}




int main(void) {
  SEZNAM *s;
  SEZNAM *s4;
  srand(time(0));
 

  s = NULL;				/* Důleľité, v opačném případě by nebyl seznam ukončen. */  //tady ten seznam tam davas jako parametr pps a ten potrebujes aby ti to vratilo upravenej toho docilis tim &
	cout  << "Vygenerovane hodnoty v poli:" << endl;
	cout  << "---------------------------" << endl;

	for (i = 0; i < 10; i++) {	
		cout  << i << "\n" << endl;
		cout  << i << "---------------------------" << endl;
		pole[i] = (rand() % 1001);
		pridej(&s, pole[i], s);
	}



	puts("\n");
	puts("Seznam:");
	puts("----------------------------");
	vypis(s);




	mazejvse(&s);
	return 0;
  	getch();
}
Nahlásit jako SPAM
IP: 89.102.165.–
vitamin+8
Grafoman
24. 7. 2012   #4
-
0
-

Nebolo by zle menej kombinovat c a c++.

Ak nemusis implementovat zoznam tak pouzi list z stl, bude to prehladnejsie.

Nahlásit jako SPAM
IP: 95.105.157.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 51 hostů

Podobná vlákna

Iterace v seznamu — založil kterosuom

Práce seznamu — založil pouk

Zarovnání seznamu — založil UrbiCZ

Seřazení v seznamu — založil Jakub Vojáček

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý