版本1、2、3未像有些数据库结构书上推荐在链表前添加一个“头结点”(哑节点:始终是链表的第一个节点,只是不存储有用数据)这样就消除插入链表起始位置这个特殊情况。
版本1:保持一个previous指针和一个current指针,传递的参数是根指针,在链表起始位置插入时(特殊情况),不能修改根指针
#include <stdio.h>
#include <stdlib.h>
#define FALSE 0
#define TRUE 1
typedef struct Node{
struct Node * link;
int value;
}Node;
int insert(register Node * current,int new_value){
register Node *previous;
register Node *new;
/*look for accurate inserrting location*/
while(current!=NULL&¤t->value<new_value){
previous=current;
current=current->link;
}
/*allocate memory and assign new_value*/
new=(Node*)malloc(sizeof(Node));
if(new==NULL)
return FALSE;
new->value=new_value;
/*insert new Node*/
new->link=current;
previous->link=new;
return TRUE;
}
版本2:保持一个previous指针和一个current指针,传递的参数是根指针的指针,在链表起始位置插入时(特殊情况),可以修改“根指针”
#include <stdio.h>
#include <stdlib.h>
#define FALSE 0
#define TRUE 1
typedef struct Node{
struct Node * link;
int value;
}Node;
int insert(register Node **rootp,int new_value){
register Node *current;
register Node *previous;
register Node *new;
/*initial the first node*/
current=*rootp;
previous=NULL;
/*look for accurate inserrting location*/
while(current!=NULL&¤t->value<new_value){
previous=current->link;
current=current->link;
}
/*allocate memory and assign new_value*/
new=(Node*)malloc(sizeof(Node));
if(new==NULL)
return FALSE;
new->value=new_value;
/*insert new Node*/
new->link=current;
if(previous==NULL)
*rootp=new;
else
previous->link=new;
return TRUE;
}
版本3:终极插入函数:只保持一个current指针,并始终拥有一个指向需要修改的link字段的指针(传递的根指针的指针),消除了处理在链表头插入节点的特殊情况
#include <stdio.h>
#include <stdlib.h>
#define FALSE 0
#define TRUE 1
typedef struct Node{
struct Node * link;
int value;
}Node;
int insert(register Node **linkp,int new_value){
register Node *current;
register Node *new;
/*look for accurate inserrting location*/
while((current=*linkp)!=NULL&¤t->value<new_value)
linkp=¤tt->link;
/*allocate memory and assign new_value*/
new=(Node*)malloc(sizeof(Node));
if(new==NULL)
return FALSE;
new->value=new_value;
/*insert new Node*/
new->link=current;
*linkp=new;
return TRUE;
}