链表的操作

//打印
void ListPrint(LNode* C)
{
	LNode* cur = C->next;
	while (cur != NULL)
	{
		printf("%d ", cur->data);
		cur = cur->next;
	}
}
//尾插法
LNode* creatlistR(LNode* L)
{
	LNode* s, * r;
	int a[5] = { 1,12,34,42,58 };
	int i;
	L = (LNode*)malloc(sizeof(LNode));
	if (L == NULL)
	{
		printf("Error\n");
		exit(-1);
	}
	
	r = L;
	for (i = 0; i < 5; i++)
	{
		s = (LNode*)malloc(sizeof(LNode));
		if (s == NULL)
		{
			printf("Error\n");
			exit(-1);
		}
		s->data = a[i];
		r->next = s;
		r = r->next;
	}
	r->next = NULL;
	return L;
} 
//头插法
LNode* creatlistF(LNode* D)  
{
	int a[5] = { 14,27,32,49,51 };
	LNode* s;
	int i;
	D = (LNode*)malloc(sizeof(LNode));
	D->next = NULL;
	for (i = 0; i < 5; i++)
	{
		s = (LNode*)malloc(sizeof(LNode));
		s->data = a[i];
		s->next = D->next;
		D->next = s;
	}
	return D;
}
//不改变链表的前提下,找出单链表的倒数第k个结点的值
int Find(LNode* C, int k)   
{
	LNode* p = C->next;
	LNode* q = C->next;
	int i;
	for (i = 1; i < k; i++)
	{
		q = q->next;
		if (q == NULL)
			return -1;
	}
	while (q->next != NULL)
	{
		p = p->next;
		q = q->next;
	}
	// q先动移动k-1次 与p保持k-1个距离 q和p同时移动 直到q的next到null结束
	return p->data;
}
//逆序带头结点的单链表--------方法和头插法类似
LNode* reverseList(LNode* L)
{
	LNode* q;
	LNode* p = L->next;
	L->next = NULL;
	while(p!=NULL)
	{
		q = p->next;
		p->next = L->next;
		L->next = p;
		p = q;
		
	} 
	return L;


}
//两个链表归并为一个非递减有序链表
LNode* merge(LNode* A, LNode* B)
{
	LNode* C;
	LNode* p = A->next;
	LNode* q = B->next;
	LNode* r; //记录产生的链表的位置
	C = A;
	r = C;
	C->next = NULL;
	while (q != NULL && p != NULL)
	{
		if (q->data <= p->data)
		{
			r->next = q;
			q = q->next;
			r = r->next;
		}
		else
		{
			r->next = p;
			p = p->next;
			r = r->next;
		}
	}
	r->next = NULL;
	if (p != NULL)r->next = p;
	if (q != NULL)r->next = q;
	return C;
}
//删除带头节点的单链表最小的节点(最小唯一)
LNode* DelMinNode(LNode* L)
{
	if (L == NULL || L->next == NULL)
		return -1;
	LNode* p = L->next;
	LNode* pre = L;
	LNode* min = p;
	LNode* premin = L;
	while (p != NULL)
	{
		if (p->data < min->data)
		{
			min = p;
			premin = pre;
		}
		pre = p;
		p = p->next;
	}
	premin->next = min->next;
	free(min);
	return L;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值