单链表排序和删除(最后面)

        main.c文件

#include "link.h"
int main()
{
//申请头文件函数,返回节点地址给L
Plink L=get_head();
//头插法创建整表

int i,a[10] = {10,20,30,100,50,60,70,80,90,95};
for(i=0;i<WE;i++)
	
{
	head_insert(L,a[i]);//头插法将数组元素放入单链表
}

putchar(10);
#if 0

//尾插法创建整表
for(i=0;i<WE;i++)
{
	tail_insert(L,a[i]);
}
putchar(10);
node_output(L);//输出节点

insert_any_pos(L,4,100);//第4位置插入值100

//单链表遍历
node_output(L);//输出节点

//头节点删除
head_dele(L);
node_output(L);//输出节点

//尾节点删除
tail_dele(L);
node_output(L);//输出节点

//任意位置删除
dele_any_pos(L,3);
node_output(L);//输出节点

//按照值查找并修改
value_output(L,100);
node_output(L);//输出节点

//按照位置查找并修改
pos_find_change(L,3);
node_output(L);//输出节点
#endif
//逆置
nodo_reverse(L);
node_output(L);//输出节点


//排序(按照值的大小)
sort_my(L);
node_output(L);//输出节点

//单链表每个节点进行销毁
destory_my(L);
node_output(L);//输出节点

	return 0;

}

link.c文件

#include "link.h"
Plink get_head()//申请头节点函数
{
	Plink P=malloc(sizeof(Link));//申请结构体大小空间
	if(P==NULL)
	{
		printf("申请头结点失败\n");
		return NULL;
	}
	P->len=0;//节点长度(数据域赋值)
	P->next =NULL;//指针域赋值(只有一个头文件)
	return P;
}
int head_insert(Plink L,int e)//头插法创建整表
{
	if(L==NULL)
	{
		printf("单链表不存在\n");
		return -1;
	}
	//将第一个节点的地址放入新节点的地址
	Plink p=(Plink)malloc(sizeof(Link));//申请
	p->data = e;//新节点数据域赋值
	//将第一个节点的地址放入新节点指针域
	p->next = L->next;
	//将新节点地址放入头结点指针域
	L->next =p;
	L->len++;
}
//尾插法创建整表

int tail_insert(Plink L,int e)//尾插法创建整表
{
	if(L==NULL)
	{
		printf("单链表不存在\n");
		return -1;
	}
	Plink t =L;
	int i;
	for(i=0;i<L->len;i++)
	{
		t=t->next;
	}
	Plink p=malloc(sizeof(Link));
	p->data=e;
	t->next=p;
	p->next= NULL;
	L->len++;
	return 0;
}
//任意位置插入,插入位置为key,插入的值为sumer
int insert_any_pos(Plink L,int key,int sumer)
{
	if(L==NULL||L->len==0)
	{
		printf("单链表不存在或者为空\n");
		return -1;
	}
	int i;
	Plink t=L;
	for(i=0;i<key-1 ;i++)//循环key-1次指向待插入
	{
		t=t->next;
	}
	Plink p=malloc(sizeof(Link));//申请结构体大小空间
	p->next=t->next;//新节点右边链接
	p->data=sumer;//新节点数据域赋值
	t->next=p;//新节点左边链接
	L->len++;
	return 0;
}
int head_dele(Plink L)
{
	if(L==NULL||L->len==0)
	{
		printf("单链表不存在或者为空\n");
		return -1;
	}
	Plink t=L;
	t=L->next;
	L->next=t->next;
	free(t);
	t=NULL;//释放节点空间
	L->len--;
	return 0;
}
int tail_dele(Plink L)
{
	if(L==NULL||L->len==0)
	{
		printf("单链表不存在或者为空\n");
		return -1;
	}
	Plink t=L;
	for(int i=0;i<L->len-1;i++)
	{//t指向要删除的前驱
		t=t->next;
	}
	Plink Q=t->next;//保留要删除的空间节点
	t->next=NULL;//指针域指向空
	free(Q);//长度减一
	Q=NULL;
	L->len--;//释放Q指向的节点空间
	return 0;
}

//任意位置删除
int dele_any_pos(Plink L,int key)
{
	if(L==NULL||L->len==0)
	{
		printf("删除失败\n");
		return -1;
	}
	Plink t=L;
	int i;
	for (i=0;i<key-1;i++)
	{
		t=t->next;
	}
	Plink Q=t->next;//保留要删除的节点
	t->next=t->next->next;
	L->len--;
	free(Q);
	Q=NULL;
	return 0;
}
//按照值查找并修改
int value_output(Plink L,int sumer)
{
	if(L==NULL||L->len==0)
	{
		printf("单链表为空或不存在\n");
		return -1;
	}
	Plink t=L;
	int i,key,pos=-1;
	for(i=0;i<L->len;i++)
	{
		t=t->next;
		if(key==t->data)
		{
			pos=i+1;//保留节点位置
			printf("查找成功,在第%d个位置,请输入你要修改的值\n",pos);
			scanf("%d",&key);
			t->data=key;//修改
			printf("修改成功\n");
		}
	}
	if(pos==-1)
	{
		printf("查找失败\n");
	}
	return 0;
}
//按位置查找并修改
int pos_find_change(Plink L,int pos)
{
	if(L==NULL||L->len==0||pos<1||pos>L->len)
	{
		printf("查找失败\n");
	}
	int i,key;
	Plink t=L;
	for(i=0;i<pos;i++)
	{
		t=t->next;
	}
	pos=i+1;//保留节点位置
	printf("查找成功,该节点为:%d\n请输入你要修改的值\n",t->data);
	scanf("%d",&key);
	t->data=key;//修改
	printf("修改成功\n");
	return 0;
}
//单链表遍历
int node_output (Plink L)
{
	if(L==NULL||L->len==0)
	{
		printf("单链表不存在或者为空\n");
		return -1;
	}
	int i;
	Plink t=L;//指向头节点
	for(i=0;i<L->len;i++)
	{

		t=t->next;
		printf("%d\t",t->data);
		//printf("%p\n",t->next);
	}
	putchar(10);
}
//单链表的逆置
int nodo_reverse(Plink L)
{
	if(L==NULL||L->len==0)
	{
		printf("单链表不存在或者为空\n");
		return -1;
	}

Plink t=L->next;
Plink Q=L->next->next;

while(Q!=NULL)
{
	t->next=Q->next;//连上防止丢失
	Q->next=L->next;
	L->next=Q;
	Q=t->next;
}
}
int  sort_my(Plink L)
{
	if(L==NULL||L->len==0)
	{
		printf("单链表不存在或者为空\n");
		return -1;
	}
	Plink t;
	Plink Q;
	Plink M;
	int i,j;
	for (i=0;i<L->len-1;i++)
	{
		t=L->next;
		Q=t->next;
		M=L;
		for(j=0;j<L->len-i-1;j++)
		{
			if(t->data<Q->data)
			{
				Q=t->next;
				t->next=Q->next;
				Q->next=t;
				M->next=Q;
				M=M->next;
			}
			else
			{
				t=t->next;
				Q=Q->next;
				M=M->next;
			}
		}
		}
	return 0;

}
void destory_my(Plink L)
{
	if(L==NULL||L->len==0)
	{
		return ;
	}
	Plink t=L;
	while(L)
	{
		t=L->next;
		free(L);
		L=t;
	//	L->len--;
	}
//	L=NULL;

}




/*	Plink Q;
	while(L->next!=NULL&&L->len>1)
	{
		printf("2\n");
		Q=t->next;
		free(t);
		t=Q;
		L->len--;
		printf("1");
	}
	if(L!=NULL)
	{
		printf("9\n");
		free(L);
	}
	L=NULL;
return ;
}
*/

link.h文件

#ifndef __LINK_H__
#define __LINK_H__
#include <myhead.h>
#define WE 10
typedef struct node
{
	union{
		int len;//头结点数据域,记录节点个数
		int data;//正常节点数据域,存储数据
	};
	struct node *next;//节点指针域,存储下一节点地址
}Link,*Plink;//结构体普通类型,结构体指针类型


//申请头节点函数
Plink get_head();
//单链表遍历
int node_output (Plink L);
//尾插法创建整表
int tail_insert(Plink L,int e);
//头插法创建整表
int head_insert(Plink L,int e);
//任意位置插入
int insert_any_pos(Plink L,int key,int sumer);
//头删除
int head_dele(Plink L);
//尾删除
int tail_dele(Plink L);
//任意位置删除
int dele_any_pos(Plink L,int key);
//按照值查找并修改
int value_output(Plink L,int sumer);
//按位置查找并修改
int pos_find_change(Plink L,int pos);
//逆置
int nodo_reverse(Plink L);
//排序
int sort_my(Plink L);
//销毁
void destory_my(Plink L);
#endif

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值