前提・実現したいこと
二分探索で配列を使ったデータの保存と探索を行う。
発生している問題・エラーメッセージ
標準入力で次々にデータを入力していきたいのですが、1つ入力が終わると実行が止まってしまいます。
該当のソースコード
少し長いですが、、、
c言語です。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//* データのを保存する配列のサイズとidの保存先の配列のサイズ
#define TABLE_SIZE 1000000
#define MAX_CHAR 10000000
//* データの構造
struct item{char *id; int info;};
struct item table[TABLE_SIZE];
//* データ数
int count;
int char_top = 0;
char char_heap[MAX_CHAR];
//* idの保存
char *save_string(char *s){
int result;
result = char_top;
for(;;){
if(char_top >= MAX_CHAR){
printf("string buffer overflow\n");
exit(1);
}
char_heap[char_top] = *s;
char_top++;
if(*s == 0)
break;
s++;
}
return(&char_heap[result]);
}
//* 初期化
void initialize_table(void){
count = 0;
}
//* 二分探索によるデータの挿入
void insert_table(char *id, int info){
int lo, hi, mid;
int i;
struct item tmp;
if(count >= TABLE_SIZE){
printf("overflow\n");
exit(1);
}
char char_heap1 = save_string(id);
// 一回目の挿入
if(count == 0){
table[0].id = char_heap1;
table[0].info = info;
count++;
}
lo = 0;
hi = count - 1;
while(lo <= hi){
mid = (lo + hi) / 2;
if(strcmp(id, table[mid].id) < 0)
hi = mid - 1;
else
lo = mid + 1;
}
if(hi >= 0 && strcmp(id, table[hi].id) == 0)
exit(1);
else if(hi >= 0 && strcmp(id, table[hi].id) < 0){
tmp = table[hi];
table[hi].id = char_heap1;
table[hi].info = info;
count++;
for(i = count-1; i > hi+1; i--)
table[i]= table[i-1];
table[i] = tmp;
}
else if(hi >= 0 && strcmp(id, table[hi].id) > 0){
tmp = table[hi+1];
table[hi+1].id = char_heap1;
table[hi+1].info = info;
count++;
for(i = count-1; i > hi+2; i--)
table[i] = table[i-1];
table[i] = tmp;
}
}
//* データの探索
int search_table(char *id){
int lo, hi, mid;
lo = 0;
hi = count - 1;
while(lo <= hi){
mid = (lo + hi) / 2;
if(strcmp(id, table[mid].id) < 0)
hi = mid - 1;
else
lo = mid + 1;
}
if(hi >= 0 && strcmp(id, table[hi].id) == 0)
return (hi);
else
return (-1);
}
int main(void){
int t;
char command[100], name[100];
int year;
initialize_table();
for(;;){
if(scanf("%s %s", command, name) == EOF)
break;
if(command[0] == 'I'){
t = search_table(name);
if(t == -1){
scanf("%d", &year);
insert_table(name, year);
}
else
printf("The name has already been registered\n");
}
else if(command[0] == 'S'){
t = search_table(name);
if(t == -1)
printf("not found.\n");
else
printf("%d\n", table[t].info);
}
}
return 0;
}
回答2件
あなたの回答
tips
プレビュー