
单向链表实现增删改查的操作
链尾添加节点:
发布日期:2021-05-10 23:38:51
浏览次数:29
分类:精选文章
本文共 3203 字,大约阅读时间需要 10 分钟。
单向链表的增删改查操作实现
作为一名学习C语言的新手,我最近在实践链表数据结构的操作。链表是一种非常基础的数据结构,由节点组成,每个节点包含数据字段和指向下一个节点的指针。通过这一项目,我掌握了链表的增、删、改、查操作的实现方法。
链表操作概述
本文实现的链表包含以下功能:
- 增:在链尾、链中、链头增加节点
- 删:在链头、链中、链尾删除单个或多个节点
- 改:在链头、链中、链尾更改单个或多个节点数值
- 查:显示整个链表所有节点的数值
节点结构与初始化
节点结构定义如下:
struct node { int data; struct node *next;};
链表的初始化函数list_init
创建一个空链表:
struct node *list_init() { struct node *head = malloc(sizeof(struct node)); head->next = NULL; return head;}
增操作实现
int addtail(int newdata, struct node *list) { struct node *p = list; while (p->next != NULL) { p = p->next; } struct node *new = newnode(newdata); p->next = new;}
- 链中插入节点:
int insert(int olddata, int newdata, struct node *list) { int b = 0; struct node *p = list; while (p->next != NULL) { if (p->data == olddata) { struct node *new = newnode(newdata); new->next = p->next; p->next = new; b = 1; if (olddata == newdata) { p = p->next; } } p = p->next; } if (p->next == NULL && p->data == olddata) { struct node *new = newnode(newdata); p->next = new; b = 1; } printf("\n=====在链表中插入节点%d=====\n", olddata, newdata); if (b == 0) { printf("原链表节点没有%d这个数值!\n", olddata); }}
删操作实现
int delnode(int deldata, struct node *list) { int b = 0, m = 0; struct node *q = list; struct node *p = list->next; printf("\n=====删除节点%d=====\n", deldata); while (p != NULL) { if (p->data == deldata) { q->next = p->next; p->next = NULL; free(p); b = 1; m = 1; } if (m == 1) { p = q->next; m = 0; } else { p = p->next; q = q->next; } } if (b == 0) { printf("原链表节点没有%d这个数值!\n", deldata); }}
改操作实现
int change(int olddata, int newdata, struct node *list) { int b = 0; struct node *p = list->next; while (p != NULL) { if (p->data == olddata) { p->data = newdata; b = 1; } p = p->next; } printf("\n=====更改节点%d为%d=====\n", olddata, newdata); if (b == 0) { printf("原链表节点没有%d这个数值!\n", olddata); }}
展示所有节点
void show(struct node *list) { printf("链表各节点:\t"); struct node *p = list->next; while (p != NULL) { printf("%d\t", p->data); p = p->next; } printf("\n");}
主函数实现
int main(int argc, char **argv) { struct node *list = list_init(); addtail(350, list); addtail(100, list); addtail(200, list); addtail(200, list); addtail(250, list); addtail(800, list); addtail(200, list); addtail(100, list); show(list); insert(100, 150, list); show(list); delnode(200, list); show(list); delnode(150, list); show(list); delnode(350, list); show(list); change(250, 500, list); show(list); insert(700, 150, list); show(list); delnode(700, list); show(list); change(700, 150, list); show(list); return 0;}
运行结果分析
通过实际运行可见,链表操作功能实现良好。从初始链表构建到增删改查,每一步操作都能正确反映在链表中。例如,插入150后链表中出现150节点;删除200后链表长度减少;更改250为500后链表中对应节点更新。
通过这一项目,我对链表操作有了更深入的理解,也掌握了实际编程中的各种技巧。
发表评论
最新留言
不错!
[***.144.177.141]2025年05月02日 22时42分14秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Windows平台安装搭建 MongoDB环境
2019-03-15
网页表单Input的高级限制级用法
2019-03-15
iJ配置Maven环境详解
2019-03-15
仿QQ登陆界面
2019-03-15
Android控件之ProgressBar
2019-03-15
Activity之间传递数据的三种方式详解
2019-03-15
Kafka入门(常见错误)
2019-03-15
HttpServletResponse-完成文件下载
2019-03-15
什么题目的暂时还没想好
2019-03-15
Python中pip安装模块太慢
2019-03-15
docker安装
2019-03-15
N皇后问题解法(递归+回朔)
2019-03-15
面试题 08.01. 三步问题
2019-03-15
剑指 Offer 11. 旋转数组的最小数字
2019-03-15
剑指 Offer 57. 和为s的两个数字
2019-03-15
git 在本地删除、添加远端的源
2019-03-15
字符串的反转
2019-03-15
docker用法
2019-03-15
word文档注入(追踪word文档)未完
2019-03-15