p35-p36循环链表的基本操作的实现:
// 合并循环列表 ta tb都是尾指针
LinkList Connect(LinkList ta,LinkList tb)
{
p = ta->next;
ta->next = tb->next>next;
delete tb->next;
tb->next = p;
return tb;
}
p38双向链表的基本操作的实现:——插入操作
p38双向链表的基本操作的实现:
// 定义循环双联表
typedef struct DuLnode{
Elem data;
struct DuLnode* piror,next;
}DuLonde,*DuLinkList;
// 获取循环双向列表的中的第i个元素的地址
DuLnode* GetElemP_Dul(DuLinkList L,int i)
{
DuLnode* p;
p = L->next;
for(int j = 1;j<i;j++)
{
p = p->next
}
return p;
}
// 双向链表的插入 (第i个位置插入数据e)
status ListInstert_DuL(DuLinkList& L,int i,ElemType e)
{
DuLnode* p;
if(!(p=GetElemP_Dul(L,i))) return ERROR;
s = new DuLnode;
s->data = e;
s->prior = p->prior;
p->prior->next = s;
s->next = p;
p->prior = s;
return OK;
}
p39双向链表的基本操作的实现:——删除操作
// 双向循环链表的删除(删除第i个元素,并用e返回)
status ListDelete_L(LinkList& L,int i, ElemType e)
{
DuLnode* p;
if(!(p = GetElemP_Dul(L,i))) return ERROR;
e = p->data;
p->prior->next = p->next;
p->next->prior = p->prior;
free(p);
return OK;
}
p40单链表、循环链表、双向链表时间效率比较:——删除操作
p41顺序表、链表的比较:
p42线性表的应用——线性表的合并:
p43线性表的应用——有序表的合并:
// 有序表的合并——顺序表的实现
void MergeList_Sq(SqList LA,SqList LB,SqList& LC)
{
ElemType* pa;
ElemType* pb;
pa = LA.elem; // 指针指向首元素
pb = Lb.elem;
LC.elem = new ElemType[LA.length+LB.length];
pc = LC.elem; // 指针指向首元素
pa_last = LA.elem+(pa.length-1);
pb_last = LB.elem+(pb.length-1); //指向最后一个元素
// 较小的值存入
while(pa<pa_last&&pb<pb_last)
{
if(*pa<=*pb) *pc++ = *pa++;
else *pc++ = *pb++;
}
// 将剩余的元素存如LC中
while(pa<pa_last) *pc++ = *pa++;
while(pb<pb_last) *pc++ = *pb++;
}
// 有序表的合并——链表实现
void MergeList_L(LinkList& La,LinkList& Lb,LinkList& Lc)
{
ElemType* pa = La->next; ElemType* pb = Lb->next;
ElemType* pc = Lc = La; // 将新的链表指向La
while(pa&&pb)
{
if(pa->data <= pb->data)
{
pc->next = pa;
pc = pa; // 向前
pa = pa->next;
}
else
{
pc->next = pb;
pc = pb;
pb = pb->next;
}
}
pc->next = pa?pa:pb;
}