You are on page 1of 5

#include<stdio.

h>
#include <termios.h>
#define MAX 10000

////////////////////////funcion getch
static struct termios old, new;
void initTermios(int echo)
{
tcgetattr(0, &old);
new = old;
new.c_lflag &= ~ICANON;
new.c_lflag &= echo ? ECHO : ~ECHO;
tcsetattr(0, TCSANOW, &new);
}
/* restaura valores i/o*/
void resetTermios(void)
{
tcsetattr(0, TCSANOW, &old);
}
/*lee un caracter de acuerdo si es ocn o sin eco*/
char getch_(int echo)
{
char ch;
initTermios(echo);
ch = getchar();
resetTermios();
return ch;
}
/* lee un caracter sin eco */
char getch(void)
{
return getch_(0);
}
struct lista
{
char dato;
int siguiente;
};
/* lee un caracter con eco */
char getche(void)
{
return getch_(1);
}
void inicializar_libre(struct lista T[MAX],int libre[1])
{
int i;
for(i=0;i<MAX-1;i++)
T[i].siguiente=i+1;
T[i].siguiente=-1;
libre[0]=0;
}

int extraer_celula(struct lista T[MAX],int libre[1])


{
int P;
if(libre[0]== -1)return -1;
else
{ P= libre[0];
libre[0]=T[libre[0]].siguiente;
T[P].siguiente= -1;
return P;
}
}
void llenar_dato(struct lista T[MAX],int libre[1],int L[1],char dato)
{
char c;
c = dato;
int P,aux,aux_1=0;//aux me dira en q posicion debe entrar el nuevo nodo
P=extraer_celula(T,libre);
if(P>=0)
{
//scanf("%c",&(T[P].dato));
T[P].dato=c;
if(L[0]==-1)// si es el primer elemnto q se ingresa
{
T[P].siguiente=L[0];
L[0]= P;}
else{
aux=L[0];

while(aux>=0)
{
aux_1=aux;
aux=T[aux].siguiente;
}
T[P].siguiente=T[aux_1].siguiente;
T[aux_1].siguiente=P;

}
//while((c=getchar())!= '\n');
}
else printf("Error falta memoria\n");
}
void recorrer(struct lista T[MAX],int L[1])
{
int aux=L[0];
while(aux>=0)
{
//puts(T[aux].nombre);
printf("%c",T[aux].dato);
if((aux==0 && T[aux].siguiente==0)==1)break;
aux=T[aux].siguiente;
}

printf("\n");
}
int tamano_lista(struct lista T[MAX],int L[1])
{
int cont=0;
int aux=L[0];
while(aux>=0)
{
//puts(T[aux].nombre);
if((aux==0 && T[aux].siguiente==0)==1)break;
cont++;
aux=T[aux].siguiente;
}
return cont;

}
void comparar(struct lista T[MAX],int L[1],int H[1])
{int i;
int aux=L[0];
int aux_1=L[0];
int aux2=H[0];
int tamano_listaH;
int ocurrencias =0;
int contador=0;
int contador2=0;
int flag=0;
int contador3=0;
int posiciones[100]={-1};
tamano_listaH = tamano_lista(T,H);
while(aux>=0)
{
aux_1=aux;
{
while(aux2>=0 && aux_1>=0)
{ if(aux2==H[0])posiciones[contador]=aux_1;
if(T[aux_1].dato != T[aux2].dato)break;
else {aux2=T[aux2].siguiente;
aux_1=T[aux_1].siguiente;
}}
if(aux2<0){ocurrencias++;contador++;}
else posiciones[contador]= -1;
aux2=H[0];
aux=T[aux].siguiente;
}

int aux3=L[0];
while(aux3>=0)
{
//puts(T[aux].nombre);
if(aux3==posiciones[contador2])flag=1;
if(flag==1){ printf("\x1b[31m""%c""\x1b[0m",T[aux3].dato);contador3++;}
else
printf("%c",T[aux3].dato);
if(contador3==tamano_listaH){flag=0;contador3=0;contador2++;}
if((aux3==0 && T[aux3].siguiente==0)==1)break;
aux3=T[aux3].siguiente;
}
printf("\n");
printf("ocurrencias = %d\n",ocurrencias);
}
void eliminar(struct lista T[MAX],int libre[1],int L[1])
{
int aux=L[0];
while(aux>=0)
{
//puts(T[aux].nombre);
if(T[T[aux].siguiente].siguiente == -1)break;
if((aux==0 && T[aux].siguiente==0)==1)break;
aux=T[aux].siguiente;
}
T[T[aux].siguiente].siguiente=libre[0];
libre[0]=T[aux].siguiente;
T[aux].siguiente = -1;

int main(){
int i;
int libre[1];
int L[1]= {-1};
int H[1]= {-1};
H[0]=-1;
char caracter;
//L[0]=-1;
int aux;

struct lista T[MAX];


inicializar_libre(T,libre);
/**************/ //llenado en la lista
do{
caracter =getch();
if(caracter == 127){printf("\b \b");eliminar(T,libre,L);}
else if(caracter != 27)printf("%c",caracter);
if(caracter!=27 && caracter != 127) llenar_dato(T,libre,L,caracter);
}while(caracter!=27);
printf("\n");
/********************/ // fin de llenado

printf("Ingrese texto a buscar: \n");


do{
caracter =getch();
if(caracter == 127){printf("\b \b");eliminar(T,libre,H);}
else if(caracter != '\n')printf("%c",caracter);
if(caracter!='\n'&& caracter !=127) llenar_dato(T,libre,H,caracter);
}while(caracter!='\n');
printf("\n");
comparar(T,L,H);
return 0;}

You might also like