原题链接:数据结构-链表的基本操作
解题思路:
注意事项:
main函数结束及删除节点时,删除malloc申请的堆空间,避免内存泄漏
参考代码:
#include <stdio.h> #include <stdlib.h> /** 链表节点 */ typedef struct LNode { int val; struct LNode *next; } LNode; /** 从链表中获取指定位置的节点 */ LNode *getNode(LNode *L, int index) { if (index == 0) { return L; } if (index == 1) { return L->next; } LNode *p = L->next; while (p && --index) { p = p->next; } return p; } /** 从链表中获取指定位置的节点值*/ void get(LNode *L, int index) { LNode *p = getNode(L, index); if (p) { printf("%d\n", p->val); } else { printf("get fail\n"); } } /** 从链表中删除指定位置的节点 */ void delete(LNode *L, int index) { LNode *p = getNode(L, index - 1); // 获取删除的前一个节点 if (p && p->next) { LNode *node = p->next; p->next = p->next->next; free(node); // 释放删除节点的堆空间 printf("delete OK\n"); } else { printf("delete fail\n"); } } /** 在链表指定位置插入节点 */ void insert(LNode *L, int index, int val) { LNode *p = getNode(L, index - 1); // 获取插入的前一个节点 if (p) { LNode *node = malloc(sizeof(LNode)); node->val = val; node->next = p->next; p->next = node; printf("insert OK\n"); } else { printf("insert fail\n"); } } /** 打印输出链表 */ void show(const LNode *L) { L = L->next; if (!L) { printf("Link list is empty\n"); return; } while (L) { printf("%d ", L->val); L = L->next; } printf("\n"); } /** 创建带头节点的链表*/ LNode *createList(int n) { LNode *L = malloc(sizeof(LNode)); // 虚拟头结点 L->next = NULL; LNode *node; while (n--) { node = malloc(sizeof(LNode)); scanf("%d", &node->val); node->next = L->next; // 头插法 L->next = node; } return L; } /** 释放链表节点 */ void freeList(LNode *L) { while (L) { LNode *node = L; L = L->next; free(node); } } int main() { int n, m; scanf("%d", &n); // 初始化链表节点数 LNode *L = createList(n); // 创建链表 scanf("%d", &m); // 操作次数 char str[10]; int a, e; while (m--) { scanf("%s", str); switch (str[0]) { case 'g': // get scanf("%d", &a); get(L, a); break; case 'i': // insert scanf("%d %d", &a, &e); insert(L, a, e); break; case 'd': // delete scanf("%d", &a); delete(L, a); break; case 's': // show show(L); break; } } freeList(L); }
0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复