循环链表的主要操作

本文介绍了如何创建和操作循环单链表和循环双链表,包括尾插法建立链表、头插法建立链表、查找并删除结点的方法。循环链表是在单链表和双链表基础上,通过使终端结点指向表头结点形成闭合结构。文章还展示了具体的C++代码实现。
摘要由CSDN通过智能技术生成

循环单链表

循环单链表终端结点的next结点指针指向表头结点

循环单链表结点定义

typedef struct LNode {

	int data;
	struct LNode* next;

}LNode;

 

尾插法建立循环单链表

void createlistR(LNode *&L,int n) {
	LNode* r;
	LNode* s;
	L = new LNode;
	L->next=NULL;

	r = L;

	for (int i = 0; i < n; i++) {
		s = new LNode;
		cin >> s->data;
		r->next = s;

        
		r = s;    //让r跟踪着最后的结点   
	}

    r->next = L;//单链表之前这个位置是r->next=NULL,由于是循环单链表所以就指向头结点了
}

 

头插法建立循环单链表

void createlistF(LNode*& L, int n) {

	LNode* s;
	LNode* r;
	int flag = 1;
	L = new LNode;
	L->next = NULL;
	r = L;

	for (int i = 0; i < n; i++) {
		s = new LNode;
		cin >> s->data;

		s->next = L->next;
		L->next = s;    //单链表头插的话到这步就结束了

        //这个判断,是为了能让r指向最后一个结点
		if (flag) {
			r = s;
			flag = 0;
		}
		
	}

	r->next = L;    //将尾结点连上头结点
}

 

查找并删除

int DeleteData(LNode*& L,int x) {

	LNode* p = L->next;    //指向开始结点
	LNode* q;                //用来指向p的下一个结点的
	while (p != L) {    //注意此时退出循环的判定不是NULL了而是头结点
		
		if (p->next->data == x) 
        {            //如果发现p的下一个结点里的值符合要求,跳出循环
			break;
		}
		p = p->next;
	
	}

    if(p==L)
    {
        return 0;
    }
    else
    {
        q = p->next;        //就将p的下一个结点的值给q
		p->next = q->next;    //让p指向q的下一个结点地址
		delete q;
        return 1;
    }
	
}

 

循环双链表

循环双链表终端结点的next指针指向表头结点,头结点的prior指针指向表尾结点


 

循环双链表结点定义

typedef struct DLNode{
	int data;
	struct DLNode* prior;
	struct DLNode* next;

}DLNode;

 

尾插法建立循环双链表

void createDlistR(DLNode*& L, int n) {
	DLNode* s,*r;
	int i;
	L = new DLNode;
	L->next = NULL;
	L->prior = NULL;

	r = L;

	for (i = 0; i < n; i++) {
		s = new DLNode;
		cin >> s->data;

		s->prior = r;
		r->next = s;
		r = s;

	}
	
    //跟双链表就是下面这两句不一样,之前是r->next=NULL就行了的    
	r->next = L;
	L->prior = r;

}

 

查找结点

DLNode* findNode(DLNode* L, int x) {
	DLNode* p = L->next;

	while (p != L) {//跟双链表比下就是就判断条件不一样
		
		if (p->data == x) {
			return p;
		}
		p = p->next;
	
	}

	return NULL;
}

 

插入结点

void InsertData(DLNode *&L,int s) {
	DLNode* p = L->next;
	DLNode* x;

	while (p != L) {//也是一样的,就判定不一样
		
		if (p->data == s) {
			x = new DLNode;
			cin >> x->data;
            
            //下面这四行才是核心
			x->next = p->next;
			p->next = x;
			x->prior = p;
			x->next->prior = x;
		
		}

		p = p->next;
	
	}
}

 

删除结点

void DeleteData(DLNode*& L, int x) {
	DLNode* p = L->next;
	DLNode* q;

	while (p != L) {            //判断不一样
		if (p->data == x) {

			q = p->next;
			p->next = q->next;
			q->next->prior = p;

			delete q;
		
		}

		p = p->next;
	
	}


}

 

总结

循环单链表和循环双链表是由对应的单链表和双链表改造而来的,只需在终端结点和头结点间建立联系即可,需要注意的是,如果p指针沿着循环链表走,则判定p走到尾结点的条件也就不同了呦------至此链表就结束啦!!!

就当是对前面所学的一个复习吧.

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值