struct data *next;とあるので次の構造体のアドレスを指して様になっているとしました。また最後のnextにはNULLが入ると想定しています。
ファイルよりリストを作成してみました。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUFSIZE 128
#define DATASIZE 1000
struct data {
char mail[256]; //メールアドレス
char name[256]; //氏名
int number; //グループの番号
int ID; //登録された人のID
struct data *next;
};
struct data ad[DATASIZE];
int search_main(struct data *ap, int cnt){
char buf[BUFSIZE]; //検索する名前を格納
int j = 0;
int count = 0; //検索で該当した人数
struct data *t = ap;
char b[256], *p, *r; //部分一致検索で使用
printf("名前で検索します\n名前を入力してください:");
int ln;
fgets(buf, sizeof buf, stdin);
ln = strlen(buf);
buf[ln-1]='\0';
p = buf;
while(1){
printf("%sを部分一致検索します\n", buf);
if ((r = strstr(t->name, p)) != NULL){
printf("メールアドレス:%s\n氏名:%s\nnumber:%d\nID:%d\n",t->mail, t->name, t->number, t->ID);
count++;
}
if (t->next == NULL) break;
t = t->next;
}
printf("%d件見つかりました。\n", count);
return cnt;
}
void main(void){
FILE *fp; /*ファイルポインタ*/
char line[256];
struct data *p;
struct data *q;
struct data *root;
root = (struct data *)calloc(sizeof(struct data), sizeof(char));
int cnt=1;
p = root;
fp = fopen("test.txt","r");
while((fscanf(fp,"%s%s%d%d",p->mail,p->name,&p->number,&p->ID)) !=EOF){
cnt++;
p->next = (struct data *)calloc(sizeof(struct data), sizeof(char));
q = p;
p = p->next;
}
free(p);
cnt--;
q->next = NULL;
p = root;
while (p->next != NULL){
printf("%s %s %d %d \n",p->mail,p->name,p->number,p->ID);
p=p->next;
}
printf("%s %s %d %d \n",p->mail,p->name,p->number,p->ID);
fclose(fp);
search_main(root, cnt);
}
ファイルtest.txt
file
1hoge1@aaa.bbb suzuki.ichirou 1 10
2hoge2@aaa.bbb suzuki.jiro 2 20
3hoge3@aaa.bbb suzuki.saburo 3 30
4hoge4@aaa.bbb suzuki.shiro 4 40
5hoge5@aaa.bbb suzuki.goro,5 50 0
6hoge6@aaa.bbb suzuki.rokuro 6 60
7hoge7@aaa.bbb suzuki.shichiro 7 70