码迷,mamicode.com
首页 > 其他好文 > 详细

线性表-链表(二)

时间:2015-05-08 22:15:37      阅读:129      评论:0      收藏:0      [点我收藏+]

标签:单链表   插入元素   删除元素   算法   

一,单链表的插入
(1)单链表如何插入一个新元素呢?
在单链表中
有序对:
技术分享 变成 技术分享
图例:
技术分享
注意:在单链表中插入只需要修改指针。若要在第 i 个结点之前插入元素,修改的是是第 (i-1) 个结点的指针。
(2)单链表的插入元素的代码怎么写呢?
代码如下:

    Status ListInsert(LinkList &L, int i ,ElemType e){
           p=L;
           j=0;
           while(p && j<i-1){
              p=p->next;
              ++j;
           }
           if(p && j==i-1){
               s=(LinkList)malloc(sizeof(LNode));
               s->data=e;
               s->next=p->next;
               p->next=s;
               return OK;
           }else{
               return ERROR;
           }
    }

分析:在上面这个单链表插入元素这个算法中,L为带头结点的单链表的头指针,在链表中第 i 个结点之前插入新的元素 e 。while循环的作用是,寻找第(i-1)个结点。

核心算法:
生成新结点s
s=(LinkList)malloc(sizeof(LNode));
为新节点s赋值
s->data=e;
让s 的next域指向 p 的next域,p就和ai 建立联系
s->next=p->next;
让p next域指向 s 的next域,p又和s 建立了联系
p->next=s;
成功插入新节点 e

图例:
技术分享

二,单链表的删除
(1)单链表如何插入一个新元素呢?
在单链表中
有序对:
技术分享变成 技术分享
图例:
技术分享
注意:在单链表中删除第 i 个结点时,要到单链表中第(i-2)个结点,修改其指向后继的指针。
(2)单链表的删除元素的代码怎么写呢?
代码如下:

    Status ListDelete(LinkList &L, int i ,ElemType &e){
           p=L;
           j=0;
           while(p->next && j<i-1){
              p=p->next;
              ++j;
           }
           if(p->next && j==i-1){
               q=p->next;
               p->next=q->next;
               e=q->next;
               free(q);
               return OK;
           }else{
               return ERROR;
           }
    }

分析:在上面这个单链表删除元素这个算法中,L为带头结点的单链表的头指针,在单链表中删除第 i 个结点元素 。while循环的作用是,寻找第(i-1)个结点,并且让 p 指向它

核心算法:
让 q 指向 p 的 next域,防止链的断裂,一旦断裂,后面的元素就找不到了
q=p->next;
让 p 指向 q 的next域,其实 p指向的也是是 p 的next 的 next 域
p->next=q->next;
让 e 存储 q指向的元素的值,也就是我们要删除的值,为了安全,我们先要删除的这个值保存起来,防止以后使用
e=q->next;
清空结点 q 的内存
free(q);
return OK;
图例:
技术分享

线性表-链表(二)

标签:单链表   插入元素   删除元素   算法   

原文地址:http://blog.csdn.net/gxseveryday/article/details/45583547

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!