14-建立单链表

插入节点操作:

这里写图片描述

x节点要插入到a节点后面,可以先将s指向要插入的x结点,p指向a节点

这里写图片描述

然后让x节点的next指针域指向a节点的后继节点,转换成代码就是:s->next = p->next。

这里写图片描述

然后让a节点的next指针域指向x节点,即p->next = s,完成插入元素操作。



我们发现整个插入元素操作只需要两步就可以完成:

s->next = p->next;
p->next = s;

注意:在进行插入元素操作时,需要先循环查找到要插入的节点的前驱节点的位置,再进行插入元素操作。



删除节点操作:

这里写图片描述

q = p->next;    //记录要删除的节点
p->next = q->next;  //p指向的节点指向要删除的节点的后继节点
free(q);            //释放要删除的节点空间

  删除节点元素时,需要先循环找到要删除的节点的前驱节点的位置,然后再定义一个临时的指针q指向要删除的节点,然后更新p指向的节点的指针域,指向要删除的节点的后继节点,再删除节点。

头插法建表:

这里写图片描述

  创建一个空表,然后将a,b,c,d这几个数据依次插入到链表的表头中。完成后链表中的节点插入顺序和实际的物理顺序是相反的。

void CreateListF(LinkList *&L,ElemType a[],int n)
{
    LinkList *s;
    int i;
    //创建链表头结点
    L=(LinkList *)malloc(sizeof(LinkList));
    //第一次头结点指向为NULL
    L->next=NULL;
    //然后把新节点插入到表头中
    for (i=0; i<n; i++)
    {
        //分配新节点的存储空间
        s=(LinkList *)malloc(sizeof(LinkList));
        //把数组中的数据拷贝到新节点中
        s->data=a[i];
        //然后把新节点插入到表头中
        s->next=L->next;
        //头结点指向新节点
        L->next=s;
    }
}

尾插法建表:

这里写图片描述

尾插法一般就是将新节点插到当前链表的表尾上。
第一次:把a节点插入到链表的尾部,完成后a节点就是尾节点了
第二次:把d节点插入到链表的尾部,完成后d节点就是尾节点了
第三次:把c节点插入到链表的尾部,完成后c节点就是尾节点了
第四次:把b节点插入到链表的尾部,完成后b节点就是尾节点了
当尾插法建表完成后,节点在逻辑上的插入顺序和实际的物理顺序是相同的。

尾插法实现:

void CreateListR(LinkList *&L,ElemType a[],int n)
{
        //注意:需要再定义一个尾指针r,始终指向链表的尾节点
    LinkList *s,*r;
    int i;
    //创建链表头结点,注意L是作为头结点,位置不能变
    L=(LinkList *)malloc(sizeof(LinkList));
    //第一次先让r指向头结点L
    r=L;
    //然后开始在尾节点插入
    for (i=0; i<n; i++)
    {
        //分配新节点的空间
        s=(LinkList *)malloc(sizeof(LinkList));
        s->data=a[i];
        //把新节点s插入到链表尾部
        r->next=s;
        //更新尾指针r,指向新节点s
        r=s;
    }
    //插入完毕后,把尾节点的指针域置为NULL
    r->next=NULL;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值