单链表
插入到有序单链表。函数的参数是一个指向链表根指针的指针,以及一个需要插入的新值。
#include <stdlib.h>
#include <stdio.h>
#define FALSE 0
#define TRUE 1
typedef struct NODE
{
struct NODE *link;
int value;
}
int sll_insert( Node **rootp, int new_value )
{
Node *current;
Node *previous;
Node *new;
current = *rootp;
previous = NULL;
while( current != NULL && current->value < new_value )
{
previous = current;//保存前一个节点地址
current = current->link;//指向下一个节点
}
new = (Node *)malloc( sizeof( Node ));//分配动态内存
if( new == NULL )
return FALSE;
new->value = new_value;//插入的新值存储在新节点中
//新节点插入链表
new->link = current;
if( previous == NULL )//检查是否为第一个节点
*rootp = new;
else
previous->link = new;
return TRUE;
}
对上面程序的优化:
#include <stdlib.h>
#include <stdio.h>
#define FALSE 0
#define TRUE 1
typedef struct NODE
{
struct NODE *link;
int value;
}
int sll_insert( register Node **linkp, int new_value )//增加 register 声明,提高结果代码效率
{
register Node *current;
register Node *new;
while( ( current = *linkp ) != NULL && current->value < new_value )
linkp = ¤t->link;//linkp是link的地址
new = (Node *)malloc( sizeof( Node ) );
if( new == NULL )
return FALSE;
new->value = new_value;
//插入新节点到链表,而无需考虑是否是第一个节点
new->link = current;
*linkp = new;
return TRUE;
}
通过这种优化便可消除插入位置在第一个节点的特殊情况