数据结构 day4 链表

单向链表任意元素查找

单向链表任意元素修改

单向链表任意元素删除

单向链表逆置

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

单向链表排序

单向链表释放内存

main.c

cpp 复制代码
#include "head.h"
int main(int argc, const char *argv[])
{
	int n;
	Linklist head=NULL;
	datatype element;
	int pos;
	printf("请输入你要创建链表的个数n");
	scanf("%d",&n);
	for(int i=0;i<n;i++)
	{
		printf("请输入%d个值",i+1);
		scanf("%d",&element);
	//	head=headin(head,element);
		head=tailin(head,element);
	}
	output(head);
	head=headdel(head);
	printf("头删:\n");
	output(head);
	head=taildel(head);
	printf("尾删:\n");
	output(head);
	printf("输入插入元素的位置");
	scanf("%d",&pos);
	printf("输入插入的元素");
	scanf("%d",&element);
	head=in(head,pos,element);
	printf("输入删除元素的位置");
	scanf("%d",&pos);
	head=del(head,pos);
	output(head);
	printf("输入查找的元素");
	scanf("%d",&pos);
	find(head,pos);
	printf("输入修改元素的位置");
	scanf("%d",&pos);
	printf("输入修改的的元素");
	scanf("%d",&element);
	repair(head,pos,element);
	output(head);
	printf("输入查找的元素");
	scanf("%d",&element);
	search(head,element);
	datatype key1,key2;
	printf("输入修改的元素");
	scanf("%d",&key1);
	printf("输入要修改成的的元素");
	scanf("%d",&key2);
	repair2(head,key1,key2);
	output(head);
	printf("输入删除的的元素");
	scanf("%d",&element);
	head=del2(head,element);
	output(head);
	head=deput(head);
	output(head);
	printf("输入查找的倒数第几个数");
	scanf("%d",&n);
	find2(head,n);
	bubble(head);
	output(head);
	free(head);
	return 0;
}

head.h

cpp 复制代码
#ifndef __head_h__
#define __head_h__
#include <stdio.h>
#include<string.h>
#include<stdlib.h>
typedef int datatype;
enum 
{
	false=-1,
	success
};
typedef struct node
{
	datatype data;
	struct node *next;
}*Linklist;
Linklist create(Linklist p);
Linklist headin(Linklist p,datatype element);
int output(Linklist head);
Linklist tailin(Linklist head,datatype element);
Linklist headdel(Linklist head);
Linklist taildel(Linklist head);
void search(Linklist head,datatype element);
Linklist in(Linklist head,int pos,datatype element);
Linklist del(Linklist head,int pos);
void find(Linklist head,int pos);
void repair(Linklist head,int pos,datatype element);
void repair2(Linklist head,datatype key1,datatype key2);
Linklist del2(Linklist head,datatype element);
Linklist deput(Linklist head);
void find2(Linklist head,int n);
void bubble(Linklist head);
Linklist free(Linklist head);
#endif

test.c

cpp 复制代码
#include "head.h"
Linklist create(Linklist p)
{
	p=(Linklist)malloc(sizeof(struct node));
	if(p==NULL)
		return NULL;
	p->data=0;
	p->next=NULL;
	return p;
}
Linklist headin(Linklist head,datatype element)
{
	Linklist s=create(s);
	if(s==NULL)
		return head;
	s->data=element;
	s->next=head;
	head = s;
	return head;
}
int output(Linklist head)
{
	if(head==NULL)
		return false;
	Linklist p=head;
	while(p!=NULL)
	{
		printf("%-4d",p->data);
		p=p->next;
	}
	puts("");
	return success;
}
Linklist tailin(Linklist head,datatype element)
{
	Linklist s=create (s);
	s->data=element;
	if(NULL==head)
	{
		head=s;
		return head;
	}
	Linklist p=head;
	while(p->next!=NULL)
	{
		p=p->next;
	}
	p->next=s;
	return head;
}
Linklist headdel(Linklist head)
{
	if(head==NULL)
		return head;
	Linklist p=head;
	head=head->next;
	free(p);
	p=NULL;
	return head;
}
Linklist taildel(Linklist head)
{
	if(head==NULL)
		return NULL;
	if(head->next==NULL)
	{
		free(head);
		head=NULL;
		return head;
	}
	Linklist q=head;
	while(q->next->next!=NULL)
	{
		q=q->next;
	}
	free(q->next);
	q->next=NULL;
	q=NULL;
	return head;	
}
int length(Linklist head)
{
	Linklist p=head;
	int count=0;
	while(p!=NULL)
	{
		p=p->next;
		count++;
	}
	return count;
}
Linklist in(Linklist head,int pos,datatype element)
{
	if(pos<1||pos>length(head)+1)
		return head;
	if(pos==1)
	{
		head=headin(head,element);
		return head;
	}
	Linklist p=head;
	for(int i=1;i<pos-1;i++)
	{
		p=p->next;
	}
	Linklist s=create(s);
	if(s==NULL)
		return NULL;
	s->data=element;
	s->next=p->next;
	p->next=s;
	return head;
}
Linklist del(Linklist head,int pos)
{
	if(head==NULL||pos<1||pos>length(head))
		return head;
	if(pos==1)
	{
		head=headdel(head);
		return head;
	}
	Linklist p=head;
	Linklist q=NULL;
	for(int i=1;i<pos-1;i++)
	{
		p=p->next;
		q=p->next;
	}
	p->next=q->next;
	free(q);
	q=NULL;
	return head;
}
void find(Linklist head,int pos)
{
	if(pos<1||pos>length(head)||head==NULL)
		return;
	Linklist p=head;
	for(int i=1;i<pos;i++)
	{
		p=p->next;
	}
	printf("您查找的元素为%d\n",p->data);
}
void repair(Linklist head,int pos,datatype element)
{
	if(pos<1||pos>length(head)||head==NULL)
		return;
	Linklist p=head;
	for(int i=1;i<pos;i++)
	{
		p=p->next;
	}
	p->data=element;
}
 
 
void search(Linklist head,datatype element)
{
	int count=0;
	if(head==NULL)
		return;
	Linklist p=head;
	while(p!=NULL)
	{
		count++;
		if(p->data==element)
		{
			printf("已找到该元素是第%d个元素\n",count);
			break;
		}
		p=p->next;
	}
	return;
}
void repair2(Linklist head,datatype key1,datatype key2)
{
	if(head==NULL)
		return;
	Linklist p=head;
	while(p!=NULL)
	{
		if(p->data==key1)
		{
			p->data=key2;
		}
		p=p->next;
	}
}
Linklist del2(Linklist head,datatype element)
{
	if(head==NULL)
		return NULL;
	Linklist p=head;
	while(p->next->data!=element)
	{
		p=p->next;
	}
	Linklist q=p->next;
	p->next=q->next;
	free(q);
	q=NULL;
	return head;
}
Linklist deput(Linklist head)
{
	if(head==NULL||head->next==NULL)
		return head;
	Linklist p=head->next;
	Linklist q=head->next;
	head->next=NULL;
	while(q!=NULL)
	{
		q=q->next;
		p->next=head;
		head=p;
		p=q;
	}
	return head;
}
void find2(Linklist head,int n)
{
	if(head==NULL||n<1||n>length(head))
		return;
	Linklist p=head;
	Linklist q=head;
	for(int i=0;i<n;i++)
	{
		p=p->next;
	}
	while(p!=NULL)
	{
		p=p->next;
		q=q->next;
	}
	printf("倒数第%d个元素为%d\n",n,q->data);
}
void bubble(Linklist head)
{
	Linklist p=head;
	int i,j;
	int len=length(head);
	for(i=1;i<len;i++)
	{
		p=head;
		for(j=0;j<len-i;j++)
		{
			if(p->data>p->next->data)
			{
				datatype t=p->data;
				p->data=p->next->data;
				p->next->data=t;
			}
			p=p->next;
		}
	}
}
Linklist fre(Linklist head)
{
	if(head==NULL)
		return NULL;
	int len=length(head);
	for(int i=0;i<len;i++)
	{
		head=headdel(head);
	}
	head=NULL;
}
相关推荐
刘马想放假1 天前
Modbus 全栈技术解析:TCP、RTU、ASCII、RTU over TCP
数据结构·网络协议
北域码匠2 天前
冒泡排序太慢?鸡尾酒排序双向优化,原生 C# 零第三方库完整代码
数据结构·排序算法·泛型·c# 算法·鸡尾酒排序·原生 c# 开发·冒泡排序优化·嵌入式算法
Darling噜啦啦9 天前
列表转树算法深度解析:从 Map 到 Reduce 的两种实现,面试高频考点
数据结构·算法·面试
小小工匠10 天前
Redis - 事务机制:能实现 ACID 属性吗
数据结构·redis·性能优化·并发·持久化
玖玥拾10 天前
C/C++ 数据结构(七)栈、容器适配器
c语言·数据结构·c++··容器适配器
Qres82110 天前
算法复键——树状数组
数据结构·算法
牛油果子哥q10 天前
并查集(DSU)超精讲,路径压缩、按秩合并、万能模板、连通性判定、最小生成树与刷题实战全解
数据结构·c++·最小生成树·并查集
凌波粒10 天前
LeetCode--491.递增子序列(回溯算法)
数据结构·算法·leetcode
疯狂成瘾者10 天前
Java 集合 LinkedList 详解:链表结构、常用方法和队列使用
java·开发语言·链表
WL学习笔记10 天前
单项不带头不循环链表
数据结构·链表