单链表、双链表、循环链表总结

1.单链表(为升序链表,value按升序排列)

#include <stdio.h>
#include <malloc.h>

typedef struct NODE
{
	struct NODE *link;
	int 	value;
	
} Node;//最好放在头文件中


Node 	*sll_creat();
int 	sll_length(Node *p);
Node 	*sll_del(Node *head,int value);
void 	sll_print(Node *head);
Node 	*sll_insert(Node *head,int n);
Node 	*sll_reverse(Node *head);

int main()
{
	Node *p;
	p=sll_creat();
	sll_print(p);
	p=sll_del(p,3);
	sll_print(p);
	p=sll_insert(p,4);
	sll_print(p);
	p=sll_reverse(p);
	sll_print(p);
	return 0;
}

Node *sll_creat()
{
	int data;
	Node *p;
	Node *head;
	Node *new;
	Node *temp;//用来删除没用的head
	head=(Node *)malloc(sizeof(Node));
	p=head;//head没有改变, 改变的是p, head用来返回
	printf("please input the values,end with EOF:\n");
	while(scanf("%d",&data)==1)
	{
		new=(Node *)malloc(sizeof(Node));
		if(new==NULL)
		{
			printf("malloc error!\n");
			return NULL;
		}
		new->value=data;
		p->link=new;
		p=new;
	}
	temp=head;
	head=head->link;//将第一个无用节点head去除,如何free掉?
	p->link=NULL;
	free(temp);//删除没用的head,防止内存泄露
	return head;
}

int sll_length(Node *p)
{
	int count=0;
	while(p->link!=NULL)
	{
		count++;
		p=p->link;
	}
	count++;//由于尾节点的存在
	return count;

}
void sll_print(Node *head)
{
	int n;
	Node *p=head;
	n=sll_length(p);
	printf("there are %d records,they are:\n",n);
	while(p->link!=NULL)
	{
		printf("%d\n",p->value);
		p=p->link;
	}
	printf("%d\n",p->value);
}
/*
*1.此函数缺点是只能删除第一个value出现的节点
*2.此函数验证了在结构体中的value跟局部变量value不冲突
*/
Node *sll_del(Node *head,int value)//缺点,只能删除第一个value所在的节点
{
	Node *p1,*p2;
	p1=head;
	while(value!=p1->value&&p1->link!=NULL)//遍历链表,找到需要删除的节点
	{
		p2=p1;
		p1=p1->link;
	}
	if(value==p1->value)
	{
		if(p1==head)//单独处理头节点
		{
			head=p1->link;
			free(p1);
		}
		else
		{
			p2->link=p1->link;
			free(p1);
		}	
	}
	else
	{
		if(p1->value==value)//单独处理尾节点
		{
			p2->link=NULL;
			free(p1);
		}
		else
			printf("can't find the value:%d",value);
	}
	return head;
	
}
/*
*此函数是在节点中的数字递增的前提下才起作用(即该链表要为有序链表,value按升序排列)
*
*/
Node *sll_insert(Node *head,int n)
{
	Node *p=head;
	Node *p_prev;
	Node *p0=(Node *)malloc(sizeof(Node));
	while(n>=p->value&&p->link!=NULL)
	{
			p_prev=p;
			p=p->link;
	}
	if(p->value>n)
	{
		if(p==head)
		{
			p0->value=n;
			p0->link=head;
			head=p0;
			
		}
		else
		{
			p0->value=n;
			p_prev->link=p0;
			p0->link=p;
		}
	}
	else
	{	
		p0->value=n;
		p->link=p0;
		p0->link=NULL;
	}
	return head;
}

Node *sll_reverse(Node *head)
{
	Node *p1;
	Node *p2;
	Node *p3;
	p1=head;p2=p1->link;
	if(p1==NULL)
	{
		return head;
	}
	else if(p1->link==NULL)
	{
		head=p1->link;
		head->link=p1;
		p1->link=NULL;
	}
	else
	{
		while(p2->link)
		{
			p3=p2->link;
			p2->link=p1;
			p1=p2;
			p2=p3;
		}
	}
	p2->link=p1;
	head->link=NULL;
	head=p2;
	return head;
}

2.双链表:(value升序)

#include <stdio.h>
#include <malloc.h>
typedef struct NODE
{
	struct NODE	*next;
	struct NODE	*prev;
	int	value;
} Node;//不要忘了分号
Node	*dll_creat();
void	dll_print(Node *head);
int 	dll_length(Node *head);
Node	*dll_del(Node *head,int value);
Node *dll_insert(Node *head,int n);
int main()
{
	Node *p=dll_creat();
	dll_print(p);
	p=dll_del(p,5);
	dll_print(p);
	p=dll_insert(p,6);
	dll_print(p);
	return 0;
}
Node *dll_creat()
{	
	Node *head;
	Node *p;
	Node *temp;
	Node *new;
	int value;
	printf("please input the values,end with eof:\n");
	head=(Node *)malloc(sizeof(Node));
	if(head==NULL)
	{
		printf("malloc error!!!\n");
		return NULL;
	}
	p=head;
	while(scanf("%d",&value)==1)
	{
		new=(Node *)malloc(sizeof(Node));
		if(new==NULL)
		{	
			printf("malloc error!!!\n");
			return NULL;
		}
		new->value=value;
		p->next=new;
		new->prev=p;
		p=new;
	}
	temp=head;
	head=head->next;
	head->prev=NULL;
	p->next=NULL;
	free(temp);
	return head;
}
int 	dll_length(Node *head)
{
	Node *p;
	int length=0;
	p=head;
	while(p->next!=NULL)
	{
		p=p->next;	
		length++;
	}
	length++;
	return length;
}
void	dll_print(Node *head)
{
	int n=dll_length(head);
	Node *p=head;
	printf("there are %d records,they are :\n",dll_length(p));
	while(p->next!=NULL)
	{
		printf("%d\n",p->value);
		p=p->next;
		
	}
	printf("%d\n",p->value);
}
Node 	*dll_del(Node *head,int value)
{
	Node *p=head;
	while(p->value!=value&&p->next!=NULL)
	{
		p=p->next;
	}
	if(p->next==NULL)//尾节点
	{
		if(p->value==value)
		{
			p->prev->next=NULL;
			p->prev=NULL;
			free (p);
		}
		else 
		printf("can't find %d\n",value);
	}
	if(p->value==value)
	{
		if(p==head)//头节点
		{
			head=head->next;
			head->prev=NULL;
			free(p);
		}
		else//中间节点
		{
			p->prev->next=p->prev->next->next;
			p->next->prev=p->next->prev->prev;
			free (p);
		}
	}
	return head;
}

Node *dll_insert(Node *head,int n)
{
	Node *new;
	Node *p=head;
	while(p->value<n&&p->next!=NULL)
	{
		p=p->next;
	}
	new=(Node*)malloc(sizeof(Node));
	if(new==NULL)
	{
		printf("malloc error!!!\n");
		return NULL;
	}
	new->value=n;
	
	if(p->next==NULL)//尾节点
	{
		p->next=new;
		new->prev=p;
		new->next=NULL;
	}
	else if(p==head)//头节点
	{
		new->prev=NULL;
		new->next=p;
		p->prev=new;
		head=new;
	}
	else//中间节点
	{
		p->prev->next=new;
		new->prev=p->prev;
		new->next=p;
		p->prev=new;
	}
	return head;
}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
机器学习是一种人工智能(AI)的子领域,致力于研究如何利用数据和算法让计算机系统具备学习能力,从而能够自动地完成特定任务或者改进自身性能。机器学习的核心思想是让计算机系统通过学习数据中的模式和规律来实现目标,而不需要显式地编程。 机器学习应用非常广泛,包括但不限于以下领域: 图像识别和计算机视觉: 机器学习在图像识别、目标检测、人脸识别、图像分割等方面有着广泛的应用。例如,通过深度学习技术,可以训练神经网络来识别图像中的对象、人脸或者场景,用于智能监控、自动驾驶、医学影像分析等领域。 自然语言处理: 机器学习在自然语言处理领域有着重要的应用,包括文本分类、情感分析、机器翻译、语音识别等。例如,通过深度学习模型,可以训练神经网络来理解和生成自然语言,用于智能客服、智能助手、机器翻译等场景。 推荐系统: 推荐系统利用机器学习算法分析用户的行为和偏好,为用户推荐个性化的产品或服务。例如,电商网站可以利用机器学习算法分析用户的购买历史和浏览行为,向用户推荐感兴趣的商品。 预测和预测分析: 机器学习可以用于预测未来事件的发生概率或者趋势。例如,金融领域可以利用机器学习算法进行股票价格预测、信用评分、欺诈检测等。 医疗诊断和生物信息学: 机器学习在医疗诊断、药物研发、基因组学等领域有着重要的应用。例如,可以利用机器学习算法分析医学影像数据进行疾病诊断,或者利用机器学习算法分析基因数据进行疾病风险预测。 智能交通和物联网: 机器学习可以应用于智能交通系统、智能城市管理和物联网等领域。例如,可以利用机器学习算法分析交通数据优化交通流量,或者利用机器学习算法分析传感器数据监测设备状态。 以上仅是机器学习应用的一部分,随着机器学习技术的不断发展和应用场景的不断拓展,机器学习在各个领域都有着重要的应用价值,并且正在改变我们的生活和工作方式。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值