数据结构---双向循环链表

双向循环链表:

1双向对应有一个指向前一个节点的prev和一个指向和一个节点的node,和一个数据域data,

2循环就是连起来跟一个园一样,就是最后一个节点指向头节点,头节点的前一个prev指向尾节点

代码实战

1创建结构体,基本程序框架



//头文件
#include<stdio.h>
#include<stdlib.h>

//宏
#define  DataType  int
//全局变量

//结构体
typedef struct node
{
	DataType data;
	struct node* prev;
	struct node* next;
}node,*Node;
//函数



int main()
{
	return 0;
}

 2实现链表初始化函数,增加函数,打印/遍历函数

初始化函数

Node Init(Node phead) {
	phead = malloc(sizeof(node));
	if (phead == NULL)
	{
		printf("malloc file\n");
		return -1;
	}
	phead->next = phead;
	phead->prev= phead;
	return phead;
}

尾插函数

int add(Node phead, int num)
{
	//创建节点
	Node newnode = NULL;
	newnode = malloc(sizeof(node));
	newnode->data = num;
	newnode->next = NULL;
	newnode->prev = NULL;
	
	//找到尾
	Node  cur = NULL;
	for (cur = phead; cur->next != phead; cur = cur->next);
	cur->next = newnode;
	newnode->prev = cur;
	phead->prev = newnode;
	newnode->next = phead;
	
	return 0;
}

遍历函数

int show(Node phead)
{
	if (phead == NULL)
	{
		printf("NULL\n");
		return 0;
	}
	Node cur = NULL;
	for (cur = phead->next; cur != phead; cur = cur->next)
	{
		printf("%d->", cur->data);
	}
	printf("NULL\n");
	return 0;
	
}

效果演示

int main()
{
	Node phead = NULL;
	phead = Init(phead);
	add(phead, 1);
	add(phead, 2);
	add(phead, 3);
	add(phead, 4);
	show(phead);
	return 0;
}

 

 

3修改与删除 

修改函数
int change(Node phead, int num1, int num2)
{
	if (phead == NULL)
	{
		printf("phead is null\n");
		return -1;
	}
	Node cur = NULL;
	for (cur = phead->next; cur != phead; cur = cur->next)
	{
		if (cur->data == num1)
		{
			cur->data = num2;
			return 0;
		}
	}
	printf("no find %d\n", num1);
	return 0;
}
删除函数
void delete(Node phead, int num)
{
	if (phead == NULL)
	{
		printf("phead is NULL\n");
		return 0;
	}
	Node cur1 = NULL;
	Node cur2 = NULL;
	for (cur1 = phead, cur2 = phead->next; cur2 != phead; cur1 = cur2, cur2 = cur2->next)
	{
		if (cur2->data == num)
		{
			cur1->next = cur2->next;
			cur2->next->prev = cur1;
			free(cur2);
			return 0;
		}
	}
	printf("no find num\n");
}
效果
int main()
{
	Node phead = NULL;
	phead = Init(phead);
	add(phead, 1);
	add(phead, 2);
	add(phead, 3);
	add(phead, 4);
	show(phead);
	delete(phead, 1);
	delete (phead, 2);
	change(phead, 3, 5);
	show(phead);

	change(phead, 6, 5);

	delete(phead, 3);
	delete (phead, 4);
	show(phead);
	return 0;
}

 

最终代码



//头文件
#include<stdio.h>
#include<stdlib.h>

//宏
#define  DataType  int
//全局变量

//结构体
typedef struct node
{
	DataType data;
	struct node* prev;
	struct node* next;
}node,*Node;
//函数
Node Init(Node phead) {
	phead = malloc(sizeof(node));
	if (phead == NULL)
	{
		printf("malloc file\n");
		return -1;
	}
	phead->next = phead;
	phead->prev= phead;
	return phead;
}

int add(Node phead, int num)
{
	//创建节点
	Node newnode = NULL;
	newnode = malloc(sizeof(node));
	newnode->data = num;
	newnode->next = NULL;
	newnode->prev = NULL;
	
	//找到尾
	Node  cur = NULL;
	for (cur = phead; cur->next != phead; cur = cur->next);
	cur->next = newnode;
	newnode->prev = cur;
	phead->prev = newnode;
	newnode->next = phead;
	
	return 0;
}

int show(Node phead)
{
	if (phead == NULL)
	{
		printf("NULL\n");
		return 0;
	}
	Node cur = NULL;
	for (cur = phead->next; cur != phead; cur = cur->next)
	{
		printf("%d->", cur->data);
	}
	printf("NULL\n");
	return 0;
	
}

int change(Node phead, int num1, int num2)
{
	if (phead == NULL)
	{
		printf("phead is null\n");
		return -1;
	}
	Node cur = NULL;
	for (cur = phead->next; cur != phead; cur = cur->next)
	{
		if (cur->data == num1)
		{
			cur->data = num2;
			return 0;
		}
	}
	printf("no find %d\n", num1);
	return 0;
}

void delete(Node phead, int num)
{
	if (phead == NULL)
	{
		printf("phead is NULL\n");
		return 0;
	}
	Node cur1 = NULL;
	Node cur2 = NULL;
	for (cur1 = phead, cur2 = phead->next; cur2 != phead; cur1 = cur2, cur2 = cur2->next)
	{
		if (cur2->data == num)
		{
			cur1->next = cur2->next;
			cur2->next->prev = cur1;
			free(cur2);
			return 0;
		}
	}
	printf("no find num\n");
}
int main()
{
	Node phead = NULL;
	phead = Init(phead);
	add(phead, 1);
	add(phead, 2);
	add(phead, 3);
	add(phead, 4);
	show(phead);
	delete(phead, 1);
	delete (phead, 2);
	change(phead, 3, 5);
	show(phead);

	change(phead, 6, 5);

	delete(phead, 3);
	delete (phead, 4);
	show(phead);
	return 0;
}

 

 
 
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值