数据结构 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;
}
相关推荐
dragoooon342 小时前
[优选算法专题九.链表 ——NO.53~54合并 K 个升序链表、 K 个一组翻转链表]
数据结构·算法·链表
松涛和鸣2 小时前
22、双向链表作业实现与GDB调试实战
c语言·开发语言·网络·数据结构·链表·排序算法
云里雾里!9 小时前
力扣 209. 长度最小的子数组:滑动窗口解法完整解析
数据结构·算法·leetcode
憨憨崽&10 小时前
进击大厂:程序员必须修炼的算法“内功”与思维体系
开发语言·数据结构·算法·链表·贪心算法·线性回归·动态规划
chem411111 小时前
C 语言 函数指针和函数指针数组
c语言·数据结构·算法
liu****11 小时前
八.函数递归
c语言·开发语言·数据结构·c++·算法
客梦11 小时前
数据结构-树结构
数据结构·笔记
老约家的可汗12 小时前
数据结构之栈和队列
数据结构
XH华12 小时前
数据结构第六章:栈的学习
数据结构
adam_life13 小时前
【P8306 【模板】字典树】
数据结构·算法·字典树·trie·哈希表··结构体