数据结构 单向链表(不循环)的基础知识和基础操作

数据结构 单向链表(不循环)的基础知识和基础操作_第1张图片

数据结构 单向链表(不循环)的基础知识和基础操作_第2张图片

数据结构 单向链表(不循环)的基础知识和基础操作_第3张图片

头定义:

typedef int datatype;
typedef struct Node
{
	//数据域存储数据
	datatype data;
	//指针域存储下一个地址
	struct Node *next;
}*Linkelist;

创建节点

Linkelist create_node()//创建新节点
{
	Linkelist node=(Linkelist)malloc(sizeof(struct Node));
	if(node==NULL)
		return NULL;
	node->data=0;
	node->next=NULL;
	return node;
}

头插(从第一个插入)

Linkelist insert_head(datatype e,Linkelist L)//头插
{
	//在堆区创建一个节点
	Linkelist node=create_node();//在堆区申请一个节点
	node->data=e;//赋值
	node->next=L;//头插
	L=node;
	return L;
}

输出

int output(Linkelist L)//输出
{
	if(L==NULL)
	{
		return -1;
	}
	while(L!=NULL)
	{
		printf("%d ",L->data);
		L=L->next;
	}
	puts("");
	return 0;
}

尾插(插在最后一个)

Linkelist  insert_rear(datatype e,Linkelist L)//尾插
{
	//创建一个新节点
	Linkelist newrear=create_node();
	newrear->data=e;
	if(L==NULL)
		L=newrear;
	else
	{
		Linkelist rear=L;//尾节点从头节点开始后移
		while(rear->next!=NULL)
		{
			rear=rear->next;
		}
		rear->next=newrear;
	}
	return L;
}

头删(删除第一个)

Linkelist delete_head(Linkelist L)//头删
{
	//判断链表是否为空
	if(L==NULL)
		return NULL;
	if(L->next==NULL)
	{
		free(L);
		L=NULL;
	}
	else
	{
		Linkelist q=L->next;
		L->data=q->data;
		L->next=q->next;
		free(q);
		q=NULL;
	}
	return L;
}

尾删

Linkelist delete_rear(Linkelist L)//尾删
{
	if(L==NULL)
		return NULL;
	if(L->next==NULL)
	{
		free(L);
		L=NULL;
	}
	else
	{
		Linkelist secondrear=L;
		while(secondrear->next->next!=NULL)
		{
			secondrear=secondrear->next;
		}
		free(secondrear->next);
		secondrear->next=NULL;
	}
	return L;
}

计算节点数

int len_Linkelist(Linkelist L)//计算节点数
{
	int count=0;
	while(L!=NULL)
	{
		count++;
		L=L->next;
	}
	return count;
}

按位置插入

Linkelist insert_pos(int pos,datatype e,Linkelist L)//按位置插入
{
	if(NULL==L||pos<1||pos>len_Linkelist(L)+1)
	{
		printf("插入失败\n");
		return L;
	}
	Linkelist p=L;
	if(pos==len_Linkelist(L)+1)
	{
		insert_rear(e,L);
		return L;
	}
	for(int i=1;inext;
	}
	Linkelist new=create_node();
	new->next=p->next;
	p->next=new;
	new->data=p->data;
	p->data=e;
	return L;
}

按位置修改

Linkelist rev_pos(int pos,datatype e,Linkelist L)//按位置修改
{
	if(NULL==L||pos<1||pos>len_Linkelist(L))
	{
		printf("修改失败\n");
		return L;
	}
	Linkelist p=L;
	for(int i=1;inext;
	}
	p->data=e;
	return L;
}

按位置查找

datatype seek_pos(int pos,Linkelist L)//按位置查找
{
	if(NULL==L||pos<1||pos>len_Linkelist(L))
	{
		return -1;
	}
	Linkelist p=L;
	for(int i=1;inext;
	}
	return p->data;
}

按位置删除

Linkelist delete_pos(int pos,Linkelist L)//按位置删除
{
	if(NULL==L||pos<1||pos>len_Linkelist(L))
	{
		printf("删除失败\n");
		return L;
	}
	Linkelist p=L;
	if(pos==1)
	{
		L=delete_head(L);
	}
	else
	{
		for(int i=1;inext;
		}
		Linkelist q=p->next;
		p->next=q->next;
		free(q);
		q=NULL;
	}
		return L;
}

查找元素位置

int search_pos(datatype key, Linkelist L)//查找元素位置
{
	if(NULL==L)
	return -1;
	int pos=0;
	while(L!=NULL)
	{
		pos++;
		if(L->data==key)
			return pos;
		L=L->next;
	}
	return -1;
}

按元素删除

Linkelist delete_data(datatype key,Linkelist L)//按元素删除
{
	int pos=search_pos(key,L);
	if(pos==-1)
	{
		printf("删除失败\n");
		return L;
	}
	L=delete_pos(pos,L);
	return L;
}

全部逆置

Linkelist rev_linklist(Linkelist L)//全部逆置
{
	if(NULL==L||L->next==NULL)
		return L;
	Linkelist p=L->next;
	int len=len_Linkelist(L);
	L->next=NULL;
	for(int i=1;inext;
		t->next=L;
		L=t;
	}
	return L;
}

释放所有节点空间

Linkelist free_space(Linkelist L)//释放空间
{
	if(NULL==L)
	{
		return NULL;
	}
	int len=len_Linkelist(L);
	for(int i=0;i

对节点输入值并进行冒泡排序(升序)

void Bubble(Linkelist L)//冒泡
{
	if(NULL==L||L->next==NULL)
		return;
	int len=len_Linkelist(L);
	int i,j,count;
	Linkelist p;
	for(i=1;inext)
		{
			if(p->data>p->next->data)
			{
				datatype t=p->data;
				p->data=p->next->data;
				p->next->data=t;
				count++;
			}
		}
		if(count==0)
			break;
	}
}

对节点输入值并进行简单排序(升序)

void Sort(Linkelist L)//简单排序
{
	if(NULL==L||L->next==NULL)
		return;
	Linkelist p,q,k;
	int len=len_Linkelist(L);
	int i,j;
	for(i=1,p=L;inext)
	{
		k=p;
		for(j=i+1,q=p->next;jnext)
		{
			if(k->data>q->data)
				k=q;
		}
		if(k->data!=p->data)
		{
			datatype m=p->data;
			p->data=k->data;
			k->data=m;
		}
	}
}

按元素插入

Linkelist insert_data(datatype key,datatype e,Linkelist L)//按元素插入
{
	if(NULL==L)
		return L;
	int pos=search_pos(key,L);
	if(pos==-1)
	{
		printf("插入失败\n");
		return L;
	}
	insert_pos(pos,e,L);
	return L;
}

按元素修改

Linkelist rev_data(datatype key,datatype e,Linkelist L)//按元素修改
{
	if(NULL==L)
		return L;
	int pos=search_pos(key,L);
	if(pos==-1)
	{
		printf("修改失败\n");
		return L;
	}
	rev_pos(pos,e,L);
	return L;
}

你可能感兴趣的:(数据结构,链表,算法,c语言)