zoukankan      html  css  js  c++  java
  • 16 把第 i 个结点从链表中删除

    这里先删除第2个结点,测试 deleNode 函数

     1 /*把第i个结点从链表中删除*/
     2 
     3 
     4 #include<stdio.h>
     5 #include<stdlib.h>
     6 
     7 //链表中节点的结构
     8 typedef struct Link {
     9     int  data;
    10     struct Link* next;
    11 }link;
    12 
    13 //链表初始化
    14 link* initByTailInsert() {
    15     link* phead = NULL;//创建头指针
    16     link* first_node = (link*)malloc(sizeof(link));//创建第一个节点
    17     //第一个结点先初始化
    18     first_node->data = 1;
    19     first_node->next = NULL;
    20     phead = first_node;//头指针指向第一个节点
    21 
    22     //尾插入赋值
    23     for (int i = 2; i < 5; i++) {
    24         link* new_node = (link*)malloc(sizeof(link)); //申请新的结点
    25         new_node->data = i;
    26         new_node->next = NULL;
    27         first_node->next = new_node;  //第一个结点的指针域指向这个新申请的结点
    28         first_node = new_node;  //第一个结点后移
    29     }
    30 
    31     printf("头指针指向的值是:%d
    ", phead->data);//1
    32     return phead;  //将指向第一个结点的头指针返回
    33 }
    34 
    35 
    36 
    37 void showLink(link* phead) {
    38     link* tmp = phead;//将头指针赋给tmp,tmp也是一个头指针
    39     //只要tmp指针指向的结点的next不是Null,就执行输出语句。
    40     while (tmp != NULL) {
    41         printf("%d ", tmp->data);
    42         tmp = tmp->next;
    43     }
    44     printf("
    ");
    45 }
    46 
    47 link* getElemByNum(link* phead,int num) {
    48     int j = 1; //计数器
    49     link* tmp = phead;
    50     while (tmp != NULL && num>j) {
    51         tmp = tmp->next;
    52         j++;
    53     }
    54     if (tmp == NULL || num<j) {
    55         //printf("这个元素不存在
    ");
    56         return NULL;
    57     }
    58     else {
    59         return tmp;
    60     }
    61 }
    62 
    63 
    64 void deleNode(link* phead,int num) {
    65     link* tmp = phead;
    66     link* front_node = getElemByNum(tmp,num - 1);
    67     link* back_node = getElemByNum(tmp, num + 1);
    68     link* cur_node = getElemByNum(tmp,num);
    69     front_node->next = back_node;
    70     free(cur_node);
    71     showLink(tmp);
    72 }
    73 
    74 
    75 void main() {
    76     //初始化链表(1,2,3,4)
    77     printf("初始化链表为:
    ");
    78     link* phead = initByTailInsert(); //创建头指针,得到经过初始化后的头指针
    79     showLink(phead);
    80     int num = 0;
    81     printf("请输入要删除的结点的号码:");
    82     scanf("%d", &num);
    83     link* isfind = getElemByNum(phead, num);
    84     if (isfind != NULL) {
    85         //printf("第%d个元素是:%d", num, isfind->data);
    86         printf("删除第%d个结点后的链表是:
    ", num);
    87         deleNode(phead,num);
    88     }
    89     else {
    90         printf("这个结点没找到
    ");
    91     }
    92 
    93 }

  • 相关阅读:
    微服务架构:自动扩展简介
    作为软件开发人员需要的技术技能
    NetStat
    IntegerCache缓存占用堆、栈、常量池的问题,自动拆装箱的基本概念,Integer==int时的问题说明
    Docker常用命令速查手册(华贵铂金版)
    深入剖析Windows专业版安装Docker引擎和Windows家庭版Docker引擎安装的区别
    一个有趣的现象,既然是知识产出还是有必要声明下原创最好【虾扯蛋系列】
    MySql CPU彪高到百分之1000的排查思路
    准备一个大菜
    常见的 由于未调整服务器 ulimit 而引起的内存溢出问题
  • 原文地址:https://www.cnblogs.com/shanlu0000/p/12459972.html
Copyright © 2011-2022 走看看