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

单链表

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

插入数据到链表中,对于无序单链表,新值可以插入到任何位置。 把一个新节点插入到链表需要两个步骤。首先,新节点的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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值