双向链表 PPT课件
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
带表头的环形双向链表的删除
1 p
* *
x
* *
……......
^
2
p->llink->rlink=p->rlink p->rlink->llink=p->llink
int delete-d-l(head,x) NODE *head; char x; { NODE *p;
p=head->rlink; while (p!=head && p->data!=x)
head 空的带表头结点环形双向链表
head ……......
非空的带表头结点环形双向链表
带表头的环形双向链表的插入
将值为y的结点插在值为x的结点之后
p
x* *
23
4
1
y
q
……......
^
1.q->rlink=p->rlink 2.p->rlink=q 3.q->rlink->llink=q 4.q->llink=p
设某个环形链表的长度大于1,且表中即无头指针 也无头结点,已知s为指向链表中某个结点的指针, 试编写算法在链表中删除s所指结点的前驱结点
s
void dele(s) NODE *s; { NODE *p,*q;
p=s; while (p->link!=s)
百度文库{ q=p; p=p->link;}
q->link=s; free(p); }
#include <stdio.h> struct node { char data;
struct node *llink,*rlink; }; typedef struct node NODE; NODE *head;
head ^
head ^
双向链表
空的双向链表 head=NULL
……......
p=p->rlink; if (p= =head)
return(1);
P->llink->rlink=p->rlink; p->rlink->llink=p->llink; free(p); return(0); }
删除双向环形链表中第k(k>0)个结点
……. for(j=0;j<k&&p!=head;j++) p=p->rlink; if(p==head) return(1); p->llink->rlink=p->rlink; p->rlink->llink=p->llink; free(p); return(0);
第二次作业
1.试编写一个求已知单链表的数据域的平均值的 函数
2.已知带有头结点的环形链表中头指针为head, 试写出删除并释放数据域值为x的所有结点的 函数
int insert_d_l(head,x,y) NODE *head; char x,y; { NODE *p,*q;
p=head->rlink; while (p!=head && p->data!=x) p=p->rlink; if (p= =head) return(1);
q=(NODE*)malloc(sizeof(NODE)); q->data=y; q->rlink=p->rlink; p->rlink=q; q->rlink->llink=q; q->llink=p; return(0); }
编写在链表中s结点之前插入新结点的算法
p
s
q
• 要访问某个结点的前趋结点很麻烦,…...
• 要删除链表中一个结点时,仅给出该结点的指针 还不行……
• 在指定的结点之前插入一个新结点…..
双向链表
llink
data
rlink
• 左指针:llink 指向该结点的前趋结点
• 右指针:rlink 指向该结点的后继结点
^
非空的双向链表
环形双向链表
head
^
空的环形双向链表
head ……......
非空的环形双向链表 p->rlink->llink= p->llink->rlink= p
带表头结点的双向链表
head
^
^
空的带表头结点双向链表
head ^
……......
^
非空的带表头结点双向链表
带表头结点的环形双向链表