数据结构基础之带尾结点的单循环链表

带尾结点指针的单循环链表结构

//带尾结点的单循环链表
//可以不要头指针

typedef int elementType;
typedef struct LinkedList{
	elementType data;
	struct LinkedList* next;
}node;

带尾结点指针的单循环链表初始化

//R是尾结点 
void initialList(node *&R){
	R = new node;//申请头结点 
	R->next = R; 
} 

求表长度

//求表长度
int listLength(node* R){
	int len = 0;
	node* p = R->next->next;//指向表中的第一个元素 
	
	//当p指针没有指向头结点时继续循环 
	while (p != R->next){
		len++;
		p = p->next;
	}
	
	return len;
} 

插入操作

//插入操作 
int listInsert(node *R, int i, elementType x){
	node* p, *S;
	int k = 0;
	//指向头结点 
	p = R->next;
	
	//找到要插入位置的前一个结点 
	while (k != i-1 && p->next != R->next){
		k++;
		p = p->next;
	} 
	
	//i超出范围 
	if (k != i-1){
		return false;
	}
	else{
		S = new node;
		S->data = x;
		S->next = p->next;
		p->next = S;
		//如果插入的位置在尾结点之后,则修改尾结点的指向 
		if (R->next == S)
			R = S;
			
		return true;
	}
}

删除操作

//删除操作 
bool listDelete(node *&R, int i, elementType &x){
	node* p = R->next;
	node* u;
	int k = 0;
	//找到要删除结点的前一个结点 
	while (k != i-1 && p->next != R->next){
		k++;
		p = p->next;
	}
	//如果p指向尾结点,则i超出范围 
	if (p->next == R->next)
		return false; //i超出范围
	else{
		u = p->next;
		p = u->next;
		x = u->data;
		
		//如果删除的是尾结点,则修改尾结点指针的指向 
		if (R == u)
			u = p;
			
		delete u;
		
		return true;
	} 
}

将A、B两个带尾指针的单循环链表首 尾相接,尽量节省时间

void scrMergeAB(node *&A, node *&B){
	node* u;
	
	u = A->next;//保留A的头结点的位置 
	A->next = B->next->next;//将A的尾结点指针指向B的第一个结点 
	delete B->next;//删除B的头结点 
	B->next = u;//将B的尾结点的next指针指向A的头结点 
	
	A = B;//A和B指针都指向新链表的尾结点 
} 
  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值