数据结构—单链表的插入
关于单链表的概念以及一些基本的知识就不说明了,直接上代码!
整个链表有一个根节点,用以指向第一个元素,在插入的过程中要考虑几个问题:
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和指针》!