PTAは学生情報チェーンテーブル(線形テーブルのチェーンテーブルの説明)を創立する——C
2571 ワード
本題では,入力した学生成績を一方向チェーンテーブルに組織する簡単な関数を実現することが要求される.
関数インタフェースの定義:
void input();
この関数はscanfを用いて入力から学生の情報を取得し,一方向チェーンテーブルに組織する.チェーンテーブルノード構造は次のように定義されます.
一方向チェーンテーブルのヘッダとテールポインタは、グローバル変数headとtailに保存されます.
複数の生徒の情報(学番、氏名、成績)を入力し、学番が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));
コード:
以前の誤った考え方: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を多く出力します.
コード:
(午後になってようやく分かった!o( ̄▽ ̄)ブ)
関数インタフェースの定義:
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( ̄▽ ̄)ブ)