单向链表功能的实现(20250207)

单向链表 = 数据域 + 指针域 以结构体的形式实现

typedef struct node{
	Data_type data;
	struct node *pnext;
}Link_node;

创建有头链表表头

Link_node *create_link()
{
	Link_node *pnode = malloc(sizeof(Link_node));
	if(NULL == pnode)
	{
		return NULL;
	}

	pnode -> pnext = NULL;
	return pnode;	
}

头插

int insert_head_link(Link_node *phead, Data_type data)
{
	Link_node *pnode = malloc(sizeof(Link_node));
	if(NULL == pnode)
	{
		printf("fail malloc");
		return -1;
	}

	pnode -> data = data;
	
	pnode -> pnext = phead -> pnext;
	phead -> pnext = pnode;
	return 0;
}

尾插

int insert_tail_link(Link_node *phead,Data_type data)
{
	Link_node *p = NULL;
	Link_node *pnode = malloc(sizeof(Link_node));
	if(NULL == pnode)
	{
		return -1;
	}
	pnode -> data = data;
	pnode -> pnext = NULL;

	p = phead;
	while(p->pnext != NULL)
	{
		p = p->pnext;
	}
	p -> pnext = pnode;
	return 0;
}

头删

void delete_head_link(Link_node *phead)
{
	if(NULL == phead -> pnext)
	{
		return;
	}
	Link_node *p = phead -> pnext;
	//p = p->pnext;
	phead -> pnext = p->pnext;
	free(p);
}

尾删

void delete_tail_link(Link_node *phead)
{	
	
	if(NULL == phead)
	{
		return;
	}
	Link_node *p_pre = phead -> pnext;
	Link_node *p_del = p_pre-> pnext;
	while(NULL != p_del->pnext)
	{
		p_pre = p_pre -> pnext;
		p_del = p_del -> pnext;
	}
	p_pre->pnext = NULL;
	free(p_del);
}

删除指定节点

void dele_appoint_link(Link_node *phead, int i)
{
	Link_node *p = phead;
	Link_node *p_del = phead -> pnext;
	int j = 1;
	while(i != j)
	{
		p = p -> pnext;
		p_del = p_del -> pnext;
		++j;
	}
	p -> pnext = p -> pnext -> pnext;
	free(p_del);
}

倒序链表

void reverse_link(Link_node *phead)
{
	Link_node *p_temp = phead -> pnext;
	phead -> pnext = NULL;
	Link_node *p_insert = NULL;
	while(p_temp != NULL)
	{
		p_insert = p_temp;
		p_temp = p_temp -> pnext;

		p_insert -> pnext = phead -> pnext;
		phead -> pnext = p_insert;
	}
}

单向链表的插入排序

void insert_sort_link(Link_node *phead)
{
	if(NULL == phead)
	{
		return;
	}
	Link_node *p_temp = phead -> pnext -> pnext;
	phead -> pnext -> pnext = NULL;
	Link_node *p_insert = NULL;
	Link_node *p = NULL;

	while(p_temp != NULL)
	{
		p_insert = p_temp;
		p_temp = p_temp -> pnext;
		p = phead;
		while(p -> pnext != NULL && p -> pnext->data < p_insert -> data)
		{
			p = p -> pnext;
		}
		p_insert -> pnext = p -> pnext;
		p -> pnext = p_insert;
	}
}

销毁链表

void destory_link(Link_node *phead)
{
	//Link_node *p_current = phead->pnext;
	//Link_node *p_next;
	//Link_node *p = phead -> pnext;
	if(NULL == phead->pnext)
	{
		printf("is Only\n");
		return;
	}
	while(phead->pnext != NULL)
	{
		delete_head_link(phead);
	}
	free(phead);
}

查找中间节点(快慢指针)

Link_node *find_mid_link(Link_node *phead)
{
	if(NULL == phead)
	{
		return NULL;
	}
	Link_node *p_fast = phead;
	Link_node *p_low = phead;
	while(p_fast != NULL)
	{
		p_low = p_low -> pnext;
		p_fast = (p_fast -> pnext) -> pnext;
	}
	return p_low;
}

单向链表的遍历

void linkForeach(Link_node *phead)
{
	Link_node *p = phead -> pnext;
	
	for(p;p != NULL;p = p ->pnext)
	{
		printf("%d\n",p->data);
	}
}

查找链表内容

Link_node *searchForlink(Link_node *phead,Data_type data_dest)
{
	Link_node *p = phead -> pnext;
	for(p;p != NULL;p = p ->pnext)
	{
		if(data_dest == p->data)
		{
			printf("Found %d\n",p -> data);
			return p;
		}
	}
	if(NULL == p)
	{
			printf("Not Found\n");
	}
	return NULL;
}

根据查找情况修改内容

int modify_link(Link_node *phead,Data_type data_old,Data_type data_new)
{
	Link_node *pnode = searchForlink(phead, data_old);
	if(NULL != pnode)
	{
		pnode -> data = data_new;
		return 0;
	}
	return -1;
}

你可能感兴趣的:(链表,数据结构)