PTA学生成績チェーン表処理(線形表のチェーン表説明)——C


本題は2つの関数を実現することを要求し、1つは入力した学生の成績を一方向チェーンテーブルに組織する.もう1つは、あるスコアラインより成績が低い学生のノードをチェーンテーブルから削除します.
関数インタフェースの定義:
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=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(){
	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;
}