您的位置:首页 > 其它

使用结构和指针(单/双链表)

2017-07-08 22:47 295 查看

单链表

为了记住链表的起始位置,可以使用一个根指针。根指针指向链表的第一个节点。 注意,根指针只是一个指针,它不包含任何数据,它指向链表的第一个节点。

插入数据到链表中,对于无序单链表,新值可以插入到任何位置。 把一个新节点插入到链表需要两个步骤。首先,新节点的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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  链表