day3单链表

本文提供了一组C语言函数,用于实现链表的基本操作,包括创建头结点、创建节点、头插、尾插、遍历、头删、尾删、按位置插入、按位置删除、按元素查找、按元素删除、按位置修改和按元素更新。这些函数覆盖了链表操作的核心功能。
摘要由CSDN通过智能技术生成

test.c

#include "head.h"
/*
 * function:    创建头结点
 * @param [ in] 无参数
 * @param [out] 
 * @return      成功返回地址 失败返回NULL
 */
linklist create_head()
{
	//是头节点:len next
	//struct Node:是节点结构体类型
	linklist L=(linklist)malloc(sizeof(struct Node));
	if(L==NULL)
		return NULL;
	L->len=0;          //为单链表清零
	L->next=NULL;      //防止地址为野指针
}
/*
 * function:    创建节点
 * @param [ in] 
 * @param [out] 
 * @return      成功返回地址 失败返回NULL
 */
linklist create_node()
{
	linklist p=(linklist)malloc(sizeof(struct Node));
	if(p==NULL){
		return NULL;
	}
	p->data=0;
	p->next=NULL;
	return p;
}
/*
 * function:    头插
 * @param [ in] 链表 
 * @param [out] 
 * @return      成功返回0 失败返回-1
 */
int insert_head(linklist L,datatype e)
{
	//判断头结点是否存在
	if(L=NULL)
		return -1;
	//插入 在头结点后面
	linklist p=create_node();
	if(p==NULL)
		return -1;
	//连接
	//p的数据域
	p->data=e;
	//P的指针域
	p->next=L->next;
	L->next=p;
	L->len++;
}
/*
 * function:    链表遍历
 * @param [ in] 头结点
 * @param [out] 
 * @return      无返回
 */
void output(linklist L)
{
	//判断头结点是否存在
	//判断链表是否为空
	if(L==NULL||L->len==0){
		printf("遍历失败\n");
		return ;
	}
	linklist p = L;
#if 0	
	int n=L->len;
	for(int i=0;i<n;i++)  //因为使用长度,所以头结点不能动
	{
		p=p->next;
		printf("%d\t",p-data);
	}
#else
	//遍历
	while(L->next!=NULL)//等价于 while(L->next)
	{
		L=L->next;
		printf("%d\t",L->data);
	}
#endif
	puts("");
}
/*
 * function:    尾插
 * @param [ in] 头结点 插入的值
 * @param [out] 
 * @return      成功返回0 失败-1
 */
int insert_rear(linklist L,datatype e)
{
	//判断头结点是否存在
	if(L==NULL){
		printf("插入失败\n");
		return -1;
	}
	//循环到最后一个节点
	linklist p=L;
	for(int i=0;i<L->len;i++)
	{
		p=p->next;
	}
	//在p节点后面插入
	linklist s=create_node();
	if(s==NULL)
		return -1;
	//s的数据域
	s->data=e;
	//连接
	p->next=s;
	L->len++;
}
/*
 * function:    头删
 * @param [ in] 头结点
 * @param [out] 
 * @return      成功返回0 失败返回-1
  */
int delete_head(linklist L)
{
	//判断头结点是否存在
	//判断链表是否为空 
	if(L==NULL||L->len==0){
		printf("删除失败");
		return -1;
	}
	//删除头节点的后继节点
		linklist q=L->next;
	L->next=q->next;
	free(q);
	q=NULL;
	L->len--;

}
/*
 * function:    尾删
 * @param [ in] 头结点
 * @param [out] 
 * @return      
 */
int delete_rear(linklist L)
{
	//判断头结点是否存在
	//判断链表是否为空
	if(L==NULL||L->len==0){
		printf("删除失败");
		return-1;
	}
	//循环移动到len-1位置
	linklist p=L;
	for(int i=0;i<L->len-1;i++){
		p=p->next;
	}
	free(p->next);
	p->next=NULL; //防止野指针
	L->len--;
}
/*
 * function:    按位置插入
 * @param [ in] 头节点  要插入的位置,插入的值
 * @param [out] 
 * @return      
 */
int insert_pos(linklist L, int pos,datatype e)
{
	if(L==NULL||pos<1,pos>L->len+1){
		printf("插入失败");
		return -1;
	}
	//找到pos-1.起名字;
	linklist p=L;
	for(int i=0;i<pos-1;i++){
		p=p->next;
	}
	//插入节点s;
	linklist s =create_node();
	if(s==NULL)
		return -1;
	//s的数据域
	s->data=e;
	//s的指针域
	s->next=p->next;
	p->next=s;
	L->len++;
	return 0;

}
/*
 * function:    按位置删除
 * @param [ in] 头结点  位置
 * @param [out] 
 * @return      
 */
int delete_pos(linklist L,int pos)
{
	if(L==NULL||L->len==0||pos<1||pos>L->len)
	{
		printf("删除失败");
		return -1;
	}
	linklist p=L;
	for(int i=0;i<pos-1;i++){
		p=p->next;
	}
	linklist q=p->next;
	p->next=q->next;
	free(q);
	q=NULL;
	L->len--;
}
/*
 * function:    
 * @param [ in] 
 * @param [out] 
 * @return      
 */
int search_pos(linklist L,int pos)
{
	if(L==NULL||L->len==0||pos<1||pos>L->len){
		printf("查找失败");
		return -1;
	}
		linklist p=L;
		for(int i=0;i<pos;i++){
			p=p->next;
		}
		printf("查找的值%d\n",p->data);
}
/*
 * function:    按元素查找
 * @param [ in] 头结点 查找的值
 * @param [out] 
 * @return      
 */
int search_data(linklist L,datatype key)
{
	if(L==NULL||L->len==0){
		printf("按元素查找失败");
			return -1;
	}
	linklist p=L;
	int count=0;
	while(p->next!=NULL){
		p=p->next;
		count++;
		if(p->data==key){
			return count;
		}
	}
	return -1;
}
/*
 * function:    按元素删除
 * @param [ in] 头结点 删除的元素
 * @param [out] 
 * @return      
 */
int delete_data(linklist L,datatype key)
{
	int pos=search_data(L,key);
		if(pos==-1){
			printf("删除元素失败");
			return -1;
		}
	//根据元素位置删除
	delete_pos(L,pos);
	return 0;
}
/*
 * function:    按位置修改
 * @param [ in] 链表 位置 修改的值
 * @param [out] 
 * @return      
 */
int revise_pos(linklist L,int pos,datatype e)
{ 
	if(L==NULL||L->len==0||pos<1||pos>L->len){
		printf("修改失败\n");
		return -1;
	}
	linklist p=L;
	for(int i=0;i<pos;i++){
		p=p->next;
	}
	p->data=e;
	return 0;
}
int updata_data(linklist L,datatype key,datatype e)
{
		int temp=search_data(L,key);
		if(temp==-1){
			printf("失败");
			return -1;
		}
		revise_pos(L,temp,e);
		return 0;
}
void free_space(linklist L)
{

	for(int i=0;i<L->len;i++){
		delete_head(L);
	}
	free(L);
	L=NULL;
}

main.c

#include "head.h"

int main(int argc, const char *argv[])
{
	 linklist L=create_head();
#if 0
	 //循环头插:在头结点后面插入
		int n;
		datatype e;
		printf("请输入插入的个数");
		scanf("%d",&n);
		for(int i=0;i<n;i++)
		{
			printf("请输入插入的值");
			scanf("%d",&e);
			insert_head(L,e);
		}
		output(L);
#else 
		//尾部插入:永远在尾部插入
		int n;
		datatype e;
		printf("请输入插入的个数");
		scanf("%d",&n);
		for(int i=0;i<n;i++){
			printf("请输入插入的值:");
			scanf("%d",&e);
			insert_rear(L,e);
		}
		output(L);
#endif
#if 0
		//头删
		delete_head(L);

		delete_head(L);
		output(L);

#else 
		//尾删
		//delete_rear(L);
		//delete_rear(L);
		output(L);
#endif
		//按位置插入
		int pos;
		printf("请输入要插入的位置:");
		scanf("%d",&pos);
		printf("请输入要插入的值:");
		scanf("%d",&e);
		insert_pos(L,pos,e);
		output(L);

		//按位置删除
		printf("请输入删除的位置:");
		scanf("%d",&pos);
		delete_pos(L,pos);
		output(L);

		//按元素查找
		datatype key;
		printf("请输入查找的值:");
		scanf("%d",&key);
		int flag=search_data(L,key);
	
		if(flag==-1){
			printf("查找的元素不存在\n");
		}else{
			printf("%d位置出现\n",flag);
		}
			
		//按元素删除
		printf("请输入删除的元素:");
		scanf("%d",&key);
		delete_data(L,key);
		output(L);

		printf("输入要修改值的位置:");
		scanf("%d",&pos);
		printf("输入修改的值:");
		scanf("%d",&e);
		revise_pos(L,pos,e);
		output(L);
		puts("");

		printf("请输入要修改的元素");
		scanf("%d",&key);
		printf("请输入要修改的值");
		scanf("%d",&e);
		updata_data(L,key,e);
		output(L);
		free_space(L);
	return 0;
}

head.h

#ifndef __HEAD_H__
#define __HEAD_H__
#include<string.h>
#include<stdio.h>
#include<stdlib.h>

typedef int datatype;
typedef struct Node
{
	//数据域
	union{
		int len;      //头结点的数据域:链表长度
		datatype data;  //其他节点的数据域:数据元素
	};
	//指针域
	struct Node *next;
}*linklist;

linklist create_head();
linklist create_node();
int insert_head(linklist L,datatype e);
void output(linklist L);
int insert_rear(linklist L,datatype e);
int delete_head(linklist L);
int delete_rear(linklist L);
int insert_pos(linklist L, int pos,datatype e);
int delete_pos(linklist L,int pos);
int search_pos(linklist L,int pos);
int search_data(linklist L,datatype key);
int delete_data(linklist L,datatype key);
int revise_pos(linklist L,int pos,datatype e);
int updata_data(linklist L,datatype key,datatype e);
void free_space(linklist L);

#endif

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值