2.3线性表——循环链表和双向链表基本操作的实现

注意:以下内容均省略思路,只有代码和时间复杂度。此内容为本人学习过程中的一些学习记录,如有错误,恳请各位指正、建议,末学将感激不尽!

目录

1.两个循环链表的合并

2.双向链表的结构定义

3.双向链表结构的对称性

4.双向链表的插入

5.双向链表的删除


1.两个循环链表的合并

LinkList Connect(LinkList Ta,LinkList Tb)//Ta和Tb是两个尾指针 
{
	p=Ta->next;//标记头结点 

	Ta->next=Tb->next->next;//a表尾连b表头

	free(Tb->next);//释放b头结点

	Tb->next=p; 

	return Tb; 	
}

注意:这里的两个循环链表均带有尾指针

时间复杂度:O(1)

2.双向链表的结构定义

tpyedef struct DuLNode{
  Elemtpye data;
  struct DuLNode *prior,*next;
} DuLNode,*DuLinkList;

3.双向链表结构的对称性

p->next->prior=p=p->prior->next 

此性质是双向链表结构的特性,对于双向链表操作的表示与实现尤为重要哦! 

4.双向链表的插入

Status DuListInsert(DuLinkList L,int i,Elemtpye e) 
{
	int j=1;
	DuLinkList p;
	
	p=L->next;
	p->prior=L;

	while(p&&i>j)
	{
		p=p->next;
		j++;
	}
	
	if(!p||i<j) return ERROR;
	
	DuLinkList s;
	s=(DuLinkList)malloc(sizeof(DuLNode));
	
	s->data=e;
	
	s->prior=p->prior;
	p->prior->next=s;
	p->prior=s;
	s->next=p;
	
	return OK;
}

注意:这是是在第i个元素之前插入

时间复杂度:O(n)

5.双向链表的删除

Status DuListInsert(DuLinkList &L,int i,Elemtpye &e) 
{
	int j=1;
	DuLinkList p;
	
	p=L->next;
	p->prior=L;

	while(p&&i>j)
	{
		p=p->next;
		j++;
	}
	
	if(!p||i<j) return ERROR;

	e=p->data;
	
	p->prior->next=p->next;
	p->next->prior=p->prior;
	free(p);
	
	return OK;
}

时间复杂度:O(n)


对于C/C++语言中的&(引用符号)的说明与作用,我推荐大家通过以下内容了解:

C 语言笔记 —— 函数参数带 & 和不带 & 的区别


以上就是文章的全部内容了,针对以上内容我还会继续改进和完善,希望大家能多给我提一些建议哦!

上一篇:【数据结构】第二章:双链表、静态链表、循环链表、静态链表、顺序表与链表比较


下一篇:数据结构-循环链表基础操作