5线性表-双向链表和习题课

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
ai an-i+1 i=1,…,length/2
L.elem[L.length - i]=L.elem[i - 1]; }
}
习题讲解-2.22(方法一)
2.22 逆置线性链表
L a1 a2 … an
L
an
an-1

a1
习题讲解-2.22(方法一)
(a1, a2, …, ai-(an, an-1, …, ai+1, ai, ai-1, …, a2, a1) ai的前驱变成了后继,后继变成了前驱
双向链表
四、头指针的描述 typedef struct DuLNode * 五、逻辑形态 a2 DuLinkList;
L L
a1
a3
部分操作的实现
InitList(&L) ListInsert(&L, i, e)
ListLength(L)
ListDelete(&L, i, &e)
InitList
ListInsert
逻辑结构的变化
(a1, …, ai-1, ai, …, an) → (a1, …, ai-1, e, ai, …, an) <ai-1, ai> → <ai-1, e>, <e, ai>
存储结构的变化
ListInsert
p ai-1 e s
s->next = p->next; p->next = s; s->prior = p; s->next->prior=s;
}
ListInsert
生成一个新结点存放数据元素e 的代码是:
s =(DuLNode *) malloc(sizeof(DuLNode)); if(!s) return(ERROR); s->data = e;
ListInsert
s->next = p->next; p->next = s;
s->prior = p; s->next->prior=s;
该问题的核心是要修改数据元素的邻里关系
习题讲解-2.22(方法一)
L
a1 t p
a2
q
1、p指向要修改指针的结点,初始时是a1 2、q指向p的后继? 否则,修改p的指针,链就断了 3、t指向p的前驱?
在新表中t是p的后继
4、p->next=t,t=p,p=q,q=p->next 5、重复执行,直到q为空指针
q = p->next; p->next = p->next->next;
p->next ->prior= p; e = q->data;
free(q);
ListDelete(讨论)
L a1 a2 a3
ai-1 i=1? i=length??? p
ai
ai+1
p->next = p->next->next;
S(x) = 1 + 3x10000 – 2x20000
稀疏一元多项式
一般情况下的一元稀疏多项式可写成: Pn(x) = p1xe1 + p2xe2 + …+ pmxem 其中:pi 是指数为ei 的项的非零系数,
0≤ e1 < e2 < ┄ < em = n 可以下列线性表表示:
((p1, e1), (p2, e2), …, (pm,em))
a2a1ai的前驱变成了后继后继变成了前驱该问题的核心是要修改数据元素的邻里关系1p指向要修改指针的结点初始时是a12q指向p的后继否则修改p的指针链就断了3t指向p的前驱4pnextttppqqpnext5重复执行直到q为空指针6lnextnextnulllnextp
线性表(List)
复习
双向链表
p->next->prior = p;
双向循环链表
逻辑形态 L
L
a1
a2
a3
1、每个结点的next域构成了一个循环单链表
2、每个结点的prior域构成了另一个循环单链表
双向循环链表-Insert
L
a1
a2
a3
p ai-1
e
s->next = p->next; p->next = s;
ai
s
s->prior = p; s->next->prior=s;
一元多项式的操作
AH = 1 - 3x6 + 7x12 BH = - x4 + 3x6 - 9x10 + 8x14 AH
1 0 -3 6 7 12
BH
-1
4
3
6
-9 10 8 14
CH
1
0
-1 7
4 12
-9 10
8
14
习题讲解-2.21
L.elem L.length L.listsize a1 a2 a3 a4
习题讲解-2.22(方法二)
p succ p succ p succ p
a2 a3
L
a1 a3
L
a2

a1
习题讲解-2.22(方法二)
void reverse(LinkList &L) { // 逆置带头结点的单链表 L p=L->next; L->next=NULL; while ( p) { succ=p->next; // succ指向*p的后继 p->next=L->next; L->next=p; // *p插入在头结点之后 p = succ; } }
稀疏一元多项式
例如: P999(x) = 7x3 - 2x12 - 8x999
( (7, 3), (-2, 12), (-8, 999))
稀疏一元多项式的实现
typedef LinkList polynomial; // 用带表头结点的有序链表表示多项式 typedef struct { float coef; int expn; } ElemType; // 项的表示 // 系数 // 指数
ListInsert(讨论)
L a1 a2 a3
i=1?
i=length+1??? e s s->prior = p; s->next->prior=s;
s->next = p->next; p->next = s;
ListDelete(讨论)
逻辑结构的变化:
(a1, …, ai-1, ai, ai+1, …, an) <ai-1, ai>, <ai, ai+1> (a1, …, ai-1, ai+1, …, an) <ai-1, ai+1>
小结
双向链表 由于结构的不合理,使用的较少
双向循环链表
作业
作业:2.8,2.32
ListLength
int ListLength(DuLinkList L){
count=0; p=L; while( p->next){ p=p->next;
count++ } return(count); } }
count=0; p=L; while( p->prior){ p=p->prior; count++ } return(count);
双向循环链表-Delete
L
a1
a2
a3
ai-1
ai
ai+1
p p->next = p->next->next; p->next->prior = p;
线性表的应用---一元多项式
pn ( x) p0 p1 x p2 x ... pn x
2 n
p = (p0, p1, …,pn) 但是对于形如:

2.21 逆置顺序表

an-3 an-2 an-1 an
a1 an
a2an-1 a3an-2
ai an-i+1
i=1,…,length/2
L.elem L.length an an-1 an-2 an-3 … … a4 a3 a2 a1
L.listsize
习题讲解-2.21
void reverse(SqList &l){ if(L.length<=1)return; for(i=1;i<=L.length%2;i++){ tmp=L.elem[i-1]; L.elem[i-1]=L.elem[L.length -i];
存储结构的变化:
ListDelete(讨论)
ai-1
ai
ai+1
p q=p->next;
q
p->next = p->next->next;
p->next->prior = p;
ListDelete(讨论)
1、p指向头结点 2、执行i-1 次p=p->next,p指向了第i-1个结点 3、q=p->next,q指向第i个结点 4、修改第i-1个和第i个结点的指针 5、释放结点q
ai
ListInsert
分析:
1、p指向头结点 2、执行p=p->next i-1次,使得p指向第 i-1 个 结点
3、申请一个新结点s,调整s、第i-1和第i个 结点的指针
ListInsert
找到第i-1个结点的代码是:
p=L; j=0; while(j<i -1 ){
p=p->next; j++
习题讲解-2.22( 扩展)
双向循环链表???
L
a1
a2
a3
L
习题讲解-2.22( 扩展)
L
a1
a2
a3
qp
qp
qp
qp
q=p->next;
p->next=p->prior; p->prior=q;
习题讲解-2.22( 扩展)
void reverse(DuLinkList &L) { // 逆置带头结点的单链表 L p=L; q=p->next; while ( q!=L) { p->next=p->prior; p->prior=q; p=q; q = p->next; } }
部分操作的实现 双向循环链表
一元多项式 小结和作业 习题讲解
复习-单链表
逻辑形态
L 空链表 L
a1
a2
a3
复习-循环单链表
头指针: L L 尾指针:
a1
a2 a3 a1
a2
a3
L
双向链表
一、作用:方便定位一个结点的前驱结点和后继结点 二、结点的形式
三、C语言描述
ai
typedef struct DuLNode { ElemType data; struct DuLNode *prior; struct DuLNode *next; } DuLNode;
L
Status InitList(DuListLink &L){
node=(DuLNode *)malloc(sizeof(DuLNode)); if(!node)return(ERROR); node->prior=node->next=NULL;
L=node;
return(OK); }
ListLength
L a1 1、p指向头结点, j=0 2、如果p->next不为空,j++, p->next 3、重复2,直到 p->next为空, j即为长度。
a2
a3
ListLength(讨论)
L
a1
1、p指向头结点, j=0
a2
a3
2、如果p->prior不为空,j++, p->prior
3、重复2,直到 p->prior为空, j即为长度。
6、L->next->next=NULL, L->next=p;
习题讲解-2.22(方法一)
L
L
1、如果表中只有一个结点,不处理 2、如果表是空表,不处理
习题讲解-2.22(方法一)
void reverse(LinList &L){ if(!L->next || !L->next->next) return;//空表或单元素 t=L, p=t->next, q=p->next;//t, p, q分别指向ai-1,ai,ai+1 while(q){ p->next=t; t=p, p=q, q=p->next; } L->next->next=NULL; L->next=p; }
相关文档
最新文档