PTA学生成績チェーン表処理(線形表のチェーン表説明)——C
2839 ワード
本題は2つの関数を実現することを要求し、1つは入力した学生の成績を一方向チェーンテーブルに組織する.もう1つは、あるスコアラインより成績が低い学生のノードをチェーンテーブルから削除します.
関数インタフェースの定義:
関数createlistはscanfを利用して入力から学生の情報を取得し、それを一方向チェーンテーブルに組織し、チェーンテーブルヘッダポインタを返します.チェーンテーブルノード構造は次のように定義されます.
複数の生徒の情報(学番、氏名、成績)を入力し、学番が0の場合に終了する.
関数deletelistはheadをヘッダとするチェーンテーブルから削除され、min_より成績が低いscoreの学生は、結果チェーンテーブルのヘッダポインタを返します.
審判試験プログラムのサンプル:
サンプルを入力:
1 zhang 78 2 wang 80 3 li 75 4 zhao 85 0 80
出力サンプル:
2 wang 80 4 zhao 85
考え方:最初の要素headがminより小さい場合scoreでは、最初の要素がminより大きいまで削除されます.score ;チェーンテーブルを巡回し、temnode=min_score、この方法で次のノードにアクセスし続けます.
注意:初期の場合、head tailポインタは空で、要素を追加するとtail->nextはnull(必ずこの文を書く必要があります.そうしないとtail->nextは空ではありません).temnode=(struct stud_node*)malloc(sizeof(struct stud_node)を使用します.作成されたスペースはfree(temnode)でスペースを解放する必要があり、deleteは使用できません.
コード:
関数インタフェースの定義:
struct stud_node *createlist();
struct stud_node *deletelist( struct stud_node *head, int min_score );
関数createlistはscanfを利用して入力から学生の情報を取得し、それを一方向チェーンテーブルに組織し、チェーンテーブルヘッダポインタを返します.チェーンテーブルノード構造は次のように定義されます.
struct stud_node {
int num; /* */
char name[20]; /* */
int score; /* */
struct stud_node *next; /* */
};
複数の生徒の情報(学番、氏名、成績)を入力し、学番が0の場合に終了する.
関数deletelistはheadをヘッダとするチェーンテーブルから削除され、min_より成績が低いscoreの学生は、結果チェーンテーブルのヘッダポインタを返します.
審判試験プログラムのサンプル:
#include
#include
struct stud_node {
int num;
char name[20];
int score;
struct stud_node *next;
};
struct stud_node *createlist();
struct stud_node *deletelist( struct stud_node *head, int min_score );
int main()
{
int min_score;
struct stud_node *p, *head = NULL;
head = createlist();
scanf("%d", &min_score);
head = deletelist(head, min_score);
for ( p = head; p != NULL; p = p->next )
printf("%d %s %d
", p->num, p->name, p->score);
return 0;
}
/* */
サンプルを入力:
1 zhang 78 2 wang 80 3 li 75 4 zhao 85 0 80
出力サンプル:
2 wang 80 4 zhao 85
考え方:最初の要素headがminより小さい場合scoreでは、最初の要素がminより大きいまで削除されます.score ;チェーンテーブルを巡回し、temnode
注意:初期の場合、head tailポインタは空で、要素を追加するとtail->nextはnull(必ずこの文を書く必要があります.そうしないとtail->nextは空ではありません).temnode=(struct stud_node*)malloc(sizeof(struct stud_node)を使用します.作成されたスペースはfree(temnode)でスペースを解放する必要があり、deleteは使用できません.
コード:
struct stud_node *createlist(){
int thenum;
struct stud_node *temnode, *tail, *head;
head = tail = NULL;
while (scanf("%d", &thenum) && thenum) {
temnode= (struct stud_node *)malloc(sizeof(struct stud_node));
temnode->num = thenum;
temnode->next = NULL;
scanf("%s %d", temnode->name, &temnode->score);
if (head==NULL)
head = temnode;
else
tail->next = temnode;
tail = temnode;
}
return head;
}
struct stud_node *deletelist(struct stud_node *head, int min_score) {
struct stud_node *temnode, *prenode;
while (head!=NULL&&head->scorenext;
free(temnode);
}
if (head == NULL)
return NULL;
prenode = head;
temnode = head->next;
while (temnode != NULL) {
if (temnode->score < min_score) {
prenode->next = temnode->next;
free(temnode);
}
else
prenode = temnode;
temnode = prenode->next;
}
return head;
}