C有序链表的终极插入函数

版本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&&current->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&&current->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&&current->value<new_value)
      linkp=&currentt->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;
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值