コード:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define BUFSIZE 1000
typedef struct lst {
struct lst *next;
char name[BUFSIZE];
char score[BUFSIZE];
}LIST;
LIST *newList(LIST *start, char *string1, char *string2){
LIST *p=start;
LIST *new;
while(p->next!=NULL){
p=p->next;
}
if((new = (LIST *)malloc(sizeof(LIST)))==NULL){
fprintf(stderr,"Can't allocate memory!\n");
exit(-1);
}
p->next = new;
strcpy(new->name, string1);
strcpy(new->score, string2);
new->next = NULL;
return new;
}
LIST *delList(LIST *start, char *target){
LIST *p=start;
LIST *tmp;
if(!strcmp(p->name, target)){
tmp=p;
p=p->next;
free(tmp);
}else{
while(p->next!=NULL){
if(!strcmp((p->next)->name, target)){
tmp=p->next;
p->next = p->next->next;
free(tmp);
break;
}else{
p=p->next;
}
}
p=start;
}
return p;
}
LIST *searchList(LIST *start, char *target)
{
LIST *p=start;
while(p!=NULL){
if(!strcmp(p->name, target)){
return p;
}
else{
p=p->next;
}
}
return NULL;
}
LIST *listfree(LIST *start)
{
LIST *tmp;
while(start!=NULL){
tmp=start;
start=start->next;
free(tmp);
}
return start;
}
void printList(LIST *init)
{
LIST *p=init;
while(p->next!=NULL){
printf("%s\n",p->name);
printf("%s\n",p->score);
p=p->next;
}
printf("%s\n",p->name);
printf("%s\n",p->score);
}
void correction(LIST *t)
{
LIST *p=t;
char cor[BUFSIZE];
printf("何点に訂正しますか?\n");
scanf("%s",cor);
strcpy(p->score,cor);
}
void printregister(LIST *init){
LIST *p=init;
if(p==NULL){
printf("LIST IS EMPTY\n");
exit(1);
}
while(p->next!=NULL){
p=p->next;
}
printf("名前\n");
printf("%s\n",p->name);
printf("点数\n");
printf("%s\n",p->score);
printf("で登録しました。\n");
}
void writefile(FILE *fp, LIST *init)
{
LIST *p=init;
while(p!=NULL){
fputs(p->name, fp);
fputs(" ", fp);
putc(',', fp);
fputs(" ", fp);
fputs(p->score, fp);
putc('\n',fp);
p=p->next;
}
}
void inputdate(LIST *init){
LIST *p=init;
char n[BUFSIZE];
char s[BUFSIZE];
printf("名前をを入力してください。\n");
scanf("%s", n);
if(searchList(p,n)!=NULL){
printf("すでに登録されている名前です。\n");
exit(1);
}
printf("得点を入力してください。\n");
scanf("%s", s);
if(p->name[0]=='\0'){
strcpy(p->name,n);
strcpy(p->score,s);
}
else{
newList(p,n,s);
}
printregister(p);
}
void readfile(FILE *fp, LIST *init)
{
LIST *p = init;
char n[BUFSIZE]={'\0'};
char s[BUFSIZE]={'\0'};
char c[BUFSIZE]={'\0'};
fscanf( fp , "%s%s%s" , n , c, s);
strcpy(p->name, n);
strcpy(p->score,s);
while((fscanf( fp , "%s%s%s" , n, c, s))!= EOF ) {
newList(p,n,s);
}
}
LIST *scoresort(LIST *start)
{
LIST *ssort;
LIST *a=start;
LIST *b=start;
LIST *min;
int i;
int count=1;
char s1[BUFSIZE]={'\0'};
char s2[BUFSIZE]={'\0'};
if(start==NULL || start->next==NULL){
printf("整列する必要がありません。\n");
exit(1);
}
if((ssort = (LIST*)malloc(sizeof(LIST)))==NULL){
fprintf(stderr,"Can't allocate memory!\n");
exit(-1);
}
ssort->next=NULL;
while(a->next!=NULL){
count++;
a=a->next;
}
for(i=0;i<count;i++){
min=b;
while(searchList(ssort,min->name)!=NULL){
b=b->next;
min=b;
}
while(b->next!=NULL){
strcpy(s1,min->score);
strcpy(s2,b->next->score);
if(atoi(s1)>atoi(s2)){
if(searchList(ssort,(b->next)->name)==NULL){
min=b->next;
}
}
b=b->next;
}
if(i==0){
strcpy(ssort->name,min->name);
strcpy(ssort->score,min->score);
}
else{
newList(ssort,min->name,min->score);
}
b=start;
}
return ssort;
}
LIST *namesort(LIST *start)
{
LIST *nsort;
LIST *a=start;
LIST *b=start;
LIST *min;
int i;
int j=1;
int count=1;
if(start==NULL || start->next==NULL){
printf("整列する必要がありません。\n");
exit(1);
}
if((nsort = (LIST*)malloc(sizeof(LIST)))==NULL){
fprintf(stderr,"Can't allocate memory!\n");
exit(-1);
}
nsort->next=NULL;
while(a->next!=NULL){
count++;
a=a->next;
}
for(i=0;i<count;i++){
min=b;
while(searchList(nsort,min->name)!=NULL){
b=b->next;
min=b;
}
while(b->next!=NULL){
if(min->name[0]==(b->next)->name[0]){
while(min->name[j]!='\0' && (b->next)->name!='\0'){
if(min->name[j]>(b->next)->name[j]){
if(searchList(nsort,(b->next)->name)==NULL){
min=b->next;
}
break;
}
j++;
}
}
else if(min->name[0] > (b->next)->name[0]){
if(searchList(nsort,(b->next)->name)==NULL){
min=b->next;
}
}
b=b->next;
j=1;
}
if(i==0){
strcpy(nsort->name,min->name);
strcpy(nsort->score,min->score);
}
else{
newList(nsort,min->name,min->score);
}
b=start;
}
return nsort;
}
int main (int argc, char *argv[])
{
LIST *init;
LIST *s;
LIST *nsort;
LIST *ssort;
FILE *fp;
int num;
int ss;
char target[BUFSIZE];
if((init = (LIST*)malloc(sizeof(LIST)))==NULL){
fprintf(stderr,"Can't allocate memory!\n");
exit(-1);
}
init->next=NULL;
if(argc >1){
if((fp = fopen(argv[1], "r")) == NULL){
printf("file open error!!\n");
exit(1);
}
}
readfile(fp,init);
fclose (fp);
printf("データベース\n");
printList(init);
printf("何を実行しますか?\n");
printf("1.登録\n");
printf("2.訂正\n");
printf("3.削除\n");
printf("4.検索\n");
printf("5.整列\n");
printf("番号を入力してください。\n");
scanf("%d",&num);
while(num<1 || num>5){
printf("1~5の数字を入力してください。\n");
scanf("%d",&num);
}
switch(num){
case 1:
inputdate(init);
if((fp = fopen(argv[1], "w")) == NULL){
printf("file open error!!\n");
exit(1);
}
writefile(fp,init);
fclose(fp);
break;
case 2:
printf("点数を訂正したい人の名前を入力してください。\n");
scanf("%s",target);
if(searchList(init,target)!=NULL){
correction(searchList(init,target));
if((fp = fopen(argv[1], "w")) == NULL){
printf("file open error!!\n");
exit(1);
}
writefile(fp,init);
fclose(fp);
printf("訂正が完了しました。\n");
}
else{
printf("データベースにない名前です。\n");
exit(1);
}
break;
case 3:
printf("削除したい人の名前を入力してください。\n");
scanf("%s",target);
if(searchList(init,target)!=NULL){
init=delList(init,target);
printf("削除が完了しました。\n");
if((fp = fopen(argv[1], "w")) == NULL){
printf("file open error!!\n");
exit(1);
}
writefile(fp,init);
fclose(fp);
}
else{
printf("データベースにない名前です。\n");
exit(1);
}
break;
case 4:
printf("検索したい人の名前を入力してください\n");
scanf("%s",target);
if((s=searchList(init,target))!=NULL){
printf("%sの点数は%sです。\n",s->name,s->score);
}
else{
printf("データベースにない名前です。\n");
exit(1);
}
break;
case 5:
printf("何順に整列しますか?\n");
printf("1.名前\n");
printf("2.点数\n");
printf("番号を入力してください。\n");
scanf("%d",&ss);
while(ss<1 || ss>2){
printf("1~2の数字を入力してください。\n");
scanf("%d",&ss);
}
switch(ss){
case 1:
nsort=namesort(init);
init=nsort;
if((fp = fopen(argv[1], "w")) == NULL){
printf("file open error!!\n");
exit(1);
}
writefile(fp,init);
fclose(fp);
printf("名前順に整列しました。\n");
nsort=listfree(nsort);
break;
case 2:
ssort=scoresort(init);
init=ssort;
if((fp = fopen(argv[1], "w")) == NULL){
printf("file open error!!\n");
exit(1);
}
writefile(fp,init);
fclose(fp);
printf("点数順に整列しました。\n");
ssort=listfree(ssort);
break;
}
break;
}
init=listfree(init);
return 0;
}