数据结构day5

aa单链表的操作:

1> 单链表节点的创建

2> 单链表头插

3> 单链表遍历

4> 单链表尾插

5> 单链表头删

6> 单链表尾删

7> 单链表按位置插入

8> 单链表按位置删除

9> 单链表按位置修改

10> 单链表按位置查找

11> 单链表按元素查找

12> 单链表按元素删除

13> 单链表按元素修改

14> 单链表逆置

15> 单链表排序

16> 单链表查找倒数第n个节点

17> 单链表释放空间

18> 计算链表长度

代码:

主函数:

#include"head.h"
int main(int argc, const char *argv[])
{
	
	linklist l=NULL;
	int n,num;
	printf("请输入头插的个数:\n");
	scanf("%d",&n);
	printf("请输入头插的数;\n");
	for(int i=0;i<n;i++)
	{
		scanf("%d",&num);
		l=insert_head(l,num);
	}
	output(l);
	printf("请输入头删的个数;\n");
	scanf("%d",&n);
	for(int i=0;i<n;i++)
	{
		l=delete_head(l);
	} 
	output(l);
	printf("请输入尾插的个数:\n");
	scanf("%d",&n);
	printf("请输入尾插的数\n");
	for(int i=0;i<n;i++)
	{
		scanf("%d",&num);
		l=insert_t(l,num);
	}
	output(l);
	printf("请输入插入的位置:\n");
	scanf("%d",&n);
    printf("请输入插入的值:\n");
	scanf("%d",&num);
	l=insert_i(l,n,num);
	output(l);
	printf("请输入删除的位置:\n");
	scanf("%d",&n);
    l=delete_i(l,n);
	output(l);
	printf("请输入修改的位置和值:\n");
	scanf("%d%d",&n,&num);
	revise_i(l,n,num);
	output(l);
	int m=0,x=0;
	printf("请输入要查找的元素:\n");
	scanf("%d",&num);
    m=search_n(l,num);
	printf("查找到的元素位置:%d\n",m);
	printf("请输入要修改的元素以及修改成的元素:\n");
	scanf("%d%d",&num,&x);
	revise_n(l,num,x);
	output(l);
	printf("请输入要删除的元素:\n");
	scanf("%d",&num);
	delete_n(l,num);
	output(l);
	l=nizhi(l);
	output(l);
	printf("请输入查找倒数第n个数:\n");
	scanf("%d",&n);
    search(l,n);
	output(l);
	l=sort(l);
	output(l);
	free_space(l);
	

	return 0;
}

头文件

#ifndef __HEAD_H__
#define __HEAD_H__

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct Node
{
	int data;
	struct Node *next;
}node,*linklist;

linklist insert_head(linklist l,int num);
linklist create_note();
linklist delete_head(linklist l);
void output(linklist l);
linklist insert_t(linklist l,int num);
linklist delete_t(linklist l);
int lend(linklist l);
linklist insert_i(linklist l,int n,int num);
linklist delete_i(linklist l,int n);
void revise_i(linklist l,int n,int num);
void search_i(linklist l,int n);
int search_n(linklist l,int num);
linklist delete_n(linklist l,int num);
linklist nizhi(linklist l);
linklist free_space(linklist l);
void search(linklist l,int n);
linklist sort(linklist l);
void revise_n(linklist l,int num,int x);
#endif

自定义函数

#include"head.h"
//创建节点
linklist create_note()
{
	linklist s=(linklist)malloc(sizeof(node));
	if(NULL==s)
		return NULL;
	s->next=NULL;
	return s;
}
//头插
linklist insert_head(linklist l,int num)
{
	linklist s=create_note();
	if(l==NULL)
	{
		s->data=num;
		l=s;
	}
	else
	{
		s->next=l->next;
		l->next=s;
		s->data=l->data;
		l->data=num;
	}
	return l;
}

//头删
linklist delete_head(linklist l)
{
	if(l==NULL)
		return l;
	else if(l->next==NULL)
	{   
		free(l);
		l=NULL;
	}
	else
	{
		linklist s=create_note();
		s=l->next;
		l->data=s->data;
		l->next=s->next;
		free(s);
		s=NULL;
	}
	return l;
}
//尾插
linklist insert_t(linklist l,int num)
{   
	linklist s=create_note();
	linklist n=create_note();
	s->data=num;	
	if(NULL==l)
	{
		l=s;
	}
	else
	{
		n=l;
		while(n->next!=NULL)
		{
			n=n->next;
		}
	}
	n->next=s;
	return l;
}
//尾删
linklist delete_t(linklist l)
{
	if(NULL==l)
		return NULL;
	else if(l->next=NULL)
	{
		free(l);
		l=NULL;
	}
	else
	{
	linklist q=l;
	while(q->next->next!=NULL)
	{
		q=q->next;
	}
	q=q->next;
	free(q);
	q=NULL;
	}
	return l;
}

//按位置插入
linklist insert_i(linklist l,int n,int num)
{
	
	int len=lend(l);
	linklist s=create_note();
	s=l;
	if(n<=len+1&&n>0)
	{
		linklist p=create_note();
		if(NULL==l||n==1)
		{
			s=insert_head(l,num);
		}
			else if(n<=len)
		{
		for(int i=1;i<n;i++)
		{   
			s=s->next;
		}
			p->next=s->next;
			s->next=p;
			p->data=s->data;
			s->data=num;
		}
		else
		{   
		   s=insert_t(l,num);
		}

	}
	return l;

}

//按位置删除(重点看)
linklist delete_i(linklist l,int n)
{
	int len=lend(l);
	if(NULL==l)
		return NULL;
	if(n<1||n>len)
		return l;
	else if(n==1)
	{
		l=delete_head(l);
		
	}
	else 
	{   linklist s=l;
		for(int i=1;i<n-1;i++)
		{
			s=s->next;
		}
		linklist p=s->next;
		s->next=p->next;
		free(p);
		p=NULL;
	}
	return l;
}
//按位置修改
void revise_i(linklist l,int n,int num)
{   
	int len=lend(l);
	if(NULL==l||n<1||n>len)
		return;
	else 
	{   
		linklist s=l;
		for(int i=1;i<n;i++)
		{
			s=s->next;
		}
		s->data=num;
	}
	return;
}
//按位置查找
void search_i(linklist l,int n)
{
	int len=lend(l);
	if(NULL==l||n<1||n>len)
		return;
	else 
	{   
		linklist s=l;
		for(int i=1;i<n;i++)
		{
			s=s->next;
		}
		printf("%d",s->data);
	}
	return; 
}
//按元素查找
int search_n(linklist l,int num)
{   
	int n=1;
	if(NULL==l)
		return -1;
	else
	{   
		linklist s=l;
		while(NULL!=s) 
		{
			if(num==s->data)
			{
				return n;
			}
			s=s->next;
			n++;
		}
	}
	return -1;
}
//按元素修改
void revise_n(linklist l,int num,int x)
{
	int n=search_n(l,num);
	if(-1==n)
	{
		puts("error");
		return;
	}
	else 
	{   
		linklist s=l;
		for(int i=1;i<n;i++)
		{
			s=s->next;
		}
		s->data=x;
	}
	return;
}
//按元素删除
linklist delete_n(linklist l,int num)
{
	int n=search_n(l,num);
	if(-1==n)
		return l;
	else
	{   
		linklist s=l;
		for(int i=1;i<n-1;i++)
			s=s->next;
		linklist p=s->next;
		s->next=p->next;
		free(p);
		p=NULL;
	}
	return l;
}
//逆置
linklist nizhi(linklist l)
{
	if(NULL==l||NULL==l->next)
		return l;
	else
	{   
		linklist s=l->next;
		l->next=NULL;
		while(s!=NULL)
		{
			linklist p=s;
			s=s->next;
			p->next=l;
			l=p;
		}
	}
	return l;
}
//查找倒数第n个
void search(linklist l,int n)
{
	if(NULL==l||NULL==l->next)
		return;
	linklist q=l;
	linklist p=l;
	for(int i=0;i<n;i++)
	{
		p=p->next;
	}
	while(p!=NULL)
	{
		q=q->next;
		p=p->next;
	}
	printf("%d",q->data);
	return;

}
//排序
linklist sort(linklist l)
{
	if(NULL==l||NULL==l->next)
		return l;
	for(linklist i=l;i->next!=NULL;i=i->next)
	{   
		linklist max;
		max=i;
		for(linklist j=i->next;j!=NULL;j=j->next)
		{
			if(i->data<j->data)
			{
				max=j;
			}
		}
		if(max!=i)
		{   
			int t=i->data;
			i->data=max->data;
			max->data=t;
		}
	}
	return l;
}

//释放
linklist free_space(linklist l)
{
	if(NULL==l)
		return l;
	while(l!=NULL)
	{
		l=delete_head(l);
	}
	return l;
}
//链表长度
int lend(linklist l)
{
	int len=0;
	linklist s=l;
	while(s!=NULL)
	{   
		s=s->next;
		len++;
	}
	return len;
}


//遍历
void output(linklist l)
{
	if(l==NULL)
		return;
	printf("链表:\n");
	while(l!=NULL)
	{   
		
		printf("%d ",l->data);
		l=l->next;
	}
	return;
}

运行结果:

思维导图:

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值