Registrierung Kalender Mitgliederliste Teammitglieder Suche Häufig gestellte Fragen Zur Startseite

Informatiker Board » Themengebiete » Praktische Informatik » Softwaretechnik » einfach verkettete Listen in C -Programmhilfe » Antwort erstellen » Hallo Gast [Anmelden|Registrieren]

Antwort erstellen
Benutzername: (du bist nicht eingeloggt!)
Thema:
Nachricht:

HTML ist nicht erlaubt
BBCode ist erlaubt
Smilies sind erlaubt
Bilder sind erlaubt

Smilies: 21 von 33
smileWinkDaumen hoch
verwirrtAugenzwinkerngeschockt
Mit ZungeGottunglücklich
Forum Kloppebösegroßes Grinsen
TanzentraurigProst
TeufelSpamWillkommen
LehrerLOL HammerZunge raus
Hilfe 
aktuellen Tag schließen
alle Tags schließen
fettgedruckter Textkursiver Textunterstrichener Text zentrierter Text Hyperlink einfügenE-Mail-Adresse einfügenBild einfügen Zitat einfügenListe erstellen CODE einfügenPHP CODE farbig hervorheben
Spamschutz:
Text aus Bild eingeben
Spamschutz

Die letzten 10 Beiträge
Lars

Daumen hoch
Ok, dann bin ich ja beruhigt.
eulerscheZahl

Ich kam sogar noch rechtzeitig für einen Sitzplatz. Und der Prof kam dann auch noch zuspät, also alles im grünen Bereich großes Grinsen
Lars

Oh mann, ich hoffe du hast deinen Bus noch bekommen, dass du dir hier soviel Mühe machst ist ja echt unglaublich.
Ganz großes Danke meinerseits, ich hab's nach langwährendem Studieren nun verstanden. Wenn ich also irgendwann nochmal Listen sortieren muss werde ich's hinbekommen smile .
Ich werde mich bemühen die nächste Aufgabe mal alleine zu lösen, mir wird's unangenehm, wenn ich dich immer fragen muss ^^.
eulerscheZahl

Sortieren klappt, die Ausgabe darfst du selbst verschönen. Sonst verpasse ich noch den Bus.
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
#include <stdio.h>
#include <stdlib.h>
#include "readline.h"
#include <time.h>

typedef struct person{
	char nameperson[20];
	char Abteilung;
	int TelNr;
	struct person *next;
}Person;
struct person *anfang = NULL;
struct person *sanfang = NULL;

void neuePerson()
{	
	struct person* zeiger;
	if(anfang==NULL){  
		anfang=(Person*)malloc(sizeof(struct person));
		readLine(anfang->nameperson, 20);
		anfang->TelNr=rand()%100;
		anfang->Abteilung = rand() % 3 + 65; 
		anfang->next=NULL;
		}
	else{
		zeiger=anfang;
		while(zeiger->next != NULL) zeiger=zeiger->next;
		if(zeiger->next == NULL){
			zeiger->next=(Person*)malloc(sizeof(struct person));
			zeiger=zeiger->next;
			readLine(zeiger->nameperson, 20);
			zeiger->TelNr=rand()%100;
			zeiger->Abteilung = rand() % 3 + 65; 
			zeiger->next=NULL;
		}
	}
}

void listeAusgeben(Person* p)
{
	struct person* zeiger = p;
	int mitarbeiter = 0;
	printf("Personalpool Firma:\n");
	while(zeiger != NULL){
		printf("name: %s	abteilung: %c	telNr: %i\n",zeiger->nameperson, zeiger->Abteilung, zeiger->TelNr);
		zeiger=zeiger->next;
		mitarbeiter++;
	}
	printf("Personalpool ferig -- Anzahl Mitarbeiter: %d\n", mitarbeiter);	
}

int sortieren() {
	if (anfang == NULL) return 0; //nichts mehr zu machen
	//beim Probeablauf wird immer die letzte Person entfernt
	Person* letzte = anfang;
	Person* vorletzte = NULL;
	while (letzte->next != NULL) {
		vorletzte = letzte;
		letzte = letzte->next;
	}
	if (vorletzte != NULL) vorletzte->next = NULL; //entferne letzten Eintrag aus unsortierter Liste
	if (letzte == anfang) anfang = NULL;
	
	//Hier kommt das Einfügen in die sortierte Liste
	if (sanfang == NULL) sanfang = letzte; //Fall 1: leere Liste
	else {
		if (letzte->Abteilung < sanfang->Abteilung) { //Fall 2.1
			letzte->next = sanfang;
			sanfang = letzte;
		}
		else { //Fall 2.2
			Person* pos = sanfang;
			int eingefuegt = 0;
			while (pos->next != NULL) {
				if (letzte->Abteilung < pos->next->Abteilung) { //Fall 3.1
					letzte->next = pos->next;
					pos->next = letzte;
					eingefuegt = 1;
					break;
				}
				pos = pos->next;
			}
			if (!eingefuegt) { //Fall 4
				pos->next = letzte;
			}
		}
	}	
	return 1; //weiter sortieren
}

int main()
{
	srand (time(NULL)); //srand gehört dahin, nicht nach oben - dann kann man die Eingabe auch von Datei einlesen und rand() liefert nicht immer das selbe
	printf("Bitte im Folgenden 10 Mitarbeiternamen (jeweils mit Enter) eingeben...\n");
	for(int i=0; i<10; i++)neuePerson();
	listeAusgeben(anfang);
	while (sortieren()) {
		printf("==Pool==\n");
		listeAusgeben(anfang);
		printf("==sortiert==\n");
		listeAusgeben(sanfang);
		printf("\n");	
	}
}
Lars

Ok, danke, dann kann ich das hoffentlich wenigstens nachvollziehen.
Ich schau mal wie weit ich noch komme heute.
eulerscheZahl

Heute habe ich keine Lust mehr, das ist keine Sache von 5 Minuten. Ich kann mich morgen mal dransetzen.
Lars

*seufz*
Ich bin ein hoffungsloser Fall traurig .
Das mit dem Einsetzen der einen Listenelemente in die andere Liste klingt ziemlich simpel und ist es wahrscheinlich auch, aber ich krieg's einfach nicht auf die Reihe.

Mir ist das recht unangenehm, aber wenn du gerade nichts zutun hast, kann du mir zeigen, wie genau ich das machen müsste?
Ich denke dann kann ich's wenigstens nachvollziehen...
Ich probier trotzdem nochmal rum, wobei ich nicht glaube, dass das heute nochmal was wird.
Lars

Ah ok, das klingt plausibel. Mal schauen, ob ich jetzt weiter komme.

Unser Tutor meinte auch, dass Skizzen dafür sehr hilfreich sind, man wird ja echt teilweise verrückt, wenn man das alles im Kopf durchgeht smile .
eulerscheZahl

code:
1:
2:
3:
4:
5:
6:
7:
typedef struct sortiert{
	char nameperson[20];
	char Abteilung;
	int TelNr;
	struct sortiert *next;
	struct sortiert *anfang;
}Sortiert;

Das ist kein Unterschied zu Person. also brauchst du diese struct auch nicht. Alles was du damit machen kannst, geht auch mit Person.
Du hast zwei Listen. Nacheinander nimmst du die Personen aus der einen Liste raus und tust sie direkt in die andere rein. Dafür brauchst du kein malloc.

Ach ja: das mal sich bei den Zeigern Skizzen macht um nicht durcheinander zu kommen, ist ganz normal. Mache ich auch manchmal noch.
Lars RE: einfach verkettete Listen in C -Programmhilfe

So, bin gerade wiedergekommen, noch 6h an Zeit das zu Ende zu schreiben, Zeit für den Endspurt.
Ich versteh irgendwie deine ersten 3 Zeile nicht.
Ich brauche also das gesamte struct sortieren nicht? Und ich soll keine neuen personen erstellen sondern einfach die, die ich entferne in die neue Liste übertragen?
Das klingt irgendwie gerade zu abstrakt für mich verwirrt .
Wir hatten Listen erst letzte Woche und das ist bis jetzt das verwirrendste Thema, ich musste mir auch ne Skizze für das Prog. malen, weil ich sonst nicht durchgestiegen bin Zunge raus .
Es sind weitere Beiträge zu diesem Thema vorhanden. Klicken Sie hier, um sich alle Beiträge anzusehen.