C Funktionen zum arbeiten mit Listen

Wenn du C am besten kannst, dann mach es halt in C (Auch wenn Lisp das viel besser kann).

Eine einfache Listenstruktur ist schnell mit einem typedef gemacht. :E
 
Ja, zuerst such ich mir mal meine Algorithmen zusammen, die ich verwenden werde um das mit dem Suchen möglichst gut hinzubekommen.
Meint ihr dann, dass es Arrays doch tun und eine Datenbank zuviel Aufwand ist?
 
mir fallen die Funktionen qsort() und bsearch() ein. Für die Elemente einen Typen und ein Array definieren

Code:
typedef struct {
  T1 e1_; T2 e2_; T3 e3_; T4 e4_; T5 e5_;
} ElementT;

#define MAX_N 5000
ElementT g_data[MAX_N]

Du kannst dann das Array beliebig füllen. Die Funktion bsearch() sucht mittels binärer Suche im Array (bei 5000 Einträge max. 13 Vergleiche) setzt dabei allerdings ein sortiertes Array voraus. Das kannst du mittels qsort() machen. Die Funktionen benötigen Funktionspointer für die Vergleichsfunktion. Die Vergleichsfunktion könnte in etwa so aussehen:

Code:
int compare_element(void* key, void* val) {
   ElementT* x = (ElementT*)key;
   ElementT* y = (ElementT*)val;
   /* Result ist 
       < 0 wenn *x < *y 
       == 0 wenn *x == *y
       > 0 wenn *x > *y
    
  */
}

Nach Eintragen von zB. m-Einträgen wird die Sotierung der Einträge 0..(m-1) erreicht mittels

Code:
  qsort(g_data, m, sizeof(ElementT), compare_element);


Das Suchen nach einen bestimmten key Element mittels:
Code:
  void* p = qsort(key, g_data, m, sizeof(ElementT), compare_element);
  if(p) {
    /* found */
    ElementT* x = (ElementT*)p;
  }
  else
    /* not found */

Hoffe es hilft.
 
Danke, werde mir das mal in Ruhe anschaun.
Habe jetzt mal Probeweise eine Datei mit 5000 Zeilen eingelesen und jede Zeile nach dem Wort "test" durchsucht.
Jede Zeile, in der das Wort gefunden wurde habe ich mir ausgeben lassen. Das ganze geht viel schneller, als ich dachte. Werde darauf aufbauen. Danke für eure Hilfe!
Falls es jemand interessiert, hier der Code
Code:
int main(void){
	char datArray[5000][50];
	char str[] = "test";
	int x;
	int found = 0;
	FILE *fp;
	int max = 5000;

	fp = fopen("5000.txt", "r");

	for(x = 0; x < max; x++){
		fgets(datArray[x], 50, fp);
	}
	fclose(fp);

	for(x = 0; x < max; x++){
		if(strstr(datArray[x], str) != NULL){
			found++;
			printf("%s",datArray[x]);
		}
	}
	
	printf("\n%i gefunden\n", found);

	getchar();
	return 0;
}
 
sequentielle suche ist pfui ;) versuchs mal mit 500.000 zeilen, dann siehts mit dem speed schon etwas anders aus.
 
IceMatrix schrieb:
sequentielle suche ist pfui ;) versuchs mal mit 500.000 zeilen, dann siehts mit dem speed schon etwas anders aus.

Aber 500.000 Zeilen habe ich zum Glück nicht ^^
Ich denke für meine Zwecke reicht der Speed und es wäre mir jetzt zuviel Aufwand mit SQLite anzufangen. Sollte es irgendwann mal doch nicht mehr gehen, weil die Daten zu groß werden, werde ich mich mit dem Problem nochmal befassen.
Habe jetzt auch eine funktionierende "Autovervollständigung" :)

Danke an alle für die Hilfe
 
Zurück
Oben