コード #include <limits.h> #include <stdio.h> #include <string.h> #include <stdlib.h> #define MAX 10 #define NAME_LEN 20 #define String_Max 80 /*--- 身体データ型 ---*/ typedef struct { int height; /* 身長 */ double vision; /* 視力 */ } Body; /*--- 身体検査データ型 ---*/ typedef struct { char *name; /* 氏名 */ Body body; /* 身体データ型 ---*/ } PhysCheck; /*--- int型キューを実現する構造体 ---*/ typedef struct { int max; /* キューの容量 */ int num; /* 現在の要素*/ int front; /* 先頭要素カーソル*/ int rear; /* 末尾要素のカーソル*/ int **que; /* キュー本体*/ } IntQueue; /*--- 身体検査データ型スタックを実現する構造体 ---*/ typedef struct { int max; /* スキューの容量 */ int ptr; /* 現在の要素*/ int *que; /* スキュー本体*/ } ArraylnQueue; /*--- Boyer-Moore 法による文字列探索 ---*/ char *bm_match(char *pat, char *txt) { char *pt; /* txt をなぞるカーソル */ char *pp; /* pat をなぞるカーソル */ int txt_len = strlen(txt); /* txt の文字数 */ int pat_len = strlen(pat); /* pat の文字数 */ int skip[UCHAR_MAX + 1]; /* スキップテーブル */ int i; for (i = 0; i <= UCHAR_MAX; i++) { skip[i] = pat_len; } for (pp = pat; *pp != '\0'; pp++) { skip[*pp] = strlen(pp) - 1; } skip[*(pp - 1)] = pat_len; /* パターンの最後文字の移動距離はパターンの文字数 */ pt = txt + pat_len - 1; /* pat の末尾と比較する txt の文字を決定 */ while ( pt < txt + txt_len) { /* txt の比較する文字の位置が txt の末尾を越えるまで */ pp = pat + pat_len - 1; /* pat の最後の文字に着目 */ while (*pt == *pp) { if (pp == pat) return pt; /* 一致した文字がパターンの最初の文字になれば終了 */ pp--; pt--; } pt += (skip[*pt] > strlen(pp)) ? skip[*pt] : strlen(pp); } return NULL; } /*---キューの初期化 ---*/ int Initialize(IntQueue *q, int max){ q->num = q->front = q->rear = 0; if((q->que=calloc(max,sizeof(int)))==NULL){ q->max = 0; /* 配列の確保に失敗 */ return -1; } q->max = max; return 0; } /*--- キューの後始末 ---*/ void Terminate(IntQueue *s) { if (s->que != NULL) free(s->que); /* 配列の開放 */ s->max= s->num= s->front= s->rear= 0; } /*--- キューにデータをエンキュー ---*/ int Enque(IntQueue *q, int x){ if (q->num >= q->max) return -1; /* キューは満杯 */ else { q->num++; q->que[q->rear++] = x; if (q->rear == q->max) q->rear = 0; return 0; } } /*--- キューからデータをデキュー---*/ int Deque(IntQueue *q, int *x){ if (q->num <= 0)/* キューは空 */ return -1; else { q->num--; *x = q->que[q->front++]; if (q->front == q->max) q->front = 0; return 0; } } /*--- キューからデータをピーク---*/ int Peek(const IntQueue *q, int *x) { if (q->num <= 0) return -1; *x = q->que[q->front]; return 0; } /*--- キューの容量 ---*/ int Capacity(const ArraylnQueue *q) { return q->max; } /*--- スタックに積まれているデータ数 ---*/ int Size(const ArraylnQueue *q) { return q->ptr; } /*--- 身体検査データを1つ表示 ---*/ void OneDataPrint(const PhysCheck *x) { printf("%-18.18s%4d%5.1f\n", x->name, x->body.height, x->body.vision); } /*--- キューの全データの表示 ---*/ void Print(const IntQueue *q) { int i; for(i = 0; i < q->num; i++) printf("%d",q->que[(i+q->front)%q->max]); putchar('\n'); } /*--- スタックのデータにあるパターンの表示とその数を数える ---*/ int Search(ArraylnQueue *q, char *name) { int i, last, num = 0; char *txt, *pat = name; for (i = 0; i < q->ptr; i++) { /* 底から頂上へ */ txt = q->que[i]->name; **エラー箇所** while ((txt = bm_match(pat, txt)) != NULL) { num++; txt++; last = i; } } if (num > 0) OneDataPrint(q->que[last]); return num; } int main(void) { IntQueue que; if (Initialize(&que, 64) == -1) { puts("キューの生成に失敗しました.\n"); return 1; } while (1) { int menu, num; PhysCheck x; char name[String_Max]; printf("現在のデータ数:%d/%d\n", Size(&que), Capacity(&que)); printf("(1) エンキュー (2) デキュー (3) ピーク (4) 表示 (5)探索 (0) 終了:"); scanf("%d", &menu); if (menu == 0) break; switch (menu) { case 1: /* エンキュー */ printf("名前: "); scanf("%s", name); x.name = name; printf("身長: "); scanf("%d", &(x.body.height)); printf("視力: "); scanf("%lf", &(x.body.vision)); if (Enque(&que, x) == -1) puts("\a エラー:エンキューに失敗しました。\n"); break; case 2: /* デキュー */ if (Deque(&s, &x) == -1) puts("\a エラー:デキューに失敗しました。\n"); else { printf("デキューしたデータは,"); OneDataPrint(&x); } break; case 3: /* ピーク */ if (Peek(&que, &x) == -1) puts("\a エラー:ピークに失敗しました。\n"); else { printf("ピークしたデータは,"); OneDataPrint(&x); } break; case 4: /* 表示 */ Print(&que); break; case 5: /* 検索 */ printf("探す名前:"); scanf("%s", name); if ((num = Search(&que, name)) > 0) { printf("名前に含まれるパターン数は,%d 個です,\n", num); } else { puts("\a エラー:パターンは存在しません。\n "); } break; } } Terminate(&que); return 0; }
動的スタックのプログラムを,動的なキューに変更したプログラムを書きたいのですがエラーでてしまい解決ができません。
回答1件
あなたの回答
tips
プレビュー