チェーンテーブル|ループ|挿入|

1866 ワード

参考資料LinkedListBasics.pdf
一、遍歴
チェーンテーブルを巡回すると、テスト条件はcurrent!=NULL、移動ステップはcurrent=current->nextです.
int Length(struct node* head)
{
	printf("---- iterate list ----
"); int count = 0; struct node* current = head; while(current != NULL) { printf("data =%d ;
",current->data); count ++; current = current->next; } return count; }

二、Headから挿入
最も簡単な方法は、ヘッダノードの末尾にノードを挿入することですが、その挿入順序はその配列順序とは正反対です.ほほほ、気にしないなら、これは簡単な方法です.
void Push(struct node** headRef, int data){
	struct node* newNode = (struct node*)malloc(sizeof(struct node));
	newNode->data = data;
	newNode->next = *headRef;
	*headRef = newNode;
}
struct node* AddAtHead() {
struct node* head = NULL;
int i;
for (i=1; i<6; i++) {
Push(&head, i);
}
// head == {5, 4, 3, 2, 1};
return(head);
}

三、チェーンテーブルの末尾から挿入
まず末尾のノードを見つけます~
void PushTail(struct node** headRef, int data){

	struct node* newNode = (struct node*)malloc(sizeof(struct node));
	newNode->data = data;
	newNode->next = NULL;
	//special case for lenght 0
	if(tail == NULL)
	{
		printf("tail == NULL");
		*headRef = newNode;
	}
	else
	{
		struct node* tail = *headRef;
		// Locate the last node
		while(tail->next != NULL)
		{
			tail = tail->next;
		}
		tail->next = newNode;
	}
}

四、注意:「ポインタのコピー」と「ポインタのポインタ」
ポインタのコピー:void PushHead(struct node*headRef,int data)のようにノードを挿入すると、元のチェーンテーブルには何の影響もありません.
ポインタのポインタ:void PushHead(struct node**headRef,int data)