当前位置: 首页 > news >正文

数据结构------单向链表。

一.实现单向链表的头插,头删,尾插,尾删,按位置插,按位置删,按位置修改,按元素查找,按元素修改,按元素删除,单链表的逆置,查找倒数第几个元素,释放内存。

头文件:head.h

 #ifndef __HEAD_H__                                                         
 #define __HEAD_H__                                                         
 #include <stdio.h>                                                         
 #include <string.h>                                                        
 #include <stdlib.h>                                                        
 typedef int datatype;                                                      
                                                                            
 enum passble{success,false=-1};                                            
                                                                            
 typedef struct Node                                                        
 {                                                                          
     datatype data;                                                         
     struct Node* next;                                                     
 }*Linklist;                                                                
                                                                            
 Linklist Create_Node();                                                    
                                                                            
 Linklist head_insert(Linklist head,datatype element);                      
                                                                            
 void show(Linklist head);                                                  
                                                                            
 Linklist head_delete(Linklist head);                                       
                                                                            
 Linklist tail_insert(Linklist head,datatype element);                      
                                                                            
 Linklist tail_delete(Linklist head);                                       
                                                                            
 int getlen(Linklist head);                                                 
                                                                            
 Linklist pos_insert(Linklist head,int pos,datatype element);               
                                                                            
 Linklist delete_index(Linklist head,int pos);                              
                                                                            
 Linklist change_index(Linklist head,int pos,datatype element);             
                                                                            
 int find_index(Linklist head,int pos);                                     
                                                                            
 int value(Linklist head,datatype element);                                 
                                                                            
 Linklist change_value(Linklist head,datatype element,datatype data1);      
                                                                            
 Linklist delete_value(Linklist head,datatype element);                     
                                                                            
 int find_value(Linklist head,int pos);                                     
                                                                            
 Linklist swap(Linklist head);                                              
                                                                            
 void free_list(Linklist head);                                             
 #endif                                                                     
                                                                            

测试文件(test.c)

#include"head.h"

//创建节点
Linklist Create_Node()
{
	Linklist s=(Linklist)malloc(sizeof(struct Node));
	if(NULL==s)
		return NULL;
	s->data=0;
	s->next=NULL;
	return s;
}
//头插
Linklist head_insert(Linklist head,datatype element)
{
	Linklist s=Create_Node();
	s->data=element;
	if(NULL==head)
		head=s;
	else
	{
		s->next=head;
		head=s;
	}
	return head;
}

//头删
Linklist head_delete(Linklist head)
{
	if(NULL==head)
		return NULL;
	Linklist p=head;
	head=head->next;
	free(p);
	p=NULL;
	return head;
}

//尾插
Linklist tail_insert(Linklist head,datatype element)
{
	Linklist s=Create_Node();
	s->data=element;
	if(NULL==head)
	{
		head=s;
	}
	{
		Linklist p=head;
		while(p->next)
		{
			p=p->next;
		}
		p->next=s;
	}
	return head;
}

//尾删
Linklist tail_delete(Linklist head)
{
	if(NULL==head)
		return NULL;
	else if(head->next==NULL)
	{
		free(head);
		head=NULL;
	}
	else
	{
		Linklist p=head;
		while(p->next->next!=NULL)
		{
			p=p->next;
		}
		free(p->next);
		p->next=NULL;
	}
	return head;
}

//计算链表的长度
int getlen(Linklist head)
{
	int count=0;
	Linklist p=head;
	while(p)
	{
		count++;
		p=p->next;
	}
	return count;
}

//按位置插入值
Linklist pos_insert(Linklist head,int pos,datatype element)
{
	Linklist s=Create_Node();
	s->data=element;
	Linklist p=head;
	if(pos<1||pos>getlen(head)+1)
	return head;
	if(pos==1)
	{
		head=head_insert(head,element);
		return head;
	}
	for(int i=1;i<pos-1;i++)
	{
		p=p->next;
	}
	s->next=p->next;
	p->next=s;
	return head;
}

//按位置删除
Linklist delete_index(Linklist head,int pos)
{
	if(pos<1||pos>getlen(head))
		return head;
	if(pos==1)
	{
		head=head_delete(head);
		return head;
	}
	Linklist p=head;
	for(int i=1;i<pos-1;i++)
	{
		p=p->next;
	}
	Linklist del=p->next;
	p->next=del->next;
	free(del);
	del=NULL;
	return head;
}

//按位置修改
Linklist change_index(Linklist head,int pos,datatype element)
{
	//判断修改的位置是否合法
	if(pos<1||pos>getlen(head))
	{
		return head;
	}
	Linklist p=head;
	for(int i=1;i<pos;i++)
	{
		p=p->next;
	}
	p->data=element;
	return head;

}

//按位置查找返回值
int find_index(Linklist head,int pos)
{
	if(NULL==head)
	return 0;
	if(pos<1||pos>getlen(head))
	{
		return 1 ;
	}
	Linklist p=head;
	for(int i=1;i<pos;i++)
	{
		p=p->next;
	}
	return p->data;
}

//按值查找返回位置
int value(Linklist head,datatype element)
{
	if(NULL==head)
	return 0;
	Linklist p=head;
	for(int i=1;i<=getlen(head);i++)
	{
		if(p->data==element)
		{
			return i;
		}
		p=p->next;
	}
	return 0;
}

//按值修改
Linklist change_value(Linklist head,datatype element,datatype data1)
{
	
	int j=value(head,element);
	head=change_index(head,j,data1);
	return head;
}

//按值删除
Linklist delete_value(Linklist head,datatype element)
{
	int j=value(head,element);
	head=delete_index(head,j);
	return head;
}

//查找倒数第几个元素的值
int find_value(Linklist head,int pos)
{
	if(NULL==head)
		return 0;
	if(pos<1||pos>getlen(head))
		return 1;
	Linklist p=head;
	Linklist q=head;
	for(int i=1;i<pos;i++)
	{
		p=p->next;
	}
	while(p->next)
	{
		p=p->next;
		q=q->next;
	}
	return q->data;
}

//单链表的逆置
Linklist swap(Linklist head)
{
	if(NULL==head)
		return head;
	if(getlen(head)==1)
		return head;
	Linklist p=head->next;
	head->next=NULL;
	while(p)
	{
		Linklist s=p;
		p=p->next;
		s->next=head;
		head=s;
	}
	return head;
}

//释放内存
void free_list(Linklist head)
{
	Linklist s=head;
	while(s)
	{
		s=s->next;
		head=head_delete(head);
	}
	return ;
}

//输出
void show(Linklist head)
{
	if(NULL==head)
	{
		return;
	}
	Linklist p=head;
	while(p!=NULL)
	{
		printf("%d\t",p->data);
		p=p->next;
	}
	putchar(10);
}

主文件(main.c)

#include"head.h"
int main(int argc, const char *argv[])
{
                             	//头插
	Linklist head=NULL;
	int n;
	datatype element;
	printf("请输入头插要插入几个数据:");
	scanf("%d",&n);
	for(int i=0;i<n;i++)
	{
		printf("请输入头插插入的数据:");
		scanf("%d",&element);
	head=head_insert(head,element);
	}
	head=head_delete(head);      //头删
	show(head);

								//尾插
	printf("请输入尾插要插入几个数据:");
	scanf("%d",&n);
	for(int i=0;i<n;i++)
	{
		printf("请输入尾插插入的数据:");
		scanf("%d",&element);
	head=tail_insert(head,element);
	}
	head=tail_delete(head);       //尾删
	show(head);

	int pos;                     //任意位置插
	printf("请输入要插入数据的位置:");
	scanf("%d",&pos);
	printf("请输入插入的数据:");
	scanf("%d",&element);
	head=pos_insert(head,pos,element);
	show(head);

/*								//任意位置删
	printf("请输入要删除数据的位置:");
	scanf("%d",&pos);
	head=delete_index(head,pos);
	show(head);

								//任意位置修改
	printf("请输入要修改数据的位置:");
	scanf("%d",&pos);
	printf("请输入修改后的值:");
	scanf("%d",&element);
	head=change_index(head,pos,element);
	show(head);

								//按位置查找
	printf("请输入要查找的位置:");
	scanf("%d",&pos);
	datatype data=find_index(head,pos);
	if(data==0)
	{
		printf("链表为空\n");
	}
	else if(data==1)
	{
		printf("输入不合理\n");
	}
	else{
	printf("查找位置的值为:%d\n",data);
	}

                               //按值查找返回位置
	printf("请输入要查找的值:");
	scanf("%d",&element);
	pos=value(head,element);
	if(pos==0)
	{
		printf("没有这个元素\n");
	}
	else{
	printf("要查找的值的位置为:%d\n",pos);
	}

	//按值修改
	datatype data1;//修改后的值
	printf("请输入要修改的元素:");
	scanf("%d",&element);
	printf("请输入修改后的值:");
	scanf("%d",&data1);
	head=change_value(head,element,data1);
	show(head);
*/
				//按值删除
	printf("请输入要删除的元素:");
	scanf("%d",&element);
	head=delete_value(head,element);
	show(head);

				//查找倒数第几个元素的值
	printf("请输入倒数的位置:");
	scanf("%d",&pos);
	int k=find_value(head,pos);
	if(k==0)
	{
		printf("链表不存在");
	}
	else if(k==1)
	{
		printf("输入的位置不合理");
	}
	else
	{
		printf("%d\n",k);
	}

				//单链表的逆置
	head=swap(head);
	printf("链表逆置后的结果为:\n");
	show(head);

			//释放内存
	free_list(head);
	return 0;
}

运行结果:

http://www.dtcms.com/a/20160.html

相关文章:

  • 从Sora到有言:3D视频生成技术的突破与应用
  • Docker中安装MySql方法
  • springboot和vue项目中加入支付宝沙盒
  • Pytest自动化测试框架关联/参数化实战
  • SQL Server 导入Excel数据
  • 基于单片机的常规肺活量SVC简单计算
  • LeetCode 热题 100
  • Synchronized 原理
  • DeepSeek R1完全本地部署实战教程01-课程大纲
  • 【Java 面试 八股文】Spring Cloud 篇
  • 鸿蒙中,UIAbility组件启动模式(3种分别是Singleton(单实例模式)Multiton(多实例模式)Specified(指定实例模式))
  • 如何学习Elasticsearch(ES):从入门到精通的完整指南
  • Java短信验证功能简单使用
  • vscode/cursor+godot C#中使用socketIO
  • SpringMVC新版本踩坑[已解决]
  • AUGUST的深度学习笔记(四,现代循环神经网络与注意力机制)
  • $符(前端)
  • 神经网络常见激活函数 9-CELU函数
  • CAS单点登录(第7版)10.多因素身份验证
  • 02.01、移除重复节点
  • Python关于类的一个坑点
  • 【Film Shot】Shot transition detection
  • Dify:修改环境变量并通过 Docker Compose 复用现有容器
  • 新建github操作
  • 【前端进阶】「全面优化前端开发流程」:利用规范化与自动化工具实现高效构建、部署与团队协作
  • Retrieval-Augmented Generation for LargeLanguage Models: A Survey
  • 用C语言解决逻辑推理问题:找出谋杀案凶手
  • C++游戏开发
  • 关于DispatchTime和DispatchWallTime
  • SQL sever数据导入导出实验