ARM_C高度な研究ノート(XIII)リストの導入、および挿入ノードトラバーサル

(a)のリストをご紹介

1.配列の欠陥からスタート

  1. アレイは、アレイ内のすべての要素の一つが同じでなければならない二つの欠陥を有し、第二の配列の要素数が予め定めなければならないと指定された後に変更することができません。
  2. 2つの欠陥列を解決する方法:配列構造により、最初の欠陥が解決します。構造は、それによってアレイの欠陥を解決する、同じタイプではない、その中の要素を可能にします。配列は、ただ本発明ので、問題の一部を解決することはできませんので、だから、構造があります。
  3. 第二の欠陥列を解決する方法は?私たちは、リアルタイムで配列のサイズを拡大することを願っています。例えば、私はちょうど要素の数を設定し始めた後、それは我々が実行されている。このプログラムの目的を達成するために、配列をカプセル化することができ、明らかに十分ではないため、動的に20通常の​​配列に拡張はありませんが、10であり、我々はまた、新しいを使用することができます解決するためのデータ構造は、この新しいデータ構造は、リンクされたリストです。
  4. 概要:ほとんど理解することができる。リストは、リアルタイム大/小配列内の要素の数です。

2.リストのどのような?

  1. 名前が示すように、テーブルのリンクリストは、チェーンにアップ合流です。テーブルは、本明細書にデータを格納するためにいくつかのメモリを有している(そうテーブルと呼ばれるテーブルがデータテーブルである)ノードのノードを指し、本明細書にチェーンリンクに各テーブルの方法を指す、C言語を接続するために使用され表2(実際には、二つのメモリ)メソッドは、ポインタです。
  2. 鎖は、(それぞれのリンクリストノード構造が完全に類似している)複数のノードから構成されていますノードポインタと有効なデータがで構成されていますタスク情報、リストを構成する領域を指し示すためのポインタのリストを格納するための次のノードのデータ領域。

リストはやってするために使用される瞬間を忘れてはいけない3

  1. 常に心に留め:リストは、アレイのサイズの動的拡張を解決するために使用されている問題ではないので、アレイを使用した場合、リストは実際にあります。ぶっきらぼう:タスクを完了することができ、リストが配列に完了することができ、配列は、タスクのリストを完了することが可能で完了することができます。しかし、柔軟性が同じではありません。
  2. 簡単に言えば:リストは、データの格納に使用されています。利点の配列に関するデータを維持するために使用されるリストは、それが動的にどのように多くの数を割り当てる必要な柔軟性である、余分なメモリを取ることはありません。アレイの利点は、(単純な、粗)を使用するのは簡単です。

(パート2)単一のリスト

1.ノードの単一のリストを構成します

  1. ノードのリスト、ノードであってです:有効なデータポインタがと
  2. 構造体のノードの定義は単なる構造であり、変数自体が発生し、またメモリを取りません。構造は、リストのノードテンプレートを定義する機能として定義されていますが、ノード、実際にリンクリストをコピーすることができます作成​​するときに、このテンプレートを使用するために、将来的に必要なノードがありません。

2.アプリケーションとヒープメモリの使用

  1. より柔軟なリストのメモリ要件は、スタックを使用することはできませんし、データセグメントを取得することはできません。唯一のヒープメモリを使用します
  2. (アプリケーションの結果が正しいことを確認してください)1、アプリケーション・ヒープ・メモリー・サイズは、ノードのサイズである。2、ヒープメモリをクリーンアップするために適用され、3、のようにヒープメモリに適用する:ノードのリストを作成するために、ヒープメモリを使用します新しいノード; 4、有効なデータが充填され、ポインタ領域ああ新しいノードれます。

3.ヘッドポインタリスト

  1. ノードは、ヘッド・ポインタではなく、通常のポインタ、唯一の4バイト。それはノードリストを指すことができるので、ヘッド・ポインタ・タイプは、構造体のノード・タイプです。
  2. ノードのリンクリストへのヘッドポインタ、第1のノードと次のノードへのポインタ、およびそう最後のノードまでに:リンクされたリストの典型的な実装です。これは、チェーンを構成しています。

リスト内の各ノードの前記データ・アクセス

  1. 唯一のヘッドポインタでは、各ノードに手を使用することはできません実際には、我々は、各ノードのポインタは、リストノードのみヘッドポインタによってアクセスすることができたときにリストが保存されていないセーブので。
  2. 前のノードポインタ内部pNextは、私たちは次のノードを見つけることができます。

5.戦闘:シンプルな単鎖の構築

  1. 目的:リンクされたリストに格納された、いくつかのデータをリストを構築(例えば、3桁1,2,3)と
/*
* 描述:创建单链表
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//链表结构体
struct node
{
	int data;             // 有效数据
	struct node *pNext;   // 指向下一个节点的指针
};

int main(void)
{
	//第一步:定义并初始化头指针
	struct node *pHeader = NULL;      
//***********************************************************************	
//创建第一个节点
//***********************************************************************	
	//第二步:申请堆内存,创建节点
	struct node *p = (struct node *)malloc(sizeof(struct node));
	if(NULL == p)
	{
		printf("malloc error.\n");
		return -1;
	}
	// 清理申请到的堆内存
	memset(p, 0 , sizeof(struct node)); 
	// 填充节点
	p->data = 1;                        
	p->pNext = NULL;
	
	//第三步:将本节点和它前面的头指针(节点)关联起来	
	pHeader = p;
//***********************************************************************	
//创建第二个节点
//***********************************************************************
	struct node *p1 = (struct node *)malloc(sizeof(struct node));
	if(NULL == p1)
	{
		printf("malloc error.\n");
		return -1;
	}
	memset(p1, 0 , sizeof(struct node));
	p1->data = 2;
	p1->pNext = NULL;
	p->pNext = p1;
//***********************************************************************	
//创建第三个节点
//***********************************************************************
	struct node *p2 = (struct node *)malloc(sizeof(struct node));
	if(NULL == p2)
	{
		printf("malloc error.\n");
		return -1;
	}
	memset(p2, 0 , sizeof(struct node));
	p2->data = 3;
	p2->pNext = NULL;
	p1->pNext = p2;
//***********************************************************************

//打印节点中的数据
	printf("p->data = %d.\n", pHeader->data);
	printf("p1->data = %d.\n", pHeader->pNext->data);
	printf("p2->data = %d.\n", pHeader->pNext->pNext->data);

	return 0;
}

機能コードにカプセル化されたノードを作成6.

struct node *create_node(int data)
{
	struct node *p = (struct node *)malloc(sizeof(struct node));
	if(NULL == p)
	{
		printf("malloc error.\n");
		return NULL;
	}
	memset(p, 0 , sizeof(struct node));
	p->data = data;
	p->pNext = NULL;
	return p;
}
  • 関数呼出し

(C)単鎖アルゴリズム - 挿入ノード

リスト尾から新しいノードを挿入します1。

/*
* 描述:尾部插入新节点函数
*/
void insert_tail(struct node *pH, struct node *new)
{
	struct node * p = pH;
	//第一步:查找到最后一个节点
	while(NULL != p->pNext)
	{
		p = p->Next;
	}
	//第二步:插入新的节点
	p->Next = new;
}
  • 関数呼出し

1.ヘッドノードの導入

1.ヘッドノードとは何ですか

  1. 問題:我々はinsert_tailで直接暗にヘッドノードのポインタを持っているので、そのプログラムは直接セグメントの後にヘッドポインタを定義した場合は、エラーinsert_tail直接報告します私たちは、最初のcreate_nodeは、ヘッドポインタに新しいノードを作成した後、先頭ポインタを定義する必要が初期化され、またはこのエラーを回避することはできません。しかし、バック最初のノードのノードルックスを作成し、プログラムロジックが少し滑らかに見えるようにする解決し、理由、少し異なる追加します。
  2. 別の利用リストがあり、最初のノードは、ヘッドノードへのヘッド・ポインタとして使用されます。ヘッドノードの特徴は次のとおりです。まず、それはすぐ後ろのヘッドポインタ。第二、ヘッドノードのデータ部分が空である(時には空が、ストレージノードのリスト全体ではない)、最初のノードである次のノードの部分へのポインタをポイントします。
  3. これは、ヘッドノードと実際に異なる内の他のノードように思われます。リンクされたリストを作成するときにノードを追加するために私たちの方法が異なっています。一緒にヘッド・ポインタ上に作成した最初のノードとヘッドポインタと関連のある、完全な、そのようなinsert_tailに追加機能の背後にあるノードを格納する真のデータ・ノード。
  4. 何のリストのヘッドノードは違いはありませんがあります。ノードを通過する挿入ノード、削除ノードのリストに反映され、各解析アルゴリズム機能リストが異なっています。だから、処理する必要があり、その後、このすべてのヘッドノードの背後にある設計アルゴリズムのリストがあれば、何のヘッドノードの設計が存在しない場合は、背後にあるすべてのアルゴリズムはありませんヘッドノードに基づいて行われるべきです。次の2つのリストを持つ人がいるとき、それは実際のプログラミングヘッドノードを持っていないかどうかを確認するために注意を払う必要がありますので、我々は他の人によって書かれたコードを見てみましょう。

リストから新しいヘッドノードを挿入2

/*
* 描述:头部插入链表节点函数
*/
void insert_head(struct node *pH, struct node *new)
{
	//第一步:先将原来的第一个节点指向新插入的节点的尾部
	new->pNext = pH->pNext;
	
	//第二步:再将新节点插入头节点的尾部
	pH->pNext = new;
	
	//头节点计数节点个数加一	
	pH->data += 1;
}

(D)アルゴリズムの単一リスト - トラバースノード

1.横断される何

  1. これは、トラバーサルと呼ば一つずつ、外各ノードに単一のリストをトラバースすることです。
  2. ポイントトラバーサル:1を見逃すことはできない、と第二、繰り返すことができない、効率の追求。

2.どのように単独リンクリストトラバーサル

  1. データ構造のトラバースを分析するためにどのように、キーは、このデータ構造自体の特性を分析することです。その後、独自の特性トラバーサルのアルゴリズムに基づいて開発します。
  2. 一本鎖は、ノードの数、開始ヘッドポインタ+リスト全体として第1のノードによって特徴付けられ、そして最後のノードは、内部pNextポインタ値がNULLであることを特徴とします。真ん中の最初から最後まで内部ポインタpNext各ノードをマウントします。開始から終了し、唯一の道へ。これらの機能だけではそのリストトラバーサルアルゴリズムを決定します。
  3. トラバーサル方法:抗体+ヘッドノードポインタ開始、チェーンフックに沿った各ノードが最後のノード、リターンが終了するまで、順次ノード抽出されたデータのリストポインタにアクセスし、その後ノードダウン。

3.トラバーサル関数の例

  • トラバーサル機能1
void bianli(struct node *pH)
{
	struct node *p = pH->pNext;
	int count = 0;
	printf("-------------------链表遍历开始-------------------------\n");
	while(NULL != p->pNext)
	{
		count++;
		printf("node%d = %d.\n", count, p->data);
		p = p->pNext;
	}
	printf("node%d = %d.\n", count + 1, p->data);
	printf("-------------------链表遍历结束-------------------------\n");
}

  • トラバーサル機能2
void bianli2(struct node *pH)
{
	struct node *p = pH;
	int count = 0;
	printf("-------------------链表遍历开始-------------------------\n");
	while(NULL != p->pNext)
	{
		count++;
		p = p->pNext;
		printf("node%d = %d.\n", count, p->data);
	}
	printf("-------------------链表遍历结束-------------------------\n");
}

  • 関数呼び出しと業績
公開された22元の記事 ウォンの賞賛6 ビュー505

おすすめ

転載: blog.csdn.net/weixin_44112805/article/details/105347624