· 链表
链表是包含数据的独立数据结构(节点)的集合,其每个节点通过指针连接在一起。通常,节点是动态分配的。
· 单链表
每个节点包含一个指向链表下一节点的指针。最后一个指针的值为NULL,提示链表后不再有元素。其简单的结构声明如下,
//定义链表节点结构体
typedef struct NODE
{
struct NODE *link;
int value;
}Node;
在单链表中插入元素节点,
#define FALSE 0
#define TRUE 1
//定义链表节点结构体
typedef struct NODE
{
struct NODE *link;
int value;
}Node;
//在单链表中插入元素
int sll_insert(register Node **linkp,int value)
{
register Node *current; //定义指向当前节点的指针
register Node *New; //定义要插入的指针
while((current=*linkp)!=NULL&¤t->value<value)
{
linkp=¤t->link; //linkp指向下一个节点
}
//为新的节点分配内存
New=(Node *)malloc(sizeof(Node));
if(New==NULL)
{
return FALSE;
}
New->value=value;
//将新的节点插入链表
New->link=current;
*linkp=New;
return TRUE;
}
· 双链表
在一个双链表中,每个节点都包含两个指针,一个指向前一个节点,一个指向后一个节点。其简单的结构声明如下,
typedef struct NODE
{
struct NODE *fp;
struct NODE *bp;
int value;
}node; //定义双链表的节点
在双链表中插入元素,可能有以下4种情况,
1、新值位于链表中间;
2、新值位于链表起始;
3、新值位于链表末尾;
4、新值既位于起始,又位于末尾,空表。
其实现代码如下,
//双链表中插入元素
typedef struct NODE
{
struct NODE *fp;
struct NODE *bp;
int value;
}node; //定义双链表的节点
//双链表元素插入函数
int dll_insert(node *rootp,int value)
{
node *This;
node *Next;
node *newnode;
//判断在原链表中是否有value值,如果是就返回
for(This=rootp;(Next=This->fp)!=NULL;This=Next)
{
if(Next->value==value) //如果原链表中有value
{
return 0;
}
if(Next->value>value) //如果下一节点的数值大于value
{
break; //找到要插入节点的位置
}
}
newnode=(node *)malloc(sizeof(node)); //为新的节点分配内存空间
if(newnode==NULL)
return -1; //如果未分配到内存
newnode->value=value; //添加值
//把新值(新节点)添加到链表中
//1、中间;2、起始;3、末尾;4、空表
if(Next!=NULL) //没有位于链表尾部 1 2情况
{
if(This!=rootp) //情况1:中间,没有位于链表起始位置
{
This->fp=newnode;
newnode->fp=Next;
Next->bp=newnode;
newnode->bp=This;
}
else //情况2:起始位置
{
rootp->fp=newnode;
newnode->fp=Next;
Next->bp=newnode;
newnode->bp=NULL;
}
}
else //位于链表尾部, 3 4情况
{
if(This!=rootp) //情况3:不是空表
{
rootp->bp=newnode;
newnode->bp=This;
This->fp=newnode;
newnode->fp=NULL;
}
else //情况4 :空表
{
newnode->fp=NULL;
rootp->fp=newnode;
newnode->bp=NULL;
rootp->bp=newnode;
}
}
return 1;
}