数据结构Day3

单链表的按位置修改

思路:参数:L pos e

1,判断链表是否存在

2,判断链表是否为空

3,判断位置是否合法

4,找到pos起名字p

5. 修改p的数据域:重新赋值

单链表的按元素修改

思路:参数头结点L 被修改的元素key 要修改的元素e

1.根据key得到位置

2,根据位置修改

 单链表的空间释放

循环删除头结点后面的所有结点

for(i=0;i

{

delete_head(L);

}

删除头

free(L)

L=NULL;

头文件

#ifndef __HEAD_H__
#define __HEAD_H__
 
 
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
 
typedef int datatype;
typedef struct Node
{
	struct Node * next;
 
	union
	{
		int len;
		datatype data;
	};
} *linklist;
 
 
//头结点申请
linklist create_head();
 
//申请普通结点
linklist create_node();
 
//头插
int insert_head(linklist L,datatype e);
 
//输出单链表
void output(linklist L);
 
//头删
int delete_head(linklist L);
 
//按位置删除
int delete_sub(linklist L,int sub);
 
//按元素查找
int serch_data(linklist L,datatype e);
 
//按位置修改
int updata_sub(linklist L,int sub,datatype e);
 
//按元素删除
int delete_data(linklist L,datatype e);
 
//按元素修改
int updata_data(linklist L,datatype e,datatype k);
 
//释放空间
linklist free_speac(linklist L);
 
#endif

主函数

#include "head.h"
 
int main(int argc, const char *argv[])
{
	//头结点申请
	linklist L=create_head();
 
	//头插
	int n;
	datatype e;
    int sub;
	printf("请输入要插入的个数:");
	scanf("%d",&n);
	for(int i=0;i<n;i++)
	{
		printf("请输入要插入的值:");
		scanf("%d",&e);
		insert_head(L,e);
	}
 
	//输出单链表
	output(L);
 
	//按位置修改
	printf("请输入要修改的位置:");
	scanf("%d",&sub);
	printf("请输入要修改的值:");
	scanf("%d",&e);
	updata_sub(L,sub,e);
	output(L);
 
	//按元素删除
	printf("请输入要删除的值:");
	scanf("%d",&e);
	delete_data(L,e);
	output(L);
 
	//按元素修改
	datatype k;
	printf("请输入要修改的值:");
	scanf("%d",&e);
	printf("请输入修改后的值:");
	scanf("%d",&k);
	updata_data(L,e,k);
	output(L);
 
	//释放空间
	free_speac(L);
	
	return 0;
}

自定义函数

#include "head.h"
 
//头结点申请
linklist create_head()
{
	linklist L=(linklist)malloc(sizeof(link));
	if(L==NULL)
		return NULL;
	L->len=0;
	L->next=NULL;
	return L;
}
 
//申请普通结点
linklist create_node()
{
	linklist p=(linklist)malloc(sizeof(link));
	if(p==NULL)
		return NULL;
	p->data=0;
	p->next=NULL;
	return p;
}
 
//头插
int insert_head(linklist L,datatype e)
{
	if(L==NULL)
		return -1;
	linklist p=create_node();
	if(p==NULL)
		return-1;
	p->next=L->next;
	L->next=p;
	p->data=e;
	L->len++;
}
 
//输出单链表
void output(linklist L)
{
	if(L==NULL || L->len==0)
	{
		printf("遍历失败\n");
		return;
	}
	while(L->next)
	{
		L=L->next;
		printf("%d\t",L->data);
	}
	puts("");
	return;
}
 
//头删
int delete_head(linklist L)
{
	if(L==NULL || L->next==NULL)
	{
		printf("删除失败\n");
		return -1;
	}
	linklist p=L->next;
	L->next=p->next;
	free(p);
	p=NULL;
	L->len--;
	return 0;
}
 
//按位置删除
int delete_sub(linklist L,int sub)
{
	if(L==NULL || L->next==NULL || sub<1 || sub>L->len)
	{
		printf("删除失败\n");
		return -1;
	}
	linklist s=L;
	for(int i=1;i<sub;i++)
		s=s->next;
	linklist q=s->next;
	s->next=q->next;
	free(q);
	q=NULL;
	L->len--;
	return 0;
}
 
 
//按元素查找
int serch_data(linklist L,datatype e)
{
	if(L==NULL || L->next==NULL)
	{
		printf("按元素查找失败\n");
		return -1;
	}
	for(int i=1;L->next;i++)
	{
		L=L->next;
		if(L->data==e)
			return i;
	}
	printf("按元素查找失败\n");
	return -1;
}
 
//按位置修改
int updata_sub(linklist L,int sub,datatype e)
{
	if(L==NULL || L->next==NULL || sub<1 || sub>L->len)
	{
		printf("修改失败\n");
		return -1;
	}
	for(int i=0;i<sub;i++)
		L=L->next;
	L->data=e;
	return 0;
}
 
//按元素删除
int delete_data(linklist L,datatype e)
{
	int sub=serch_data(L,e);
	if(sub==-1)
	{
		printf("删除失败\n");
		return -1;
	}
	delete_sub(L,sub);
	return 0;
}
 
//按元素修改
int updata_data(linklist L,datatype e,datatype k)
{
	int sub=serch_data(L,e);
	if(sub==-1)
	{
		printf("修改失败\n");
		return -1;
	}
	updata_sub(L,sub,k);
	return 0;
}
 
//释放空间
linklist free_speac(linklist L)
{
	if(L==NULL)
		return NULL;
	for(int i=0;i<L->len;i++)
		delete_head(L);
	free(L);
	L=NULL;
	return L;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值