//Copyright 2004 @ Matthias Jauernig
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_CH 500

typedef struct ELEMENT {
    struct ELEMENT *next;
    char *zeichenkette;
} element;

element *einfuegen(const char*, element*);
void ausgabe(element*);
void durchmustern(element*, const char*);
char my_strfind(const char*, const char*);

int main(int argc, char **argv){
    char tmp[MAX_CH];
    element *akt, *kopf=NULL;
   
    if(argc==1){
        printf("Beim Aufruf bitte den zu suchenden String angeben!\n\n");
        return 1;
    }   
   
    while(fgets(tmp,MAX_CH,stdin)!=NULL){
        tmp[strlen(tmp)-1]='\0';
        if(kopf==NULL){
            kopf=einfuegen(tmp,kopf);
            akt=kopf;
        }   
        else
            akt=einfuegen(tmp,akt);
    }   
   
    ausgabe(kopf);
    durchmustern(kopf,argv[1]);
   
    return 0;   
}

element *einfuegen(const char *tmp, element *akt){
    element *neu=(element*)malloc(sizeof(element));
    neu->zeichenkette=(char*)malloc((strlen(tmp)+1)*sizeof(char));
    strncpy(neu->zeichenkette,tmp,strlen(tmp)+1);
   
    neu->next=NULL;
    if(akt!=NULL)  akt->next=neu;
    return neu;
}

void ausgabe(element *akt){
    printf("\nsequentielle Ausgabe:\n");
    while(akt){
        printf("%s\n",akt->zeichenkette);
        akt=akt->next;
    }
    printf("\n");   
}

void durchmustern(element *akt, const char *zk){
    int listenelement=1;
   
    printf("\"%s\" gefunden in:\n",zk);
    while(akt){
        if(my_strfind(akt->zeichenkette,zk))
                printf("Zeile %3d: %s\n",listenelement,akt->zeichenkette);
        listenelement++;
        akt=akt->next;
    }
}

char my_strfind(const char *orig, const char *teil){
    int i=0,j=0;
   
    while(i<strlen(orig) && j<strlen(teil))
        if(orig[i++]!=teil[j++])
            j=0;
   
    if(j==strlen(teil))
        return 1;
    return 0;
} 

