剑指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的位置还是没有动
作者:chen.yu
深信服三年半工作经验,目前就职游戏厂商,希望能和大家交流和学习,
微信公众号:编程入门到秃头 或扫描下面二维码
零基础入门进阶人工智能(链接)