線形リストのソート
Posted: 2007年7月12日(木) 05:19
はじめまして。今回教えてほしいことなのですがリストをつくってランク順に並べるという方法なのですが
リストを作成してソートする方法はできるのですがノードを作成して適切な場所に挿入する方法がいまいち
わかりません;;
一応ソースはこのようになりました。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct List {
char Number[10];
char rank;
struct List *next;
} rankNode;
/*
makeNewNode()関数:新しいノードを作成する関数
*/
rankNode *NewNode( void ) {
rankNode *newNode;
newNode = (rankNode *)malloc( sizeof( rankNode ) );
newNode->next = NULL;
return( newNode );
}
/*
insertNext()関数:引数で渡されたノードの後ろに新しいノードを追加する
*/
void insertNext( rankNode *curNode, char *pId, char cGrade ) {
rankNode *newNode;
newNode = NewNode();
/* 新しいノードにデータをコピー */
strcpy( newNode->Number, pId );
newNode->rank = cGrade;
newNode->next = curNode->next;
curNode->next = newNode;
}
/*
insertFirst()関数:最初のノードの前に新しいノードを追加する
*/
rankNode *insertFirst( rankNode *firstNode, char *pId, char cGrade ) {
rankNode *newNode;
newNode = NewNode();
/* 新しいノードにデータをコピー */
strcpy( newNode->Number, pId );
newNode->rank = cGrade;
newNode->next = firstNode;
firstNode = newNode;
return( firstNode );
}
int main( void ) {
int i;
char Number[10];
char rank;
FILE *pFile;
rankNode *pTop;
rankNode *pNow;
/* データファイルを開く */
pFile = fopen( "rank.txt", "r" );
if( pFile == NULL ) {
printf( "Error!!! \n" );
return( 2 );
}
pTop = NULL;
/* ファイルの終わりまで読み込み,リストの最初に追加する */
while( fscanf( pFile, "%s %c", Number, &rank ) != EOF ) {
/* ノードがない場合 */
if( pTop == NULL ) {
pTop = insertFirst( pTop, Number, rank );
}
/* ノードが1つの場合 */
else if( pTop->next == NULL ) {
if( pTop->rank > rank ) {
pTop = insertFirst( pTop, Number, rank );
}
else{
insertNext( pTop, Number, rank );
}
}
/* ノードが2つ以上の場合 */
else {
}
}
return( 0 );
}
ノードがないときと1つの時はできたのですが
ノードを2つ以上ある時の挿入方法がいまいちわからないのです。
ちなみにrank.txtの内容はこんなかんじです。
番号 ランク
001 C
002 A
003 B
004 C
005 D
よろしくお願いします。
リストを作成してソートする方法はできるのですがノードを作成して適切な場所に挿入する方法がいまいち
わかりません;;
一応ソースはこのようになりました。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct List {
char Number[10];
char rank;
struct List *next;
} rankNode;
/*
makeNewNode()関数:新しいノードを作成する関数
*/
rankNode *NewNode( void ) {
rankNode *newNode;
newNode = (rankNode *)malloc( sizeof( rankNode ) );
newNode->next = NULL;
return( newNode );
}
/*
insertNext()関数:引数で渡されたノードの後ろに新しいノードを追加する
*/
void insertNext( rankNode *curNode, char *pId, char cGrade ) {
rankNode *newNode;
newNode = NewNode();
/* 新しいノードにデータをコピー */
strcpy( newNode->Number, pId );
newNode->rank = cGrade;
newNode->next = curNode->next;
curNode->next = newNode;
}
/*
insertFirst()関数:最初のノードの前に新しいノードを追加する
*/
rankNode *insertFirst( rankNode *firstNode, char *pId, char cGrade ) {
rankNode *newNode;
newNode = NewNode();
/* 新しいノードにデータをコピー */
strcpy( newNode->Number, pId );
newNode->rank = cGrade;
newNode->next = firstNode;
firstNode = newNode;
return( firstNode );
}
int main( void ) {
int i;
char Number[10];
char rank;
FILE *pFile;
rankNode *pTop;
rankNode *pNow;
/* データファイルを開く */
pFile = fopen( "rank.txt", "r" );
if( pFile == NULL ) {
printf( "Error!!! \n" );
return( 2 );
}
pTop = NULL;
/* ファイルの終わりまで読み込み,リストの最初に追加する */
while( fscanf( pFile, "%s %c", Number, &rank ) != EOF ) {
/* ノードがない場合 */
if( pTop == NULL ) {
pTop = insertFirst( pTop, Number, rank );
}
/* ノードが1つの場合 */
else if( pTop->next == NULL ) {
if( pTop->rank > rank ) {
pTop = insertFirst( pTop, Number, rank );
}
else{
insertNext( pTop, Number, rank );
}
}
/* ノードが2つ以上の場合 */
else {
}
}
return( 0 );
}
ノードがないときと1つの時はできたのですが
ノードを2つ以上ある時の挿入方法がいまいちわからないのです。
ちなみにrank.txtの内容はこんなかんじです。
番号 ランク
001 C
002 A
003 B
004 C
005 D
よろしくお願いします。