PTAは学生情報チェーンテーブル(線形テーブルのチェーンテーブルの説明)を創立する——C


本題では,入力した学生成績を一方向チェーンテーブルに組織する簡単な関数を実現することが要求される.
関数インタフェースの定義:
void input();
この関数はscanfを用いて入力から学生の情報を取得し,一方向チェーンテーブルに組織する.チェーンテーブルノード構造は次のように定義されます.
struct stud_node {
    int              num;      /*  */
    char             name[20]; /*  */
    int              score;    /*  */
    struct stud_node *next;    /*         */ 
 };

一方向チェーンテーブルのヘッダとテールポインタは、グローバル変数headとtailに保存されます.
複数の生徒の情報(学番、氏名、成績)を入力し、学番が0の場合に終了する.
審判試験プログラムのサンプル:
#include 
#include 
#include 

struct stud_node {
     int    num;
     char   name[20];
     int    score;
     struct stud_node *next; }; struct stud_node *head, *tail;

void input();

int main() {
    struct stud_node *p;
	head = tail = NULL; 	
	input(); 
	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
出力サンプル:
1 zhang 78 2 wang 80 3 li 75 4 zhao 85
構想:入力するたびにデータを格納するための一時ノードポインタ*temnodeを作成します.第1のデータセットの場合、headとtailは同時にその記憶空間、すなわちhead=tail=temnodeを指す.その後のデータheadは変化せず、tailの下位ポインタはデータ記憶空間、すなわちtail->next=temnodeを指し、tailポインタはシフトし、tail=tail->nextとなる.
注意:一時ノードポインタの作成には固定ソケットがあります:struct stud_node temnode = (struct stud_node)malloc(sizeof(struct stud_node));
コード:
void input() {
	int tem = 0;
	int thenum;
	while (scanf("%d",&thenum)&&thenum){
		struct stud_node *temnode = (struct stud_node*)malloc(sizeof(struct stud_node));
		temnode->num = thenum;
		scanf("%s %d", temnode->name, &temnode->score);
		if (tem == 0) {
			tem = 1;
			tail = head = temnode;
		}
		else {
			tail->next = temnode;
			tail = tail->next;
		}
	}
}

以前の誤った考え方:headとtailは同時に新しい記憶空間を指し、すなわちtail=head=(struct stud_node*)malloc(sizeof(struct stud_node);入力されるデータは、tailが指す空間に格納され、tailの下位ポインタが新しい記憶空間を指し、tailポインタがシフトし、tail=tail->nextとなる.すべてのデータ入力が完了すると、tailが指す空間にデータが格納されないためdelete tail、tail=NULLとなる.しかし問題はdeleteが本当にtailを削除するのではなく、tailはランダムに1つの空間を指して、プログラムが完全に終わるまで、だからデータのtailがありません!=NULL、出力する時、1行の0 0を多く出力します.
コード:
void input() {
	tail = head = new stud_node();
	while (scanf("%d", &tail->num) && tail->num) {
		scanf("%s %d", tail->name, &tail->score);
		tail->next = new stud_node();
		tail = tail->next;
	}
	delete tail;
	tail = NULL;
}

(午後になってようやく分かった!o( ̄▽ ̄)ブ)