单链表

单链表

1、链表的创建

由于需要改变主函数头指针的值,所以将头指针的地址传给一个二级指针

int create_list(pnode *head)
{
	if((*head = (pnode)malloc(sizeof(node))) == NULL)
	{
		return -1;	//失败返回-1
	}
	(*head)->data = -1;	//-1表示头指针不存储内容
	(*head)->next = NULL;
	return 0;	//成功返回0
}

2、头插法

申请空间创建一个新的节点,让该节点的next指向头指针的下一个节点,然后让头指针的next指向该节点

void head_insert_list(pnode head,int d)
{
	pnode p = (pnode)malloc(sizeof(node));
	if(p == NULL)
	{
		return;
	}
	p->data = d;	//申请新的空间并存值
	p->next = head->next;	//让p的next指针指向head的next所指向的空间
	head->next = p;		//让head的next指向p

	return;
}

3、尾插法

申请空间创建一个新的节点,然后找到该链表的最后一个节点,让最后一个节点的next指向新的节点

void tail_insert_list(pnode head,int d)
{
	pnode p = (pnode)malloc(sizeof(node));
	if(p == NULL)
	{
		return;
	}
	p->data = d;	//申请新的空间并存值
	p->next = NULL;

	while(head->next != NULL)
	{
		head = head->next;	//找到链表的尾部
	}
	head->next = p;	//让链表的尾部指向p

	return;
}

4、链表的遍历

void print_list(pnode head)
{
	head = head->next;
	while(head != NULL)
	{
		printf("%d ",head->data);
		head = head->next;
	}
	printf("\n");
	return;
}

5、链表的排序

这里采用冒泡排序法

void bubble_sort_list(pnode head)
{
	if(head == NULL || head->next == NULL || head->next->next == NULL)
	{
		return;	//当头结点没有空间、链表没有或者只有一个元素的时候不需要排序
	}

	pnode end = NULL,p = NULL,front = NULL;
	//end表示未排序部分的终点
	while(head->next != end)
	{
		front = head;
		p = head->next;
		while(p->next != end)
		{
			if(p->data > p->next->data)
			{
				front->next = p->next;
				p->next = p->next->next;
				front->next->next = p;
				//对节点进行交换

				p = front->next;
				//使p重新指向front的下一个节点
			}
			front = front->next;
			p = p->next;
		}
		end = p;
	}

	return;
}

6、链表的查找

pnode find_list(pnode head,int d)
{
	head = head->next;
	while(head != NULL)
	{
		if(head->data == d)
		{
			return head;	//找到返回地址
		}
		head = head->next;
	}
	return NULL;	//未找到返回空
}

7、链表节点的删除

首先找到存储要删除数据的节点,然后该节点的上一个节点指向该节点的下一个节点,释放该节点

void delete_list(pnode head,int d)
{
	pnode front = head;
	head = head->next;
	while(head != NULL)
	{
		if(head->data == d)
		{
			break;
		}
		front = head;
		head = head->next;
	}
	if(head != NULL)
	{
		front->next = head->next;	//找到节点后将上一节点指向下一节点然后删除该节点
		free(head);
	}
	return;
}

8、链表的释放

void destroy_list(pnode head)
{
	pnode p;
	while(head != NULL)
	{
		p = head->next;
		free(head);
		head = p;
	}
}

9、顺序插入

申请空间创建一个新的节点,找到第一个存储的数据大于新的节点存储的数据的节点,然后让该节点的上一个节点的next指向新的节点,让新的指点的next指向该节点。该方法只适用于链表本身是有序的。

void order_insert_list(pnode head,int d)
{
	pnode front = head;
	head = head->next;

	pnode p = (pnode)malloc(sizeof(node));
	if(p == NULL)
	{
		return;
	}
	p->data = d;
	p->next = NULL;

	while(head != NULL)
	{
		if(head->data > d)
		{
			break;
		}
		front = head;
		head = head->next;
	}

	front->next = p;
	p->next = head;
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值