单向链表的基本操作

链表:

链表的创建:

1;需要一个结点结构:
typedef struct code//typedef 重命名数据结构,方便后续使用 
{
	struct code* Node; 
	int num;
}Lemon;
链表的创建方法有基本四种:

 1. 不带头结点的头插法
 2. 不带头结点的尾插法
 3. 带头结点的头插法
 4. 带头结点的尾插法
这里提醒一下:创建一个结点,往往会在链表的末端而不是前端。

不带头结点的头插法:

Lemon* LemonCreat()
{
	int b;
	Lemon *p,*heat;
	heat=NULL;
	for(int i=0;;i++)
	{
		int c;
		p=(Lemon*)malloc(sizeof(Lemon));
		cin >> c;
		if(c==-1)break;
		p->num=c;
		p->Node=heat;
		heat=p; 
	}
	return heat;
}

不带头结点的尾部插法:

Lemon* LemonCreat()
{
	int b;
	Lemon *p,*heat,*rear;
	heat=(Lemon*)malloc(sizeof(Lemon));
	rear=heat;
	for(int i=0;;i++)
	{
		p=(Lemon*)malloc(sizeof(Lemon));
		int c; 
		cin >> c;
		if(c==-1)break;
		p->num=c;
		rear->Node=p;
		rear=p;
	}
	rear->Node=NULL;
}

带头结点的头插法:

Lemon* LemonCreat()
{
	int b;
	Lemon *p,*heat;
	heat=(Lemon*)malloc(sizeof(Lemon));
	heat->Node=NULL;
	for(int i=0;;i++)
	{
		p=(Lemon*)malloc(sizeof(Lemon));
		int c; 
		cin >> c;
		if(c==-1)break;
		p->num=c;
		p->Node=heat->Node;
		heat->Node=p;
	}
	return heat;
}

带头结点的尾部插法:

Lemon* LemonCreat()
{
	Lemon *p,*heat,*rear;
	int b;
	cin >> b;
	heat=(Lemon*)malloc(sizeof(Lemon));
	rear=heat;
	for(int i=0;i<b;i++)
	{
		p=(Lemon*)malloc(sizeof(Lemon));
		int c;
		cin >> c;
		p->num=c;
		rear->Node=p;
		rear=p;
	}
	rear->Node=NULL;
	return heat;
}

带头结点的优点:


 1. 由于开始的指针是存于头结点中,在进行插入与删除等操作的时候,
 方便。
 2. 无论链表是否为空,其头指针是指向头结点在的非空指针(空表中头
 结点的指针域为空),因此空表和非空表的处理也就统一了。

链表的插入:

Lemon* Lemonadd(Lemon *p,int n,int m)//n在那个结点,m所要添加的数据 
{
	Lemon *q,*heat;
	heat=p;//头结点 
	for(int i=0;i<=b;i++)
	{
		if(i==n)//枚举找到该结点 
		{
			q=(Lemon*)malloc(sizeof(Lemon));
			q->num=m;
			q->Node=p->Node;
			p->Node=q;
		}
		else 
		{
			p=p->Node;
		}
	}
	return heat; 
 } 

链表的删除:

Lemon* Lemonpop(Lemon *p,int n)//n为所要删除的节点 
{
	Lemon *q,*heat;
	heat=p;//头结点 
		for(int i=0;i<b;i++)//b为所有的结点数 
		{
			if(i==n)//找到要删除的结点 
			{
				q=(Lemon*)malloc(sizeof(Lemon));
				q=p->Node;
				p->Node=q->Node; 
			}
			else
			{
				p=p->Node;
			}
		}
		return heat;
}

链表的逆序输出:

链表的逆序输出:因为往往添加结点都是从末端开始添加,导致所输出的
元素往往会逆序,例如:1 2 3 4 5用头插法来输入的时候,会输出5 4
3 2 1的结果。如果要逆序输出可以:

 1. 采用带有头指针的尾部插入法(上文有介绍,这里就不过多解释)
 2. 采用递归的方式输出:代码在下文
void LemonPrintf(Lemon* root,int num1)//num1为结点数,root为链表结点 
{
	if(root==NULL)
	{
		return;
	}
	LemonPrintf(root->next,num1+1);
	printf("%d ",root->num);
}

合并链表:

Lemon* LemonConnect(Lemon *p,Lemon *q)//将p链表插在q链表前面
{
	Lemon *heat;
	heat=p;//头结点
	for(int i=0;i<5;i++)
	{
		p=p->Node;//找到q链表末端
	}
	p->Node=q->Node;//这里不是q,因为q头结点是NULL
	return heat;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值