數據結構—單鏈表的插入
關於單鏈表的概念以及一些基本的知識就不說明了,直接上代碼!
整個鏈表有一個根節點,用以指向第一個元素,在插入的過程中要考慮幾個問題:
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和指針》!