剑指offer之C语言实现链表(两种方式)
发布日期:2021-06-29 14:13:29
浏览次数:2
分类:技术文章
本文共 4469 字,大约阅读时间需要 14 分钟。
1 问题
用C语言实现链表
2 代码实现
#include#include #define true 0#define false -1typedef 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 3value is 1value is 2value is 3value is 4value is 5first print_list---------------value is 3value is 1value is 2value is 3value is 4second print_list--------------value is 3value is 1value is 2value is 3value is 4value is 5third print_list---------------value is 3value is 1value is 3value is 4value is 5four 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的位置还是没有动
转载地址:https://chenyu.blog.csdn.net/article/details/86515602 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
网站不错 人气很旺了 加油
[***.192.178.218]2024年04月30日 05时16分43秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
el-table 二维数组合并行
2019-04-29
js获取当月的天数
2019-04-29
多个相邻的盒子外边框合并的问题
2019-04-29
js实现复制功能
2019-04-29
UR5e机械臂运行一直阻塞在waitForServer
2019-04-29
ROS把pkg1下的某个头文件和源文件生成动态链接库供pkg2调用
2019-04-29
使用urdf_tutorial快速可视化urdf文件
2019-04-29
SQl 数据完整性(随堂博客)
2019-04-29
左连接、右连接、内连接
2019-04-29
MySQL DQL语句基础(随堂博客)
2019-04-29
MySQL基础练习
2019-04-29
利用MySQL进行数据复杂查询(1)
2019-04-29
利用MySQL进行数据复杂查询(2)
2019-04-29
MySQL 表与表之间的关系
2019-04-29
Python数据处理
2019-04-29
Java练习题(面向对象)
2019-04-29
Python 利用os和shutil复制系统文件
2019-04-29
Python 循环输出菱形字符串
2019-04-29
MySQL常见错误总结
2019-04-29