线性表-链表(二)

来源:互联网 发布:淘宝可以延长收货多久 编辑:程序博客网 时间:2024/06/16 21:29

一,单链表的插入
(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;
图例:
这里写图片描述

0 0
原创粉丝点击