剑指offer之C语言实现链表(两种方式)

1 问题

用C语言实现链表

 

 

 

2 代码实现

#include <stdio.h>
#include <stdlib.h>

#define true 0
#define false -1

typedef struct Node
{
	int value;
	struct Node *next;
} List;

/**
 *初始化链表
 */
struct Node* init_list()
{
	struct Node *head = (struct Node*)malloc(sizeof(struct Node));
	if (head)
	{
		head->next = NULL;
		return head;
	}
	return NULL;
}

/*
 *创建节点
 */
struct Node* create_node(int value)
{
	struct Node *node = (struct Node*)malloc(sizeof(struct Node));
	if (node)
	{
		node->value = value;
		return node;
	}
	return NULL;
}

/*
 *第一种方法插入节点
 */
int insert_list(struct Node **head, List* node)
{
	if (*head == NULL || node == NULL)
	{
		printf("head or node is NULL");
		return false;
	}
	node->next = *head;
	*head = node;
	return true;
}

/*
 *第二种方法插入节点
 */
int insert_list1(struct Node *head, List* node)
{
	if (head == NULL || node == NULL)
	{
		printf("head or node is NULL");
		return false;
	}
	node->next = head->next;
	head->next = node;
	return true;
}

/*
 *第一种方法打印
 */
void print_list(List *head)
{
	if (head == NULL)
	{
		printf("head is NULL\n");
		return;	
	}
	while (head->next != NULL)
	{
		printf("value is %d\n", head->value);
		head = head->next;
	}
}

/*
 *第二种方法打印
 */
void print_list1(List *head)
{
	if (head == NULL)
	{

		printf("head is NULL\n");
		return;	
	}
	struct Node *p = head->next;
	while (p != NULL)
	{
		printf("value is %d\n", p->value);
		p = p->next;	
	}


}

/*
 *更具这个值能否能到节点
 */
struct Node* get_node(List *head, int value)
{

	if (head == NULL)
		return NULL;
	struct Node *p = head;
	while (p != NULL)
	{
		if (p->value == value)
		{
			return p;	
		}
		p = p->next;	
	}
	return NULL;	
}

/*
 *第一种方法删除节点
 */
int delete_node(struct Node **head, struct Node *node)
{
	if (*head == NULL)
		return false;
	if ((*head) == node)
	{
		*head = (*head)->next;
		return true;
	}
	struct Node *p = *head;
	while ((*head)->next != NULL)
	{	
		if ((*head)->next == node)
		{	
			(*head)->next =(*head)->next->next;
			*head = p;
			return true;
		}
		*head = (*head)->next;
	}
	*head = p;
	return false;
}

/*
 *第二种方法删除节点
 */
int delete_node1(struct Node *head, struct Node *node)
{
	if (head == NULL)
		return false;
	while (head->next != NULL)
	{
		if (head->next == node)
		{
			head->next = head->next->next;
			return true;
		}
		head = head->next;
	}
	return false;
}

/*
 *释放链表
 */
int free_list(List *head)
{
	if (head == NULL)
		return false;
	struct Node *p = NULL;
	while(head != NULL)
	{
		p = head;
		head = head->next;	
		free(p);
	}
	return true;
}

int main()
{
	struct Node* head = NULL;
	struct Node* node1 = NULL, *node2 = NULL, *node3 = NULL;
	struct Node* node4 = NULL, *node5 = NULL, *node6 = NULL;
	head = init_list();
	if (!head)
	{
		printf("init head fail\n");	
	}
	node1 = create_node(5);
	node2 = create_node(4);
	node3 = create_node(3);
	node4 = create_node(2);
	node5 = create_node(1);
	node6 = create_node(3);

	insert_list1(head, node1);
	insert_list1(head, node2);
	insert_list1(head, node3);
	insert_list1(head, node4);
	insert_list1(head, node5);
	insert_list1(head, node6);
	print_list1(head);
	printf("first print_list---------------\n");
	delete_node1(head, node1);
	print_list1(head);
	printf("second print_list--------------\n");
	free_list(head);
	head = NULL;

	head = init_list();
	if (!head)
	{
		printf("init head fail\n");	
	}
	node1 = create_node(5);
	node2 = create_node(4);
	node3 = create_node(3);
	node4 = create_node(2);
	node5 = create_node(1);
	node6 = create_node(3);
	
	insert_list(&head, node1);
	insert_list(&head, node2);
	insert_list(&head, node3);
	insert_list(&head, node4);
	insert_list(&head, node5);
	insert_list(&head, node6);
	print_list(head);
	printf("third print_list---------------\n");
	delete_node(&head, node4);
	print_list(head);
	printf("four print_list---------------\n");
	struct Node *result = get_node(head, 4);
	if (result)
	{
		printf("list contain node and the value of node is %d\n", result->value);
	}
	else
	{
		printf("list do not contain the node\n");	
	}
	free_list(head);
	head = NULL;
	return 0;	
}

 

 

 

3 运行结果

value is 3
value is 1
value is 2
value is 3
value is 4
value is 5
first print_list---------------
value is 3
value is 1
value is 2
value is 3
value is 4
second print_list--------------
value is 3
value is 1
value is 2
value is 3
value is 4
value is 5
third print_list---------------
value is 3
value is 1
value is 3
value is 4
value is 5
four print_list---------------
list contain node and the value of node is 4

 

 

4 总结

很明显第二种方式更换简单好理解,在函数里面如果我们传递指针进去,然后想修改这个指针的话,我们直接给这个指针赋值来改变这个指针是不可以的,因为是停时变量,我们直接可以返回新malloc的指针或者函数传递二级指针作为参数,在函数里面修改这个指针,同时我们把头结点传递函数里面去,我们直接操作head->next = head->next->next;这些都会有效.

用C语言实现的话,我们喜欢搞个头结点,然后每个函数里面传入头结点,我们函数里面改变的是head->next的值,但是我们就算移动了head节点,比如head = head->next; 但是实际上没有影响,因为是零时变量,最后的head的位置还是没有动

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码莎拉蒂 .

你的鼓励是我最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值