数据结构1.2.1循环链表

一、两种循环链表的比较

1、头指针表示的循环链表:

(1)找a1的时间复杂度为O(1);

(2)找an的时间复杂度为O(n);

所以面对时常在首尾进行的表的操作时不方便;

2、尾指针表示的循环链表:

(1)a1的存储地址:R->next->next;

(2)an的存储位置:R;

时间复杂度均为O(1);

二、相关函数

1、尾插法建立尾指针循环链表

void creat_list_w(Linklist **L,int n)
{
	*L=(Linklist*)malloc(sizeof(Linklist));
	(*L)->next=*L;
	Linklist *p;
	int i;
	for(i=0;i<n;i++)
	{
		p=(Linklist*)malloc(sizeof(Linklist));
		scanf("%s%s%lf",p->date.isbn,p->date.name,p->date.price);
		p->next=(*L)->next;
		(*L)->next=p;
		(*L)=p;
	}
} 

2、头插法建立尾指针循环链表

void creat_list_t(Linklist **L,int n)
{
	*L=(Linklist*)malloc(sizeof(Linklist));
	(*L)->next=*L;
	Linklist *p,*q;
	q=(Linklist*)malloc(sizeof(Linklist));
	scanf("%s%s%lf",q->date.isbn,q->date.name,q->date.price);
	q->next=(*L)->next;
	(*L)->next=q;
	(*L)=q;
	int i;
	for(i=1;i<n;i++)
	{
		Linklist *p;
		p=(Linklist*)malloc(sizeof(Linklist));
		scanf("%s%s%lf",p->date.isbn,p->date.name,p->date.price);
        p->next=((*L)->next)->next;
        ((*L)->next)->next=p;
	}
}

3、插入节点

bool insert_elem(Linklist **L,int i,BOOK e)
{
	if(i<1||(*L)->next!=*L)
	{
		return false;
	}
	Linklist *p;
	p=((*L)->next)->next;
	int j=0;
	while(p!=(*L)->next&&j!=i-1)
	{
		j++;
		p=p->next;
	}
	if(p==(*L)->next||j<i-1)
	{
		return false;
	}
	if(j==i-1&&p!=(*L)->next)
	{
		Linklist *r;
		r=(Linklist*)malloc(sizeof(Linklist));
		r->date=e;
		r->next=p->next;
		p->next=r;
	}
	if(j==i-1&&p==(*L)->next)
	{
		Linklist *q;
		q=(Linklist*)malloc(sizeof(Linklist));
		q->date=e;
		p->next=q;
		q->next=(*L)->next;
		*L=q;
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值