C/Visual C - Eliminar elementos de un arreglo de cadenas

 
Vista:
sin imagen de perfil
Val: 14
Ha aumentado su posición en 2 puestos en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

Eliminar elementos de un arreglo de cadenas

Publicado por Leih (7 intervenciones) el 28/09/2017 21:24:16
Tengo que comparar dos elementos de un mismo array y si es igual eliminar uno y generar otro array con los elementos repetidos.
Como elimino elementos de un array de cadenas?
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Eliminar elementos de un arreglo de cadenas

Publicado por Chema (234 intervenciones) el 30/09/2017 01:16:33
En las matrices los elementos no se eliminan, se colocan al final y se marcan como NULL.

Un ejemplo, que encuentra elementos repetidos en la matriz.

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
char *alfa[] = {
	"aa","bb","cc","dd","ee","ff","gg",
	"hh","ff","jj","aa",NULL
};
 
int main(void){
	char **s;
	char **raw;
	char **cpr;
	char *pa;
	char *pb;
	cpr = raw = s = alfa;
	while(*s){
		 raw = s++;
		 cpr = s;
		while(*cpr){
			pa = *raw;
			pb = *cpr;
			while(*pa && *pb){
				if(*pb != *pa)
					break;
				pb++;
				pa++;
			}
			if(*pa == 0x0 && *pb ==0x0)
				printf("%s<---iguales--->%s\n", *raw, *cpr);
			cpr++;
		}
	}
 
	return 0;
}
 
int main____(void){
	char **s;
	char **raw;
	char **cpr;
 
	cpr = raw = s = alfa;
	while(*s){
		 raw = s++;
		 cpr = s;
		while(*cpr){
			if(strcmp(*cpr,*raw) == 0)
				printf("%s	%s\n", *raw, *cpr);
			cpr++;
		}
	}
 
	return 0;
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

Eliminar elementos de un arreglo de cadenas

Publicado por Chema (234 intervenciones) el 30/09/2017 11:13:30
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
char *alfa[] = {
	"aa","repe","cc","dd","ee","repe","gg",
	"ee","repe","jj","aa","bb","repe","dd","aa","ee","repe","aa",
	"repe","ee",NULL
};
 
int main(void){
	char **s;
	char **raw;
	char **cpr;
	char *pa;
	char *pb;
	cpr = raw = s = alfa;
	while(*s){
		 raw = s++;
		 cpr = s;
		while(*cpr){
			/*
			*Esta parte se puede sustituir por un simple strcmp,
			*lo realizo con punteros por razones didacticas.
			*/
			pa = *raw;
			pb = *cpr;
			while(*pa && *pb){
				if(*pb != *pa)
					break;
				pb++;
				pa++;
			}
 
			if(*pa == 0x0 && *pb ==0x0){
				printf("%s<---iguales--->%s\n", *raw, *cpr);
				/*
				*Se desplaza el elemento repetido a la ultima
				*posicion de la matriz y se marca como NULL.
				*/
				char **ax;
				char **bx;
				bx = ax = cpr;
				while(*ax){
					bx = ax++;
				}
				*cpr = *bx;
				*bx = NULL;
				/*
				*El elemento repetido esta posicionado al final, pero
				*la matriz contiene el mismo elemento repetido varias
				*veces, se debe continuar en la misma posicion y llevar
				*al final TODOS los elementos repetidos, esa es la razon
				* de este feo y misterioso continue.
				*/
				continue;
			}
			cpr++;
		}
	}
	/*
	*La matriz no debe contener elementos repetidos.
	*Espero que me pongas "nota", yo creo que la solucion que propongo
	* al menos merece un aprobado :-).
	*/
	printf("\nRESULTADO:\n");
	s = alfa;
	while(*s){
		printf("%s\n", *s);
		s++;
	}
 
	return 0;
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

Eliminar elementos de un arreglo de cadenas

Publicado por Chema (234 intervenciones) el 30/09/2017 16:19:07
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
105
/*
*Leo que solicitas guardar en una matriz los elementos repetidos.
*En este ejemplo no se crea una nueva matriz, se usa la misma matriz
*para mostrar los elementos repetidos.
*/
char *alfa[] = {
	"repe","repe","111","2","3","repe","4",
	"5","repe","666","666","7","repe","8","9","0","repe","111",
	"123","88888",NULL
};
 
int main(void){
	char **s;
	char **raw;
	char **cpr;
	char *pa;
	char *pb;
	char **ax;
	char **bx;
	char **end;
	end = cpr = raw = s = alfa;
	bx = ax = alfa;
	/*
	*(end) apunta al final de la matriz
	*/
	while(*end){
		end++;
	}
	while(s < end){
		 raw = s++;
		 cpr = s;
		while(cpr < end){
			/*
			*Esta parte se puede sustituir por un simple strcmp,
			*lo realizo con punteros por razones didacticas.
			*/
			pa = *raw;
			pb = *cpr;
			while(*pa && *pb){
				if(*pb != *pa)
					break;
				pb++;
				pa++;
			}
 
			if(*pa == 0x0 && *pb ==0x0){
				printf("%s<---iguales--->%s\n", *raw, *cpr);
				/*
				*Guardamos posicion repetido
				*/
				pa = *cpr;
				bx = ax = cpr;
				/*
				*hasta el ultimo elemento de la matriz
				*/
				while(ax < end){
					bx = ax++;
				}
				/*
				*Permuta entre la posicion del elemento repetido
				*y la ultima posicion.
				*(bx) apunta a la ultima posicion, (pa) apunta la 
				*posicion del elemento repetido.
				*Se intercambian posiciones.
				*/
				*cpr = *bx;
				*bx  = pa;
 
				end = bx;
				/*
				*El elemento repetido esta posicionado al final, pero
				*la matriz contiene el mismo elemento repetido varias
				*veces, se debe continuar en la misma posicon y posionar
				*al final TODOS los elementos repetidos, esa es la razon
				* de este feo y misterioso continue.
				*/
				continue;
			}
			cpr++;
		}
	}
	/*
	*La matriz no debe contener elementos repetidos.
	*Espero que me pongas "nota", yo creo que la solucion que propongo
	* al menos merece un aprobado :-).
	*/
	printf("\nRESULTADO:\n");
	s = alfa;
	while(s < end){
		printf("%s\n", *s);
		s++;
	}
	/*
	*Elementos repetidos
	*/
	printf("\nREPETIDOS:\n");
	while(*end){
		printf("%s\n", *end);
		end++;
	}
	/*
	*Codificar en C es muy sencillo, lo complicado somos nosotros.
	*/
	return 0;
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 14
Ha aumentado su posición en 2 puestos en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

Eliminar elementos de un arreglo de cadenas

Publicado por Lei (7 intervenciones) el 30/09/2017 19:40:51
Gracias por la ayuda, una ultima duda, que pasaría si los elementos del arreglo son ingresados por el usuario?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Eliminar elementos de un arreglo de cadenas

Publicado por Chema (234 intervenciones) el 01/10/2017 16:53:56
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
/*
*Pulsando dos veces consecutivas la tecla into, se sale de la funcion.
*Esto pretende ser un sencillo ejemplo, no implementa
*Control de errores en limites y tamaños.
*Control de caracteres no assci.
*/
typedef struct DataHead{
	char ptr[1];/*;-)*/
}DataHead;
 
int main(void){
	char *page;
	char *cur;
	char *prev;
	int c;
	int repetead = 0;
	DataHead **head;
	DataHead **tmp;
	DataHead **cpr;
	page = malloc(8192*2);
	head = tmp = (DataHead **)page + 8192;
	cur = page;
 
	while(1){
		*tmp =(DataHead*)cur;
		cur+= (offsetof(DataHead,ptr)); /*;-)*/
		prev = cur;
 
		while((c = getchar()) && c != '\n'){
			*cur++ = c;
		}
 
		if(cur > prev ){
			 *cur++ = 0x0;
			 cpr = head;
			 while(cpr < tmp){/*;-)*/
				 if(strcmp(prev,(*cpr)->ptr) == 0){
						repetead = 1;
						break;
					}
				cpr++;
			}
			if(repetead == 1){
				printf("%s<--REPETIDO-->%s\n", (*cpr)->ptr, prev);
				repetead= 0;
			}else{
				tmp++;
				*tmp = NULL;
			}
		}else{
			break;
		}
	}
 
	*tmp = NULL;
	cpr = head;
	printf("SIN REPETIR\n");
 
	while(*cpr){
		printf("-->%s\n", (*cpr)->ptr);
		cpr++;
	}
 
 
	free(page);
	return 0;
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

Eliminar elementos de un arreglo de cadenas

Publicado por Chema (234 intervenciones) el 01/10/2017 16:54:03
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
/*
*Pulsando dos veces consecutivas la tecla into, se sale de la funcion.
*Esto pretende ser un sencillo ejemplo, no implementa
*Control de errores en limites y tamaños.
*Control de caracteres no assci.
*/
typedef struct DataHead{
	char ptr[1];/*;-)*/
}DataHead;
 
int main(void){
	char *page;
	char *cur;
	char *prev;
	int c;
	int repetead = 0;
	DataHead **head;
	DataHead **tmp;
	DataHead **cpr;
	page = malloc(8192*2);
	head = tmp = (DataHead **)page + 8192;
	cur = page;
 
	while(1){
		*tmp =(DataHead*)cur;
		cur+= (offsetof(DataHead,ptr)); /*;-)*/
		prev = cur;
 
		while((c = getchar()) && c != '\n'){
			*cur++ = c;
		}
 
		if(cur > prev ){
			 *cur++ = 0x0;
			 cpr = head;
			 while(cpr < tmp){/*;-)*/
				 if(strcmp(prev,(*cpr)->ptr) == 0){
						repetead = 1;
						break;
					}
				cpr++;
			}
			if(repetead == 1){
				printf("%s<--REPETIDO-->%s\n", (*cpr)->ptr, prev);
				repetead= 0;
			}else{
				tmp++;
				*tmp = NULL;
			}
		}else{
			break;
		}
	}
 
	*tmp = NULL;
	cpr = head;
	printf("SIN REPETIR\n");
 
	while(*cpr){
		printf("-->%s\n", (*cpr)->ptr);
		cpr++;
	}
 
 
	free(page);
	return 0;
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar