带结点双向链表的创建、增、删、改、查、销毁等功能代码

声明头文件创建结点数据类型:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef int data_t; //定义链表所需的数据类型
typedef struct Str	//定义结点数据类型
{
	
	data_t data;
	struct Str *per;
	struct Str *next;
}noer_r;

创建头结点:

noer_r *Create(void)	//定义函数Create函数用于创建头结点
{
	noer_r *head;
	head=malloc(sizeof(noer_r));	//动态开辟头结点的存储空间 
	if(head==NULL)			//判断空间是否开辟成功
		return NULL;
	memset(head,0,sizeof(noer_r)); //将头结点空间清零 
	head->next=head;		//定义结点后继指针指向
	head->per=head;		//定义结点前驱指针指向
	return head;		
}

增加/插入结点:

int Insert(noer_r *head,int loca,data_t da)	//定义函数Insert按位置插入结点
{
	if(head==NULL)		//判断头结点是否存在
		return -1;
	noer_r *p=head;
	noer_r *q;
	for(int i=0;i<loca;i++)		//找需要插入结点的前一个结点 
	{
		p=p->next;
		if(p==NULL)			//说明p已经是链表中最后一个结点下一个结点,插入失败 
			return -1;
	}
	q=malloc(sizeof(noer_r));		//创建插入的结点空间 
	if(q==NULL)
		return -1;
	/* 插入结点 */
	q->data=da;
	q->next=p->next;
	p->next=q;
	q->next->per=q;
	q->per=p;
	return 0;
}

遍历链表并输出结点数据:

int Traverse_output(noer_r *head)  //定义Traverse_output函数遍历链表并输出各链表结点的数据
{
	if(head==NULL)
		return -1;
	noer_r *p=head->next;		//定义指针存储起始有效数据结点的地址 
	while(p!=head)			//p ==head,说明已回到头结点,整个链表遍历完成 
	{
		printf("%d  ",p->data);	//访问当前结点的数据 
		p=p->next;
	}
	printf("\n");
	return 0;
}

删除结点:

int Delete_Vertex(noer_r *head,int loca)  //创建Delete_Vertex函数按位置删除结点
{
	if(head==NULL)
		return -1;
	if(head->next==NULL)
		return -1;
	noer_r *p=head->next;
	for(int i=0;i<=loca;i++)		//找到所需要删除的结点
	{	
		p=p->next;
	}
	/*删除p结点*/
	p->per->next=p->next;
	p->next->per=p->per;
	free(p);
	return 0;
}

修改指定位置结点数据:

int change(noer_r *head,int loca,data_t mydata)	//创建change函数对指定位置结点的数据进行修改
{
	if(head==NULL)
		return -1;
	if(head->next==NULL)
		return -1;
	noer_r *p=head->next;
	for(int i=0;i<=loca;i++)		//找到需要修改数据的结点
	{	
		p=p->next;
	}
	p->data=mydata;	//修改结点数据
	return 0;
}

查找指定位置结点数据并输出:

int check(noer_r *head,int loca)		//创建check函数查找指定位置结点,并将结点数据输出
{
	if(head==NULL)
		return -1;
	if(head->next==NULL)
		return -1;
	noer_r *p=head;
	for(int i=0;i<=loca;i++)		//找到想要查询位置的结点
	{
		p=p->next;
	}
	printf("第%d个结点的数据为:%d\n",loca,p->data);
	return 0;
}

销毁链表:

int Destruction(noer_r **head)	//创建Destruction函数销毁链表
{
	if(*head==NULL)
		return -1;
	noer_r *p=(*head)->next;
	noer_r *q;
	while(p!=*head)	//遍历链表,逐一将结点删除并释放结点资源空间
	{
		q=p;
		p=p->next;
		free(q);
	}
	free(*head);
	*head=NULL;
	return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值