美文网首页
C语言实现常用数据结构:不带头结点的单链表(第4篇)

C语言实现常用数据结构:不带头结点的单链表(第4篇)

作者: 哪有岁月静好 | 来源:发表于2020-08-14 15:04 被阅读0次

    使用示例

    带头结点的单链表请参见:

    [C语言实现常用数据结构:带头结点的单链表(第3篇)(https://www.jianshu.com/p/ffd75e7e0272)

    功能:输入数据个数和数据,逆序保存到顺序表,并逆序输出显示到屏幕。

    运行结果如下:

    请输入数据总个数:10

    请依次输入10个整数:0 1 2 3 4 5 6 7 8 9

    单链表输出结果:9 8 7 6 5 4 3 2 1 0

    单链表删除5位置数据后输出结果:9 8 7 6 4 3 2 1 0

    代码实现:不带头点的单链表

    */
    #include <stdio.h>
    #include <stdlib.h>
    // 定义单链表数据结构 
    typedef struct list_node
    {
      int data;
      struct list_node *next;
    }list_node;
    // 增加
    int insert_link_list(list_node **list, int data)
    {
      if(list == NULL)
        return -1;
      list_node *node = (list_node *)malloc(sizeof(list_node));
      // 分配内存失败 
      if(node == NULL)
        return -1;
      node->data = data;
      node->next = NULL;
      
      // 对于空表特殊处理
      if(*list == NULL)
      {
        *list = node;
      }else
      {
        // 头插法插入
        // 输出顺序和输入相反
        node->next = *list;
        *list = node;
      } 
      return 0;
    }
    // 删除指定位置 
    int delete_link_list(list_node **list, int *data, int pos)
    {
      if(list==NULL || pos < 1)
        return -1;
        
      // 空表 
      if(*list == NULL)
        return -1;
      
      list_node *p = *list;
      // 如果删除的是第一个位置元素
      if(pos == 1)
      {
        *list = (*list)->next;
        free(p);
        
      }else
      {  
        // 循环找到要删除的元素前一个位置
        int i;
        for(i=1; i < pos-1 && p != NULL; i++)
          p = p->next;
      
        // 找到该位置 
        if(i==pos-1 && p != NULL)
        {
          list_node *q = p->next;
          if(q != NULL)
          {
            *data = q->data;
            p->next = q->next;
              free(q);
          }
        }else
        {
          return -1;
        }   
      }
      return 0;  
    }
    // 查看 
    void print_link_list(list_node *list)
    {
      if(list != NULL)
      {
        list_node *p = list;
        while(p != NULL)
        {
          printf("%d ", p->data);
          p = p->next;
        }
          
        printf("\n");
      }
     } 
     
     // 销毁
    void free_link_list(list_node **list)
    {
       if(list != NULL)
       {
         list_node *p = *list;
         while(p != NULL)
         {
           *list = p->next;
          free(p); 
          
        }
         *list = NULL;
      }
    } 
    
    int main(void)
    {
      list_node *list = NULL; 
        
      int n,d;
      printf("请输入数据总个数:");
      scanf("%d", &n);
      printf("请依次输入%d个整数:", n);
      int i;
      for(i=0; i<n; i++)
      {
        scanf("%d", &d);
        // 每次插入到链表首位,这样实现倒序 
        insert_link_list(&list, d); 
      }  
      printf("单链表输出结果:");
      print_link_list(list); 
      
      printf("单链表删除%d位置数据后:",n/2);
      delete_link_list(&list, &d, n/2);
      
      print_link_list(list); 
      free_link_list(&list);
      
      return 0;
    }
    

    其实做为一个学习者,有一个学习的氛围跟一个交流圈子特别重要这里我推荐一个C/C++基础交流583650410,不管你是小白还是转行人士欢迎入驻,大家一起交流成长。



    相关文章

      网友评论

          本文标题:C语言实现常用数据结构:不带头结点的单链表(第4篇)

          本文链接:https://www.haomeiwen.com/subject/zmzbdktx.html