单链表
为了记住链表的起始位置,可以使用一个根指针。根指针指向链表的第一个节点。 注意,根指针只是一个指针,它不包含任何数据,它指向链表的第一个节点。
插入数据到链表中,对于无序单链表,新值可以插入到任何位置。 把一个新节点插入到链表需要两个步骤。首先,新节点的link字段必须设置为指向它的目标后续节点。其次,前一个节点的link字段必须设置为指向这个新节点。
例:
链表结构
typedef struct NODE{
struct NODE *link;
int value;
}Node;
创建一个头节点
Node *root = (Node *)malloc(sizeof(Node));
if(root == NULL)
{
printf("malloc error!\n");
return;
}
初始化链表
Node *q = (Node *)malloc(sizeof(Node));
q->value = 3;
root->link = q;
q->link = NULL;
升序插入一个节点的方法
int insertNode(Node *root,int value)
{
Node *current,*new;
new = (Node *)malloc(sizeof(Node));
while((current = root->link) != NULL && current->value < value)
{
root = current;
}
new->value = value;
new->link = current;
root->link = new;
return TRUE;
}
双链表
双链表中的每个节点包含两个link字段:其中一个指向链表的下一个节点,另一个指向链表的前一个节点。双链表有两个根指针,分别指向第一个节点和最后一个节点。因此,遍历双链表可以从任何一端开始,而且在遍历过程中可以改变方向。为了把一个新节点插入到双链表中,我们必须修改四个指针。新节点的前向和后向link字段必须被设置,前一个节点的后向link字段和后一个节点的前向link字段也必须进行修改,使它们指向这个新节点。
当我们把一个节点插入到一个链表时,可能出现四种情况:
1.新值可能插入到链表的中间位置
2.新值可能插入到链表的起始位置
3.新值可能插入到链表的结束位置
4.新值可能即插入到起始位置也插入到结束位置(原链表为空)
例:
链表结构:
typedef struct doubleNode{
struct doubleNode *fwrd;
struct doubleNode *bwrd;
int value;
}DoubleNode;
初始化
root = (DoubleNode *)malloc(sizeof(DoubleNode));
q = (DoubleNode *)malloc(sizeof(DoubleNode));
root->fwrd = q;
root->bwrd = q;
q->value = 5;
根据四种情况升序插入链表的结构
/*如果链表已经有该值,则返回0,如果插入正常,返回1*/
int doubleinsert(DoubleNode *link,int value)
{
DoubleNode *this,*next,*newnode;
this = link;
for(;(next = this->fwrd) != NULL;this = next)
{
if(next->value == value)
{
printf("The insert value again");
return FALSE;
}
if(next->value > value)
{
break;
}
}
newnode = (DoubleNode *)malloc(sizeof(DoubleNode));
newnode->value = value;
if(newnode == NULL)
{
printf("Malloc newnode error!\n");
return FALSE;
}
/*head and middle insert*/
if(next != NULL)
{
if(next->bwrd == NULL)
{
printf("head insert!\n");
newnode->fwrd = next;
next->bwrd = newnode;
this->fwrd = newnode;
}
else
{
printf("middle insert!\n");
newnode->fwrd = next;
next->bwrd = newnode;
this->fwrd = newnode;
newnode->bwrd = this;
}
}
/*tail and headandtail insert*/
else
{
if(this->bwrd != NULL)
{
printf("tail insert!\n");
this->fwrd = newnode;
newnode->bwrd = this;
link->bwrd = newnode;
newnode->fwrd = NULL;
}
else
{
printf("headandtail insert!\n");
this->fwrd = newnode;
link->bwrd = newnode;
newnode->fwrd = NULL;
}
}
return TRUE;
}