C语言 不递归的二分查找

wwwo4jvm  于 2022-12-03  发布在  其他
关注(0)|答案(1)|浏览(135)

我正在写记录和非递归二进制搜索的代码。我在使用二进制搜索时遇到了问题,因为当我尝试这样做时,打印值 未正确接收到我的命令(数组已排序),并且我不知道可能存在什么错误

#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void registro();
void consultaprestamo();

struct datos {
  int numprestamo;
  char nombre[10];
  char direccion[10];
  int telefono;
  int importesoli;
}
datos[10];

int x = 0;
char busqueda;

char auxn[10];
int j, k, aux;

int inf, sup, mit, dato, n = 20;
int nucontrol;

int main(void) {
  char opcion;

  do {
    printf("A) people registration\n");
    printf("D) Specific consultation for loans\n");
    printf("F)exit\n");
    printf("Opcion: ");
    scanf("%s", &opcion);

    switch (opcion) {
        case 'A':
          registro();
          break;

        case 'D':
          consultaprestamo();
          break;
    }
  } while (opcion != 'F');

}

记录数据

void registro() {
  char continuar;

  do {
    printf("\n*****************\n");
    printf("Loan number: ");
    scanf("%d", & datos[x].numprestamo);
    printf("Name: ");
    scanf("%s", datos[x].nombre);
    printf("adress: ");
    scanf("%s", datos[x].direccion);
    printf("number phone: ");
    scanf("%d", & datos[x].telefono);
    printf("Amount requested: ");
    scanf("%d", & datos[x].importesoli);
    x++;

    printf("Enter another record? y/n: ");
    scanf("%s", &continuar);

  } while (continuar != 'n');

}

二分查找

void consultaprestamo() {

  for (k = 1; k < x; k++) {
    for (j = 0; j < x - 1; j++) {
      if (datos[j].numprestamo > datos[j + 1].numprestamo) {

        aux = datos[j].numprestamo;
        datos[j].numprestamo = datos[j + 1].numprestamo;
        datos[j + 1].numprestamo = aux;

        aux = datos[j].telefono;
        datos[j].telefono = datos[j + 1].telefono;
        datos[j + 1].telefono = aux;

        aux = datos[j].importesoli;
        datos[j].importesoli = datos[j + 1].importesoli;
        datos[j + 1].importesoli = aux;

        strcpy(auxn, datos[j].nombre);
        strcpy(datos[j].nombre, datos[j + 1].nombre);
        strcpy(datos[j + 1].nombre, auxn);

        strcpy(auxn, datos[j].direccion);
        strcpy(datos[j].direccion, datos[j + 1].direccion);
        strcpy(datos[j + 1].direccion, auxn);

      }
    }
  }
  for (j = 0; j < x; j++) {
    printf("loan number: %d\n", datos[j].numprestamo);
    printf("phone number: %d\n", datos[j].telefono);
    printf("Import requested: %d\n", datos[j].importesoli);
    printf("\nName: %s\n", datos[j].nombre);
    printf("adress: %s\n", datos[j].direccion);
  }

  inf = 0;
  sup = j;

  printf("write the number control");
  scanf("%d", & nucontrol);

  while (inf <= sup) {
    mit = (inf + sup) / 2;
    if (datos[mit].numprestamo == nucontrol) {

      printf("dato %d encontrado posicion %d\n", nucontrol, mit);
      printf("loan number: %d\n", datos[j].numprestamo);
      printf("phone number: %d\n", datos[j].telefono);
      printf("Import requested: %d\n", datos[j].importesoli);
      printf("\nName: %s\n", datos[j].nombre);
      printf("adress: %s\n", datos[j].direccion);

      break;
    }
    if (datos[mit].numprestamo > nucontrol) {
      sup = mit;
      mit = (inf + sup) / 2;
    }
    if (datos[mit].numprestamo < nucontrol) {
      inf = mit;
      mit = (inf + sup) / 2;
    }

  }

}

我试着用有序数组的for嵌套while,但我做不到,我还试着对变量做了几次更改。

nlejzf6q

nlejzf6q1#

当试图查找不存在的元素时,您的代码将导致无限循环。请尝试以下操作:

// Always let inf indexs to first element and sup to last element after each loop
inf = 0;
sup = x - 1;
while (inf <= sup) {
    mit = (inf + sup) / 2;
    if (datos[mit].numprestamo == nucontrol) {
        // printf ...
        break;
    } else if (datos[mit].numprestamo > nucontrol) {
        sup = mit - 1;
    }  else {
        inf = mit + 1;
    }
}
*/

相关问题