数据结构 2024.8.5

双向链表

#include <stdio.h>
#include <stdlib.h>
#include "./douloopfunc.h"

//创建双向循环链表
Douloop * createdou(void)
{
	Douloop *head = (Douloop*)malloc(sizeof(Douloop));

	if(head == NULL)
	{
		printf("失败\n");
		return NULL;
	}

	//初始化节点
	head->next = NULL;  //让指针指向NULL
	head->prev = NULL;  //让指针指向NULL
	head->msg.len = 0;  //数据域存放链表长度

	//返回指针
	return head;
}


//遍历双向循环链表
void showdou(Douloop *head)
{
	Douloop *p = head;
	while(p->next != NULL)
	{
		p = p->next;
		printf("%d ",p->msg.data);
	}
	putchar(10);
}

//头插法
void inserthead(Douloop *head,datatype num)
{
	//创建一个新的节点
	Douloop *temp =createdou();
 
	//把数据存储到数据域中
	temp->msg.data = num;

	//头插法插入数据
	//next
	temp->next = head->next;
	head->next = temp;
	
	//prev
	temp->prev = head;
	if(temp->next != NULL)
		temp->next->prev = temp;

	//更新单链表的表长
	head->msg.len++;

	return ;
}

//尾插法
void inserttaril(Douloop *head,datatype num)
{

	//创建一个新的节点
	Douloop *temp =createdou();
 
	//把数据存储到数据域中
	temp->msg.data = num;

	//找到尾节点(遍历)
	Douloop *p = head;
	while(p->next != NULL)
		p=p->next;

	//尾插法插入数据
	//next
	temp->next = p->next;
	p->next = temp;

	//prev
	temp->prev = p;

	//更新单链表的表长
	head->msg.len++;

	return ;

}


//头删
void delhead(Douloop *head)
{
	//判断单链表是否为空
	if(head->next == NULL)
	{
		printf("链表为空\n");
		return;
	}
	//备份删除节点的地址
	Douloop *temp=head->next;
	
	//修改头结点指针域的指向
	//next
	head->next = temp->next;//head->next = head->next->next
	
	//prev
	head->next->prev = temp->prev;

	//更新单链表的表长
	head->msg.len--;

	//释放节点
	free(temp);
	temp = NULL;

	return;
}


//尾删
void deltrail(Douloop *head)
{
	//判断单链表是否为空
	if(head->next == NULL)
	{
		printf("链表为空\n");
		return;
	}
	//找到倒数第二个数据节点
	Douloop *p = head;
	while(p->next->next != NULL)
		p = p->next;
	
	//修改倒数第二个数据结点指针域的指向
	free(p->next);  //释放尾节点
	p->next = NULL;  //倒数第二个数据节点的指针域指向空

	//更新单链表的表长
	head->msg.len--;
	return;
}



//按位置插入
void insertloc(Douloop *head,int loc,datatype num)
{
	//判断插入位置是否合法
	if(loc<1)    
	{                                //小于1的位置都非法
		printf("位置非法\n");
		return;
	}
	//找到要插入的位置的前一个位置
	Douloop *p = head;
	for(int i=0;i<loc-1;i++)
	{
		p = p->next;
		if(p == NULL)    
		{
			printf("位置非法\n");
			return;
		}
	}

	//创建一个新的数据节点
	Douloop *temp =createdou();

	//初始化数据节点
	temp->msg.data = num;    //将要插入的数据放到新数据节点的数据域中

	//插入
	//next
	temp->next = p->next;  //将自己的指针指向插入位置的节点
	p->next = temp;        //把插入位置前的节点指向自己

	//prev
	if(temp->next != NULL)
		temp->next->prev = temp;
	temp->prev =  p;

	//更新单链表的表长
	head->msg.len++;

	return;

}

//按位置删除
void delloc(Douloop *head,int loc)
{
	//判断单链表是否为空
	if(head->next == NULL)
	{
		printf("链表为空\n");
		return;
	}
	//判断删除位置是否合法
	if(loc<1)
		printf("位置非法\n");

	//找到要删除的位置的前一个位置
	Douloop *p = head;
	for(int i=0;i<loc-1;i++)
	{
		p = p->next;
		if(p->next == NULL) //删除位置超出链表长度
		{
			printf("位置非法\n");
			return;
		}
	}

	//创建一个临时指针
	Douloop *temp;

	//删除
	//next
	temp = p->next;  //将要删除的节点备份
	p->next = temp->next;  //将删除节点的前一个节点的指针指向删除节点的后一个节点

	//prev
	if(p->next != NULL)
		p->next->prev = p;

	free(temp);
	temp = NULL;

	//更新单链表的表长
	head->msg.len--;

	return;

}

单向

#include <stdio.h>
#include <stdlib.h>
#include "./looplinkfunc.h"

//创建单向循环链表
Looplink * createlooplink(void)
{
	Looplink *head = (Looplink*)malloc(sizeof(Looplink));

	if(head == NULL)
	{
		printf("失败\n");
		return NULL;
	}

	//初始化节点
	head->next = head;  //让指针指向自己
	head->msg.len = 0;

	//返回指针
	return head;
}


//头插法插入数据
void insertloop(Looplink *head,datatype num)
{
	//创建一个新的节点
	Looplink *temp =createlooplink();
 
	//把数据存储到数据域中
	temp->msg.data = num;

	//头插法插入数据
	temp->next = head->next;
	head->next = temp;
	
	//更新单链表的表长
	head->msg.len++;

	return ;
}

//头删
void delheadloop(Looplink *head)
{
	//判断单链表是否为空
	if(head->next == head)
		printf("链表为空");

	//备份删除节点的地址
	Looplink *temp=head->next;
	
	//修改头结点指针域的指向
	head->next = temp->next;//head->next = head->next->next
	
	//更新单链表的表长
	head->msg.len--;

	//释放临时指针
	free(temp);
	temp = NULL;

	return;
}

//尾插法
void looptraillink(Looplink *head,datatype num)
{

	//创建一个新的节点
	Looplink *temp =createlooplink();
 
	//把数据存储到数据域中
	temp->msg.data = num;

	//找到尾节点(遍历)
	Looplink *p = head;
	while(p->next != head)
		p=p->next;

	//尾插法插入数据
	temp->next = p->next;
	p->next = temp;

	//更新单链表的表长
	head->msg.len++;

	return ;

}

//尾删
void loopdeltail(Looplink *head)
{
	//判断单链表是否为空
	if(head->next == head)
		printf("链表为空");

	//找到倒数第二个数据节点
	Looplink *p = head;
	while(p->next->next != head)
		p = p->next;
	
	//修改倒数第二个数据结点指针域的指向
	free(p->next);  //释放尾节点
	p->next = head;  //倒数第二个数据节点的指针域指向空

	//更新单链表的表长
	head->msg.len--;
}



//遍历单向循环链表
void showlooplink(Looplink *head)
{
	Looplink *p = head;
	while(p->next != head)
	{
		p = p->next;
		printf("%d ",p->msg.data);
	}
	putchar(10);
}

//按位置插入
void locinsertloop(Looplink *head,int loc,datatype num)
{
	//判断插入位置是否合法
	if(loc<1)
		printf("位置非法");
	
	//找到要插入的位置的前一个位置
	Looplink *p = head;
	for(int i=0;i<loc-1;i++)
	{
		p = p->next;
		if(NULL == head)
		{
			printf("位置非法");
			return;
		}
	}

	//创建一个新的数据节点
	Looplink *temp = (Looplink *)malloc(sizeof(Looplink));
	if(NULL == temp)
	{
		printf("失败");
		return;
	}

	//初始化数据节点
	temp->msg.data = num;    //将要插入的数据放到新数据节点的数据域中
	temp->next = NULL;      //指针初始化为NULL

	//插入
	temp->next = p->next;  //将自己的指针指向插入位置的节点
	p->next = temp;        //把插入位置前的节点指向自己


	//更新单链表的表长
	head->msg.len++;

	return;

}
//按位置删除
void locdel(Looplink *head,int loc)
{
	//判断单链表是否为空
	if(head->next == head)
		printf("链表为空");

	//判断删除位置是否合法
	if(loc<1)
		printf("位置非法");

	//找到要删除的位置的前一个位置
	Looplink *p = head;
	for(int i=0;i<loc-1;i++)
	{
		p = p->next;
		if(p->next == head)
		{
			printf("位置非法");
			return;
		}
	}

	//创建一个临时指针
	Looplink *temp;

	//删除
	temp = p->next;  //将要删除的节点备份
	p->next = temp->next;  //将删除节点的前一个节点的指针指向删除节点的后一个节点

	free(temp);
	temp = NULL;

	//更新单链表的表长
	head->msg.len--;

	return;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值