2023年3月30日 星期四 数据结构作业

链表运行结果
在这里插入图片描述
代码
头文件

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

typedef int datatype;

typedef struct Node
{
	//数据域
	union{
		int len;
		datatype data;
	};
	//指针域
	struct Node *next;
}*linklist;


linklist creatr_head();
linklist creatr_Node();
int insert_head(linklist L,datatype e);
int insert_rear(linklist L,datatype e);
void output(linklist L);
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 xiugai_pos(linklist L,int pos,datatype e);
int delete_key(linklist L,datatype key);
int xiugai_key(linklist L,datatype key, datatype e);
linklist free_space(linklist L);

#endif

主函数

#include "head.h"

int main(int argc, const char *argv[])
{
	//创建头结点
	linklist L=creatr_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);
	}
#else
	//创建普通结点(尾插)
	int n;
	datatype e;
	printf("输入插入结点个数:");
	scanf("%d",&n);
	for(int i=0;i<n;i++){
		printf("输入插入的值:");
		scanf("%d",&e);
		insert_rear(L,e);
	}
#endif
	//输出
	output(L);
#if 0
	//头删
	delete_head(L);
	printf("头删之后的结果为:\n");
	output(L);
#else
	//尾删
	delete_rear(L);
	printf("尾删之后的结果为:\n");
	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);
	//按位置查找
	printf("输入要查找的位置:");
	scanf("%d",&pos);
	search_pos(L,pos);
	//按元素查找
	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",&pos);
	printf("输入要改成的值:");
	scanf("%d",&e);
	xiugai_pos(L,pos,e);
	output(L);
	//按元素删除
	printf("输入要删除的元素:");
	scanf("%d",&key);
	delete_key(L,key);
	output(L);
	//按元素修改
	printf("输入要修改的元素:");
	scanf("%d",&key);
	printf("输入要改成的值:");
	scanf("%d",&e);
	xiugai_key(L,key,e);
	output(L);
	//释放
	free_space(L);
	return 0;
}

自定义函数

#include "head.h"

//创建头结点
linklist creatr_head()
{
	linklist L=(linklist)malloc(sizeof(struct Node));
	if(L==NULL)
		return NULL;
	L->len=0;//为单链表清零
	L->next=NULL;//防止头结点指针域为野指针
	return L;
}

//创建普通结点
linklist creatr_Node()
{
	linklist p=(linklist)malloc(sizeof(struct Node));
	if(p==NULL)
		return NULL;
	p->data=0;
	p->next=NULL;
	return p;
}

//头插
int insert_head(linklist L,datatype e)
{
	if(L==NULL){
		printf("插入失败\n");
		return -1;
	}
	linklist p=creatr_Node();
	if(p==NULL)
		return -1;
	//数据域
	p->data=e;
	//指针域
	p->next=L->next;
	L->next=p;
	L->len++;
	return 0;
}

//尾插
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;
	}
	linklist s=creatr_Node();
	//数据域
	s->data=e;
	//指针域
	p->next=s;
	L->len++;
	return 0;
}

//输出
void output(linklist L)
{
	if(L==NULL||L->len==0){
		printf("输出失败\n");
		return;
	}
	linklist p=L;
	for(int i=0;i<L->len;i++){
		p=p->next;
		printf("%d  ",p->data);
	}
	printf("\n");
}

//头删
int delete_head(linklist L)
{
	if(L==NULL||L->len==0){
		printf("删除失败\n");
		return -1;
	}
	linklist p=L->next;
	L->next=p->next;
	free(p);
	L->len--;
	return 0;
}

//尾删
int delete_rear(linklist L)
{
	if(L==NULL||L->len==0){
		printf("删除失败");
		return -1;
	}
	linklist p=L;
	for(int i=0;i<L->len-1;i++){
		p=p->next;
	}
	free(p->next);
	p->next=NULL;
	L->len--;
}

//按位置插入
int insert_pos(linklist L,int pos,datatype e)
{
	if(L==NULL||pos<1||pos>L->len+1){
		printf("插入失败\n");
		return -1;
	}
	linklist p=L;
	for(int i=0;i<pos-1;i++){
		p=p->next;
	}
	linklist s=creatr_Node();
	if(s==NULL)
		return -1;
	s->data=e;
	s->next=p->next;
	p->next=s;
	L->len++;
	return 0;
}

//按位置删除
int delete_pos(linklist L,int pos)
{
	if(L==NULL||L->len==0||pos<1||pos>L->len){
		printf("删除失败\n");
		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--;
	return 0;
}

//按位置查找
int search_pos(linklist L,int pos)
{
	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;
	}
	printf("该位置的值为:%d\n",p->data);
	return 0;
}

//按元素查找
int search_data(linklist L,datatype key)
{
	if(L==NULL||L->len==0){
		printf("查找失败\n");
		return -1;
	}
	linklist p=L;
	for(int i=1;i<=L->len;i++){
		p=p->next;
		if(p->data==key){
			return i;
		}
	}
	return -1;
}

//按位置修改
int xiugai_pos(linklist L,int pos,datatype e)
{
	if(L==NULL||pos<1||pos>L->len||L->len==0){
		printf("修改失败\n");
		return -1;
	}
	linklist p=L;
	for(int i=0;i<pos;i++){
		p=p->next;
	}
	p->data=e;
	return 0;
}

//按元素删除
int delete_key(linklist L,datatype key)
{
	int pos=search_data(L,key);
	if(pos==-1){
		printf("删除元素失败\n");
		return -1;
	}
	delete_pos(L,pos);
	return 0;
}

//按元素修改
int xiugai_key(linklist L,datatype key,datatype e)
{
	int pos=search_data(L,key);
	if(pos==-1){
		printf("修改元素失败\n");
		return -1;
	}
	xiugai_pos(L,pos,e);
	return 0;
}

//释放
linklist free_space(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、付费专栏及课程。

余额充值