Die letzten 10 Beiträge |
Lars |
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
|
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
.
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
.
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
. |
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
.
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
. |
Es sind weitere Beiträge zu diesem Thema vorhanden. Klicken Sie hier, um sich alle Beiträge anzusehen. |
|
|