• 数据结构(C语言)——单链表


    整体结构如上:看似简单,但第一次用C语言实现还是感觉有点吃力,尤其是特别容易让链表断裂

    下面是代码:(有链表的增删改查)

    注:这里E类型是用define将int进行了宏定义

    1. #include
    2. #include
    3. #include
    4. #define E int//以后想改元素类型就在这里该就行
    5. typedef struct node {
    6. E element;//元素
    7. struct node* next;//下一节点的指针
    8. }node;
    9. void initialise_node(node* head) {
    10. head->next = NULL;//初始化头节点
    11. }
    12. int add_node(node* head,E ele,int index) {
    13. node* tem = head;//拷贝一份head,以后在tem上进行修改
    14. if (index < 1) return -1;//插入要位置大于0
    15. while (--index) {
    16. tem = tem->next;
    17. if (tem == NULL)return -1;
    18. }
    19. node* ptr = (node*)malloc(sizeof(node));
    20. ptr->next = NULL;
    21. if (ptr == NULL) {//开辟内存失败情况
    22. perror("malloc");
    23. return -1;
    24. }
    25. ptr->element = ele;
    26. ptr->next = tem->next;
    27. tem->next = ptr;
    28. return 1;
    29. }
    30. ///
    31. /// 删除所有是ele的元素
    32. ///
    33. /// 头节点指针
    34. /// 元素
    35. ///
    36. int del_node(node* head, E ele) {
    37. node* tem = NULL;
    38. while (1) {
    39. if (head->next == NULL) return 2;
    40. tem = head->next;//头节点移动
    41. if (tem->element == ele) {
    42. if (tem->next == NULL) {//找到的节点下一节点为空的情况
    43. free(tem);
    44. head->next = NULL;
    45. return 1;
    46. }
    47. head->next=tem->next;
    48. free(tem);
    49. }
    50. head = head->next;
    51. }
    52. }
    53. ///
    54. /// 找出所有元素,并返回这个节点地址,如有需要返回多个可以创建一个数组
    55. ///
    56. /// 头节点地址
    57. /// 要找的元素
    58. ///
    59. node* find_node(node* head, E ele) {
    60. head = head->next;//先让头节点移动一次
    61. while (head != NULL) {
    62. if (head->element == ele) {
    63. return head;
    64. }
    65. head = head->next;
    66. }
    67. }
    68. node* modify_node(node* head, int index, E ele) {
    69. head = head->next;//头节点指针先移动一次
    70. if (index < 1)return -1;
    71. while (--index && head != NULL) {
    72. head = head->next;
    73. }
    74. if (head == NULL)return -1;
    75. head->element = ele;
    76. return head;//返回这个元素的地址
    77. }
    78. //通过第几个数字找到元素
    79. int del_node_byindex(node* head,int index) {
    80. node* tem = head->next;
    81. if (index < 1)return -1;
    82. while (--index && tem != NULL) {
    83. head = tem;
    84. tem = tem->next;//移动节点
    85. }
    86. if (tem == NULL)return -1;
    87. //删除节点
    88. head->next = tem->next;
    89. free(tem);
    90. tem = NULL;
    91. }
    92. void print_node(node* head) {
    93. node* tem = head;
    94. while (tem->next!=NULL) {
    95. tem = tem->next;
    96. printf("%d\n", tem->element);
    97. }
    98. }
    99. int main() {
    100. node head;
    101. initialise_node(&head);
    102. for (int i = 1; i <= 8; i++) {
    103. add_node(&head, 20 * i, i);
    104. }
    105. add_node(&head, 20, 9);
    106. printf("%d\n", del_node(&head, 20));
    107. node* find = find_node(&head, 160);
    108. printf("%d\n", find->element);
    109. printf("---------------\n");
    110. print_node(&head);
    111. printf("---------------\n");
    112. del_node_byindex(&head, 9);
    113. print_node(&head);
    114. printf("---------------\n");
    115. modify_node(&head, 3, 520);
    116. print_node(&head);
    117. return 0;
    118. }

  • 相关阅读:
    C++实现排序 - 02 归并排序、快速排序和堆排序
    Pytorch——查找、替换module相关操作
    Interspeech论文介绍 | OpenASR21挑战赛THUEE队伍系统描述
    Linux部署程序
    如何区分和选择EML、DML两种激光器
    力扣面试经典150题
    在Webpack 5 中如何进行 CSS 常用配置?
    坚鹏:湖北银行数字化转型背景下银行运营管理创新培训圆满结束
    编译可执行程序的Makefile模块
    ARM 虚拟化简介
  • 原文地址:https://blog.csdn.net/weixin_56821642/article/details/132831766