数据结构 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;
}
相关推荐
闪电麦坤9517 分钟前
数据结构:递归的种类(Types of Recursion)
数据结构·算法
小熊猫写算法er1 小时前
终极数据结构详解:从理论到实践
数据结构
-qOVOp-2 小时前
408第一季 - 数据结构 - 栈与队列的应用
数据结构
鑫鑫向栄2 小时前
[蓝桥杯]修改数组
数据结构·c++·算法·蓝桥杯·动态规划
鑫鑫向栄2 小时前
[蓝桥杯]带分数
数据结构·c++·算法·职场和发展·蓝桥杯
sss191s3 小时前
Java 集合面试题从数据结构到 HashMap 源码剖析详解及常见考点梳理
java·开发语言·数据结构
鑫鑫向栄5 小时前
[蓝桥杯]堆的计数
数据结构·c++·算法·蓝桥杯·动态规划
weixin_419658318 小时前
数据结构之LinkedList
数据结构
无敌的小笼包13 小时前
第四讲:类和对象(下)
数据结构·c++
鑫鑫向栄14 小时前
[蓝桥杯]解谜游戏
数据结构·c++·算法·职场和发展·蓝桥杯