単行リストのソートのプログラムについて
単行リストのソースでわからなくなったので質問させていただきます。
#include<stdio.h>
//----------------------------------------------------------
// InitBanpei
// 番兵の初期化
//----------------------------------------------------------
// input: struct pNode* pNode //番兵のアドレス
//----------------------------------------------------------
void InitBanpei(struct node* pStartNode,struct node* pEndNode);
//----------------------------------------------------------
// IsBanpei
// 番兵チェック
//----------------------------------------------------------
// input: struct pNode* pNode //番兵のアドレス
// out : true //成功
// false //失敗
//----------------------------------------------------------
int IsBanpei(struct node* pNode);
//構造体
struct node
{
char name[30];
int kokugo;
int suugaku;
int eigo;
int goukei;
struct node* pNext;
};
int main(void)
{
FILE* fp;
struct node useStart,useEnd;
struct node *p,*j,*max,*a;
int stich=0;
char work[256];
InitBanpei(&useStart,&useEnd);
IsBanpei(&useStart);
IsBanpei(&useEnd);
fp=fopen("data.txt","r");
if(fp==NULL)
{
printf("ファイルを開けません\n");
return 0;
}
while(feof(fp)==0)
{
fgets(work,256,fp);
stich++;
}
stich--;
printf("%d\n",stich);
if(stich==0)
{
printf("件数は0です\n");
return 0;
}
fclose(fp);
fp=fopen("data.txt","r");
if(fp==NULL)
{
printf("ファイルを開けません\n");
return 0;
}
j=NULL;
for(int i=0;i<stich;i++)
{
a=new struct node;
if(a==NULL)
{
printf("メモリが確保できません\n");
return 0;
}
fscanf(fp,"%s %d %d %d ",&(a->name),&(a->kokugo),&(a->suugaku),&(a->eigo));
a->goukei=a->kokugo+a->suugaku+a->eigo;
a->pNext=j;
j=a;
}
useStart.pNext=j;
max=&useStart;
p=max->pNext;
while(max->pNext!=NULL)
{
j=p;
while(j->pNext!=NULL)
{
if(max->goukei< j->goukei)
{
max=j->pNext;
p=j;
}
j=j->pNext;
}
p->pNext=max->pNext;
max->pNext=useStart.pNext;
max=max->pNext;
}
a=useStart.pNext;
while(a->pNext!=NULL)
{
printf("%7s %03d %3d %3d %3d点\n ",a->name,
a->kokugo,a->suugaku,
a->eigo,a->goukei);
a=a->pNext;
}
}
//----------------------------------------------------------
// InitBanpei
// 番兵の初期化
//----------------------------------------------------------
// input: struct pNode* pNode //番兵のアドレス
//----------------------------
//------------------------------
void InitBanpei(struct node* pStartNode,struct node* pEndNode)
{
pStartNode->pNext=pEndNode;
pEndNode->pNext=NULL;
}
//----------------------------------------------------------
// IsBanpei
// 番兵チェック
//----------------------------------------------------------
// input: struct pNode* pNode //番兵のアドレス
// out : true //成功
// false //失敗
//----------------------------------------------------------
int IsBanpei(struct node* pNode)
{
if( pNode->pNext!=NULL)
{
return -1;
}
return 0;
}
のソースなのですが、単行リストを使って大きい順に並び替えをしたいのですがうまくできません。どこを直せばいいのでしょうか?分かる方いらしたらソースを書いてくださると助かります。
お礼
すばらしいほど早い回答ありがとうございます。 しかも、使ってすぐに感動を味わえました。 数千行を何時間もかけていたのが・・・・(泣)。 ありがとうございます。