循环链表实现增、删、改、查等功能

循环链表有一个头指针指向头结点,如下图所示:


头结点不保存数据,所以head->next中的节点中保存数据。

代码实现:

#include <stdio.h>
#include <stdlib.h>

typedef struct node{//节点类型
	int data;//保存数据
	struct node* next;//指向下一个节点
}Node;

//typedef struct node Node;

#define SIZE sizeof(Node)

Node* head = NULL;//head保存头节点地址 结节点

//2 创建节点的函数
Node* creat_node(int d){/*创建一个节点,这个节点指向头节点*/
	Node* pn = malloc(SIZE);
	pn->data = d;
	pn->next = head->next;
	return pn;
}

//3 使用数组初始化链表
void init_list(int* p,int len){
	if(len<1)
		return;
	int i;
	Node* ph = NULL;
	Node* pn = NULL;
	ph = creat_node(p[0]);	//p指向头节点
	ph->next = ph;//头节点指向头节点
	head->next = ph;//结节点 指向 头节点

	for(i=1;i<len;i++){//其他节点,其他节点创建的时候就已经指向了头节点
		pn = creat_node(p[i]);
		ph->next = pn;
		ph = ph->next;
	}
}
//4 遍历循环单链表
void travel(){
	Node* p = head->next;
	printf("list:");
	while(p->next != head->next){
		printf("%d ",p->data);
		p = p->next;
	}
	printf("%d\n",p->data);
}

void show(int n){
	Node* p = head->next;
	printf("list:");
	int i;
	for(i=0;i<n;i++){
		printf("%d ",p->data);
		p = p->next;
	}
	printf("\n");
}

//5 添加一个节点到循环单链表末尾
void add(int d){
	//1 创建新节点
	Node* pn = creat_node(d);
	//2 找到链表的尾节点
	Node* p = head->next;
	while(p->next != head->next){
		p = p->next;
	}
	//3 新节点成为尾节点:把新节点链接到链表的尾节点之后
	p->next = pn;
}
//6 插入一个节点成为循环单链表的倒数第2个节点
void set(int d){
	int count = 0;
	int i;
	//1 创建新节点
	Node* pn = creat_node(d);
	//2 找到倒数第2个节点
		//2.1 得到链表节点总数
	Node* p = head->next;
	while(p->next != head->next){
		count++;
		p = p->next;
	}
		//2.2 p指向倒数第2个节点
	p = head->next;
	for(i=1;i<count;i++)
		p = p->next;
	//3 插入到倒数第2个节点之后
		//3.1 
	pn->next = p->next;
		//3.2 
	p->next = pn;
}
//7 找到数据为d的节点并返回其地址
Node *travel(Node* p,int d){
	while(1){
		if(p->data==d)
			return p;
		p=p->next;
		//找过一轮了
		if((head->next)->data==p->data && p->data!=d ){
			return NULL;
		}
	}

}
	
//8 删除数据为d的节点
Node *travel(Node* p,Node* q,int d){
	while(1){
		if(q->data==d){
			q=p->next;
			p->next=q->next;
			free(q);
			q=NULL;
		}
		p=p->next;
		if((head->next)->data==p->data && p->data!=d ){
			return NULL;
		}

	}
}
	
int main(){

	int a[5] = {11,22,33,44,55};
	//1 创建头节点 头节点不保存数据  一个结。
	//这个结保存头节点地址,尾节点指向头节点。
	head = (Node*)malloc(SIZE);
	head->data = 0;
	head->next = NULL;

	init_list(a,5);

	travel();

	set(100);

	show(10);
	return 0;
}


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值