数据结构 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;
}
相关推荐
SWAGGY..11 分钟前
数据结构学习篇(8)---二叉树
数据结构·学习·算法
じ☆冷颜〃25 分钟前
基于多数据结构融合的密码学性能增强框架
数据结构·经验分享·笔记·python·密码学
yuuki23323335 分钟前
【C++】掌握list:C++链表容器的核心奥秘
c++·后端·链表·list
一起养小猫1 小时前
LeetCode100天Day7-移动零与搜索插入位置
数据结构·算法·leetcode·指针
草莓熊Lotso2 小时前
Python 进阶核心:字典 / 文件操作 + 上下文管理器实战指南
数据结构·c++·人工智能·经验分享·笔记·git·python
额呃呃11 小时前
二分查找细节理解
数据结构·算法
无尽的罚坐人生11 小时前
hot 100 283. 移动零
数据结构·算法·双指针
蜂蜜黄油呀土豆12 小时前
Redis 底层实现深度解析:从 ListPack 到哈希表扩容
数据结构·redis·zset·sds·listpack·哈希表扩容
郝学胜-神的一滴14 小时前
Linux进程与线程控制原语对比:双刃出鞘,各显锋芒
linux·服务器·开发语言·数据结构·c++·程序人生
javachen__14 小时前
341-十道经典程序设计题目
数据结构·c++·算法