链表:包含一些数据的独立的数据结构(通常称为节点)的集合。
单链表
根指针记录链表的起始位置,根指针指向链表的第一个节点,注意根指针只是一个指针,它不包含任何数据
最后一个节点的指针字段值为NULL,提示链表后面不再有任何节点。
用结构体创建一个简单的节点数据结构Node
typedef struct NODE {
struct NODE *link;
int value;
}Node;
插入新节点到有序的单链表
#include <stdlib.h>
#include <stdio.h>
#include "sll_node.h"
#define FALSE 0
#define TRUE 1
//register关键字可以将变量放到寄存器,提高速度
//linkp是指向根节点指针root的一个指针
sll_insert( register Node **linkp,int new_value)
{
register Node *current;
register Node *new;
/*
**寻找正确的插入位置,按序访问链表,直到到达一个值大于或等于新值的节点
*/
while((current = *linkp) != NULL &&
current->value < new_value)//这里先要检查当前节点current没到链表结尾不是NULL
linkp = ¤t->link; //然后才能去访问current的值
//linkp是根节点的指针可以让值插入到根节点之后
/*
**为新节点分配内存,如果分配失败,返回FALSE
*/
new = (Node *)mallco(sizeof(Node));
if(new == NULL)
return FALSE;
new->value = new_value;
/*
**在链表中插入新节点,返回TRUE
*/
new->link = current;
*linkp = new;
return TRUE;
}
双链表
定义节点
typedef struct NODE {
struct NODE* pre;
struct NODE* bwd;
int value;
}Node;
编写一个函数插入有序的双链表中
#include <stdlib.h>
#include <stdio.h>
#include "double_liked_list_node.h"
int dll_insert(register Node * rootp,int value )
{
register Node *this;
register Node *next;
register Node *newnode;
for(this = rootp; (next = this->fwd)!=NULL; this = next){
if(next->value == value) return 0;
if(next->value > value) break;
}
newnode = (Node*)malloc(sizeof(Node));
if( newnode == NULL )
return -1;
newnode->value = value;
newnode->fwd = next;
this->fwd = newnode;
if(this != rootp)
newnode->bwd = this;
else
newnode->bwd = NULL;//根指针的值为空只是个指针,
//因此newnode是第一个节点的话bwd就是NULL
if(next != NULL)
next->bwd = newnode;
else
rootp->bwd = newnode;
}