數據結構—單鏈表的插入

數據結構—單鏈表的插入

關於單鏈表的概念以及一些基本的知識就不說明了,直接上代碼!

整個鏈表有一個根節點,用以指向第一個元素,在插入的過程中要考慮幾個問題:

1、插入的位置是不是第一個節點與根節點之間

2、插入的位置是否是在最後

(要考慮當前鏈表是否爲空)

代碼1:

<pre name="code" class="cpp">#include <stdio.h>
#include <stdlib.h>
typedef struct NODE
{
	struct NODE *link;
	int value;
}Node;
int insert(Node *current,int new_value)
{
	//新建個節點
	Node *newNode=(Node *)malloc(sizeof(Node));
	if(newNode==NULL)
		return 0;
	newNode->value=new_value;
	//如果當前鏈表爲空
	if(current==NULL)
	{
		current=newNode;
		newNode->link=NULL;
		return 1;
	}
	Node *previous;
	//此時,current->link!=NULL,尋找插入的位置
	while(current!=NULL && current->value<new_value)
	{
		previous=current;
		current=current->link;
	}
	newNode->link=current;
	previous->link=newNode;
	return 1;
}

上面的代碼雖然可以完成相應的插入需求,其中最後簡化了函數,本來while語句執行完後還需判斷是否到達了鏈表的最後,再插入,但是後來發現兩種情況可以合併!

//插入最後的位置
if (current==NULL)   
{
	newNode->link=NULL;
	previous->link=newNode;
	return 1;
}
//中間位置
else    
{
	newNode->link=current;
	previous->link=newNode;
	return 1;
}


另一種做法將一個指向root的指針傳遞給函數,然後間接訪問它。

代碼2:

int insert(Node **rootp,int new_value)
{
	Node *current,*previous;
	current=*rootp;
	previous=NULL;
	while(current->link!=NULL && current->value<new_value)
	{
		previous=current;
		current=current->link;
	}
	//新建節點
	Node *newNode=(Node *)malloc(sizeof(Node));
	if(newNode==NULL)
		return 0;
	newNode->value=new_value;

	newNode->link=current;  //若是在最後,則current爲NULL
	if(previous==NULL)    //插入空鏈表中
		*rootp=newNode;
	else
		previous->value=newNode;
	return 1;
}

上面兩份代碼還可以優化,出現這種情況是應爲要考慮上述所說的兩種特殊的情況(後面一種情況已經解決),第一種特殊情況(也就是插入的位置是不是第一個節點與根節點之間)可以通過以下的方式優化:

必須認識到每個節點都有一個指向它的指針,所以當移動到下一個節點時,我們可以保存一個指向下一個節點link字段的指針,而不是保存一個指向前一個節點的指針!

<span style="color:#330000;">int insert(Node **linkp,int new_value)
{
	register Node *current;
	while((current=*linkp)!=NULL && current->value<new_value)
		linkp=&t->link;

	register Node *newNode=(Node *)malloc(sizeof(Node));
	if(newNode==NULL)
		return 0;
	newNode->value=new_value;

	newNode->link=current;
	*linkp=newNode;
	return 1;
}</span>
消除了特殊的情況,代碼更加簡單了!

參考《C和指針》!








發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章