データ構造の線形表(シングルチェーン表)復習問題
4147 ワード
復習問題を通して、シングルチェーンの表をよく知って、固めます.まずその問題を見てください.
1.シングルチェーンテーブルL 2をシングルチェーンテーブルL 1の後ろに接続するアルゴリズムを設計する.2.ヘッドノードがないシングルチェーン表の削除アルゴリズムを設計する.3.無頭結点のシングルチェーン表の挿入アルゴリズムを設計する.5.ヘッドノードがないシングルチェーン表の逆置アルゴリズムを設計する.6.シングルチェーン表の逆置アルゴリズムを設計する.
これらの問題をする前に、私達はシングルチェーン表を作成しなければなりません.私達はそれぞれ頭の結点があるシングルチェーン表と頭の結点がないシングルチェーン表を作成します.コードは下記の通りです.
シングルチェーンの結点の種類を指定します.
1.シングルチェーンテーブルL 2をシングルチェーンテーブルL 1の後ろに接続するアルゴリズムを設計する.
考え方:題意は二つのチェーンをつなぎ合わせることです.これは簡単です.生活の中で2つの線を1つの線につなぎたいなら、1つの線の末尾と1つの線の頭をつなぎます.このような考えは私達のこの問題でも役に立ちます.コードを見る:
考え方:チェーンの一つの要素を削除して、最初の思考は削除された点の前の接合点を探してから、削除された点の前の接合点のポインタ領域を削除して、削除された点のポインタ領域に設定します.しかし、このように一つの困難があります.最初の一つは削除しても実現できません.頭通りのポイントがあるシングルチェーン表に適しています.後で考え方を変えて、削除要素を変えて理解しますと、あなたはシングルチェーンの表の中であなたの削除したその値が探し出せません.どうやって彼に見つけられませんか?簡単なのは、後のノードのデータ領域を削除されたデータ領域に上書きし、削除されたポイントのポインタ領域を後のノードのポインタ領域に設定することです.完全に削除操作が完了しました.もう一つの問題があります.最後の結点に会ったらどうすればいいですか?また、前の結点を記録する仮変数が必要です.最後の結点と判断したら、そのまま削除してもいいです.コードは以下の通りです
頭の結点がない挿入アルゴリズムは、最初の位置に要素を挿入してください.ここでは上の削除要素と同じ考えを採用しています.ここでは、私達はこう考えられます.私達は最初の位置に元素を挿入するのは面倒です.第二の位置に元素を挿入して、二つのノードのデータ領域を交換してもいいです.表に要素を挿入することもできますか?コードは以下の通りです
考え方:逆置アルゴリズムとは、位置を入れ替えて、最初と最後の交換位置、二つ目と最後から二つ目の交換位置をこれと類推することです.しかし、シングルチェーン表には毎回最初から始めなければならない欠点があります.配列は下付きで相応の元素を見つけることができません.相対的にいくつかの元素を探すのは難しい時があります.ここでは、チェーンを作る時に使うヘッド挿入法を使って逆置を実現できます.最初から遍歴して、各ノードを取り出して、新しい結点を作って、新しいチェーンを形成します.これは私達の逆置チェーンです.コードは以下の通りです
考え方:これは無頭結点逆置の基本と同じです.自慢話ではなく、直接コードを見ます.
ソースをクリックしてリソースをダウンロードします.
1.シングルチェーンテーブルL 2をシングルチェーンテーブルL 1の後ろに接続するアルゴリズムを設計する.2.ヘッドノードがないシングルチェーン表の削除アルゴリズムを設計する.3.無頭結点のシングルチェーン表の挿入アルゴリズムを設計する.5.ヘッドノードがないシングルチェーン表の逆置アルゴリズムを設計する.6.シングルチェーン表の逆置アルゴリズムを設計する.
これらの問題をする前に、私達はシングルチェーン表を作成しなければなりません.私達はそれぞれ頭の結点があるシングルチェーン表と頭の結点がないシングルチェーン表を作成します.コードは下記の通りです.
シングルチェーンの結点の種類を指定します.
/* */
typedef struct Node{
int data; //
struct Node * next; //
}Node,*PNode;
頭の結点があるものを作成します.//
PNode Create(int * a,int Length){
PNode head,p,q;
head = (PNode)malloc(sizeof(Node));
head->next = NULL;
p = head;
for(int i = 0;i < Length;i++){
q = (PNode)malloc(sizeof(Node));
q->data = a[i];
q->next = NULL;
p->next = q;
p = q;
}
return head;
}
ヘッダなしのノードを作成://
PNode nCreate(int * b,int Length){
PNode node,p,q;
if(Length > 0){
node = (PNode)malloc(sizeof(Node));
node->data = b[0];
node->next = NULL;
p = node;
for(int i = 1;i < Length;i++){
q = (PNode)malloc(sizeof(Node));
q->data = b[i];
q->next = NULL;
p->next = q;
p = q;
}
return node;
}
}
チェーンを作成しました.復習問題を始めましょう.1.シングルチェーンテーブルL 2をシングルチェーンテーブルL 1の後ろに接続するアルゴリズムを設計する.
考え方:題意は二つのチェーンをつなぎ合わせることです.これは簡単です.生活の中で2つの線を1つの線につなぎたいなら、1つの線の末尾と1つの線の頭をつなぎます.このような考えは私達のこの問題でも役に立ちます.コードを見る:
//1. L2 L1
void ConnectList(PNode L1,PNode L2){
PNode p;
p = L1;
while(p->next != NULL){ // L1
p = p->next;
}
p->next = L2->next; //
}
2.ヘッドノードがないシングルチェーン表の削除アルゴリズムを設計する.考え方:チェーンの一つの要素を削除して、最初の思考は削除された点の前の接合点を探してから、削除された点の前の接合点のポインタ領域を削除して、削除された点のポインタ領域に設定します.しかし、このように一つの困難があります.最初の一つは削除しても実現できません.頭通りのポイントがあるシングルチェーン表に適しています.後で考え方を変えて、削除要素を変えて理解しますと、あなたはシングルチェーンの表の中であなたの削除したその値が探し出せません.どうやって彼に見つけられませんか?簡単なのは、後のノードのデータ領域を削除されたデータ領域に上書きし、削除されたポイントのポインタ領域を後のノードのポインタ領域に設定することです.完全に削除操作が完了しました.もう一つの問題があります.最後の結点に会ったらどうすればいいですか?また、前の結点を記録する仮変数が必要です.最後の結点と判断したら、そのまま削除してもいいです.コードは以下の通りです
//2. ;
bool nDelete(PNode node,int i,int *ptr){
PNode p,q,m;
int count = 0;
p = node;
while(p!=NULL && count < i-1){ // i
m = p; //m i-1
p = p->next;
count++;
}
if(p == NULL){
return false;
}else if(p->next == NULL){ // 。
*ptr = p->data;
q = p;
m->next = NULL;
}else{
*ptr = p->data;
q = p->next;
p->data = q->data;
p->next = q->next;
}
free(q);
return true;
}
3.無頭結点のシングルチェーン表の挿入アルゴリズムを設計する.頭の結点がない挿入アルゴリズムは、最初の位置に要素を挿入してください.ここでは上の削除要素と同じ考えを採用しています.ここでは、私達はこう考えられます.私達は最初の位置に元素を挿入するのは面倒です.第二の位置に元素を挿入して、二つのノードのデータ領域を交換してもいいです.表に要素を挿入することもできますか?コードは以下の通りです
//3. ;
bool nInsert(PNode node,int i,int ndata){
PNode p = node,q;
int count =0;
while(p!=NULL&&count next;
count++;
}
if(p == NULL){
return false;
}else{
q = (PNode)malloc(sizeof(Node));
q->data = p->data; //
q->next = p->next;
p->data = ndata; //
p->next = q;
return true;
}
}
5.ヘッドノードがないシングルチェーン表の逆置アルゴリズムを設計する.考え方:逆置アルゴリズムとは、位置を入れ替えて、最初と最後の交換位置、二つ目と最後から二つ目の交換位置をこれと類推することです.しかし、シングルチェーン表には毎回最初から始めなければならない欠点があります.配列は下付きで相応の元素を見つけることができません.相対的にいくつかの元素を探すのは難しい時があります.ここでは、チェーンを作る時に使うヘッド挿入法を使って逆置を実現できます.最初から遍歴して、各ノードを取り出して、新しい結点を作って、新しいチェーンを形成します.これは私達の逆置チェーンです.コードは以下の通りです
//5.
PNode nInverse(PNode node){
PNode p = NULL,q = NULL,m = NULL;
p = q = node;
while(q!=NULL){
q = q->next; //
p->next = m; //
m = p;
p = q;
// printf("fsf ");
}
return m;
}
6.シングルチェーン表の逆置アルゴリズムを設計する.考え方:これは無頭結点逆置の基本と同じです.自慢話ではなく、直接コードを見ます.
//6.
void Inverse(PNode head){
PNode p = NULL,q = NULL, m = NULL;
p = q = head->next; //
while(q!=NULL){
q = q->next;
p->next = m;
m = p;
p = q;
}
head->next = m;
}
はい、このいくつかの復習問題は大体終わって、自分でパソコンで練習します.分からないところはペンを持って紙に書いてください.絵を描いたら、構想があります.頑張って!ソースをクリックしてリソースをダウンロードします.