Problemas comunes de inversión en estructuras de datos [C/C++]


prefacio

Cuando reviso estructuras de datos y algoritmos, a menudo me encuentro con problemas de inversión. Ya sea la inversión de números o la inversión de cadenas o incluso listas secuenciales, tengo que pensar en ello durante mucho tiempo para mi cabeza de olmo. ¡Registra tu propio proceso de pensamiento aquí y deja una profunda impresión en tu mente!


1 por el inverso de un número

1.1 La idea de generar números en orden inverso

Suponiendo que el número que se va a invertir es num, puede tomar el resto de num de 10 cada vez, y el número restante son los unos, luego dividir num por 10 para eliminar los unos y generar cada vez en secuencia, puede obtener la salida en orden inverso a cada número de un dígito. Multiplique cada dígito por diez en el bucle para obtener el resultado del número en orden inverso.

1.2 El código es el siguiente

void ReverseNum() {
    
    
	unsigned long num = 0;
	unsigned long result = 0;
	int a = 0;
	printf("输入要逆置的数字\n");
	scanf("%u", &num);

	unsigned long tmp = num;
	while (tmp > 0) {
    
    
		a = tmp % 10;
		tmp = tmp / 10;
		result = result * 10 + a;
	}
	printf("逆置后的数字为:%u\n", result);
}

1.3 Resultados de la prueba

inserte la descripción de la imagen aquí

Nota: Aquí, se utilizan entradas y salidas de enteros largos sin signo, el rango es 0~(2^32-1)<32 bits> o 0~(2^64-1)<64 bits>, y %u se utiliza para entrada y salida.

Aquí nuevamente revise la longitud de cada carácter.
Compilador de 64 bits
char: 1 byte
char* (variable de puntero): 8 bytes (el espacio de direccionamiento de 64 bits es 2^64, es decir, 64 bits, es decir, 8 bytes). int corto: 2 bytes int:
4
bytes
int sin signo: 4 bytes
flotante: 4 bytes
doble: 8 bytes
largo: 8 bytes largo largo
: 8 bytes
sin signo largo: 8 bytes

Compilador de 32 bits
char: 1 byte
char* (variable de puntero): 4 bytes
short int: 2 bytes
int: 4 bytes
unsigned int: 4 bytes
float: 4 bytes
double: 8 bytes
long: 4 bytes
long long: 8 bytes
unsigned long : 4 bytes

Flotante variable de coma flotante
:
1 bit (bit de signo) 8 bits (bit de exponente) 23 bits (bit de mantisa)
doble:
1 bit (bit de signo) 11 bits (bit de exponente) 52 bits (bit de mantisa)


2 Para la salida en orden inverso de la cadena

2.1 La idea de generar cadenas en orden inverso

Si la cadena de caracteres de una sola línea se almacena en una matriz de tipo char, la matriz se puede intercambiar antes y después.
Si es un elemento de varias líneas, se puede usar una matriz bidimensional para almacenarlo, use n para guardar el número de líneas, use scanf para ingresar y use getchar para eliminar el retorno de carro. Use gets_s() para leer el búfer.
Si es una cadena de tipo cadena, se puede usar un iterador inverso.

2.2 El código específico para guardar una cadena de una sola línea en una matriz de tipo char

Gracias @¡El clima es bueno !

//逆置字符串保存在char类型数组中的具体代码
void ReverseCharArray() {
    
    
	char arr[100] = {
    
     0 };
	gets_s(arr);

	int len = strlen(arr);
	int low = 0;
	int high = len - 1;
	while (low < high) {
    
    
		char tmp = 0;
		tmp = arr[low];
		arr[low] = arr[high];
		arr[high] = arr[low];
		low++;
		high--;
	}
	printf("%s\n", arr);
}

2.2.1 Resultados de la prueba de cadena de una sola línea

inserte la descripción de la imagen aquí
En lenguaje c, puede usar gets_s(arr) o scanf(“%[^\n]”, arr) para omitir espacios

2.3 La cadena son varias líneas de código específico

void ReverseMultiString() {
    
    
	printf("输入多行的行数\n");
	int n = 0;
	scanf("%d", &n);
	getchar();
	char** a = (char**)calloc(sizeof(char*), n);
	char tmp[50] = {
    
     0 };
	printf("请输入字符串\n");
	for (int i = 0; i < n; i++) {
    
    
		a[i] = (char*)calloc(sizeof(char), 50);
		gets_s(tmp);
		int len = strlen(tmp);
		for (int j = 0; j < len; j++) {
    
    
			a[i][len - j - 1] = tmp[j];
		}
	}
	printf("逆置后字符串为\n");
	for (int i = 0; i < n; i++) {
    
    
		printf("%s\n", a[i]);
	}

	//二维数组的释放
	for (int i = 0; i < n; i++) {
    
    
		if (a[i] != NULL) {
    
    
			free(a[i]);
			a[i] = NULL;
		}
	}
	if (a != NULL) {
    
    
		free(a);
		a = NULL;
	}
}

2.3.1 Resultados de la prueba de cadenas multilínea

Las cadenas de varias líneas también se pueden aplicar a cadenas de una sola línea
inserte la descripción de la imagen aquí
Probar cadenas de varias líneas
inserte la descripción de la imagen aquí

Tres puntos a los que prestar atención:
1. Debido a que scanf se usa para la entrada del número de líneas n, y está determinado por el retorno de carro, habrá un retorno de carro adicional en el búfer, que getchar debe leer ().
2. Preste atención a la configuración del tamaño del arreglo de la matriz de búfer, si es demasiado pequeño, se informará un error.
3. Tenga en cuenta que la liberación de la matriz bidimensional debe comenzar desde el interior, es decir, el puntero de primer nivel a[i], y luego ir al puntero de segundo nivel de nivel exterior a.

2.4 El código específico de inversión de cadenas de tipo String

En C++, hay un iterador inverso para el contenedor String, por lo que es extremadamente conveniente.
El código aquí también usa flujos de entrada y salida de C++.

void ReverseContainerString(){
    
    
	string str;
	getline(cin,str);
	string s(str.rbegin(), str.rend());
	cout << s << endl;
	return;
}

2.4.1 Resultados de la prueba de cadenas

inserte la descripción de la imagen aquí


3 Para inversión de tabla de secuencia

Invertir una tabla de secuencia es similar a invertir una matriz.
La tabla de secuencia utilizada aquí es la estructura de la tabla de secuencia del Sr. Geng Guohua

typedef struct SEQLIST {
    
    
	ElemType data[MAX];
	int last;//最后一个元素的下标,初始值为-1;
}SeqList;

3.1 Código específico para inversión de tabla de secuencia

void ReverseSeqList(SeqList* L) {
    
    
	int low = 0;
	int high = L->last;
	while (low < high) {
    
    
		int tmp = 0;
		tmp = L->data[low];
		L->data[low] = L->data[high];
		L->data[high] = tmp;
		low++;
		high--;
	}
}

3.2 Resultados de la prueba de inversión de la tabla de secuencias

inserte la descripción de la imagen aquí


4 Para la inversión de la lista enlazada

La lista enlazada utilizada aquí es la estructura de lista enlazada del Sr. Geng Guohua

typedef struct LINKNODE {
    
    
	ElemType data;
	struct LINKNODE* next;
}LinkNode, * LinkList;

4.1 El código específico para la inversión in situ de la lista enlazada

void ReverseLinkList(LinkList L) {
    
    
	if (L == NULL) {
    
    
		return;
	}
	LinkNode* p = L->next;
	L->next = NULL;
	while (p != NULL) {
    
    
		LinkNode* q = p->next;
		p->next = L->next;
		L->next = p;
		p = q;
	}
}

4.2 Lista enlazada de resultados de la prueba de inversión in situ

inserte la descripción de la imagen aquí


epílogo

Puedo pensar en tantas inversiones ahora, si hay otros métodos, los agregaré más tarde, ¡gracias a todos!

Supongo que te gusta

Origin blog.csdn.net/qq_45400167/article/details/126574330
Recomendado
Clasificación