本篇文章的代码大多使用无头结点的单链表

相关定义:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <assert.h>
  4.  
  5. typedef int DataType;
  6. typedef struct Linklist{
  7. LDataType data;
  8. struct Linklist *next;
  9. }Linklist,*pLinklist;

相关函数的定义:

  1. pLinklist BuyNewNode(LDataType data);  //创建一个数据域为data的新结点
    void InitLinklist(pLinklist *pL);  //初始化单链表
    void PushBackLinklist(pLinklist* pL,LDataType data);  //尾插
    void PushFrontLinklist(pLinklist *pL,LDataType data);  //头插
    void PopBackLinklist(pLinklist *pL);  //尾删
    void PopFrontLinklist(pLinklist *pL);  //头删
    void PrintLinklist(pLinklist pL);  //打印出链表
    pLinklist FindLinklist(Linklist *pL,LDataType data);  //找到数据域为data的第一个结点
    void InsertLinklist(pLinklist *pL,pLinklist p,LDataType data);  //指定位置插入
    void RemoveLinklist(pLinklist *pL,LDataType data);  //删除第一个数据为data的结点
    void RemoveAllLinklist(pLinklist *pL,LDataType data);  //删除数据为data的全部结点
    int IsEmpty(pLinklist pL);  //判断单链表是否为空
    void DestoryLinklist(pLinklist *pL);  //删除整个链表,释放内存

由上面可以看出,只要是涉及到头指针发生改变的,我们在函数中都是传入指向头指针的指针。就像我们在swap函数中要交换a和b的值,我们是传入地址,而现在我们要改变头指针的值,也必须要传入指向头指针的一个指针来进行相关的操作。

此处借鉴了c语言函数传递参数的问题

下面是对函数的展开,我会比较详细的分析一下函数实现:

0.动态生成新结点

  1. pLinklist BuyNewNode(LDataType data){
      pLinklist NewNode = (pLinklist)malloc(sizeof(Linklist));
      if(pLinklist == NULL){
        printf("空间开辟失败");
        return NULL;
      }
      NewNode->data = data;
      NewNode->next = NULL;
      return NewNode;
    }

1.初始化操作

  1. void InitLinklist(pLinklist *pL){
      assert(pL != NULL);
      (*pL) = NULL;
    }

2.尾插一个数据为data的结点

  1. void PushBackLinklist(pLinklist *pL,LDataType data){
      assert(pL != NULL);  //大多数中都有这个,是为了防止使用空指针,书中经常会说,千万不要使用空指针,你应该有印象
      pLinklist NewNode = BuyNewNode(data);
      if(*pL == NULL){  //判断这个是否为空链表
        *pL = NewNode;
        return ;
      }
      pLinklist cur = *pL;
      while(cur->next != NULL){  //其实这里也可以用cur != NULL,但是上面已经把把空链表大情况写出来了,如果再这样写会重复,不会错,但是复杂一点点
        cur = cur->next;
      }
      cur->next = NewNode;
    }

3.头插一个数据为data的结点

  1. void PushFrontLinklist(pLinklsit *pL,LDataType data){
      assert(pL != NULL);
      pLinklist NewNode = BuyNewNode(data);
      if(*pL == NULL){
        *pL = NewNode;
        return ;  
      }
      NewNode->next = *pL;
      *pL = NewNode;
    }

4.判断无头链表是否为空

  1. int IsEmptyLinklist(pLinklist pL){
      //这里的pL是一个指向链表的指针,而不是一个指向链表指针的指针
      return (pL == NULL);
    }

5.尾删

  1. void PopBackLinklist(pLinklist *pL){
      assert(pL != NULL);
      if(IsEmptyLinklist(*pL)){
        //*pL是一个指向链表的指针
        printf("链表为空");
        return ;
      }
      //尾删需要找到前面那一个结点
      pLinklist cur = *pL;
      pLinklist pre;
      if(cur->next == NULL){
        *pL = NULL;
        free(cur);
        cur = NULL;
        return ;
      }
      while(cur->next){
        pre = cur;
        cur = cur->next;
      }
      pre->next = NULL;
      free(cur);
      cur = NULL;
    }

6.头删

  1. void PopFrontLinklist(pLinklist *pL){
      assert(pL != NULL);
      if(*pL == NULL){
        printf("链表为空");
        return ;
      }
      pLinklist p = *pL;
      *pL = p->next;
      free(p);
      p = NULL;
    }

7.找到第一个数据为data的结点

  1. pLinklist FindLinklist(pLinklist *pL,LDataType data){
      assert(pL != NULL);
      plinklist cur = *pL;
      while(cur != NULL){
        if(cur->data == data){
          return cur;
        }
        cur = cur->next;
      }
      return NULL;
    }

8.在给出的结点之前插入一个数据为data的结点

  1. void InsertLinklist(pLinklist *pL,pLinklist p,LDataType data){
      assert(pL != NULL);
      pLinklist NewNode = BuyNewNode(data);
      pLinklist cur = *pL;
      while(cur->next != p){
        cur = cur->next;
      }
      NewNode->next = cur->next;
      cur->next = NewNode;
    }

9.删除第一个数据为data的结点

  1. void RemoveLinklist(pLinklist *pL,LDataType data){
      assert(pL != NULL);
      pLinklist cur = FindLinklist(pL,data);
      if(cur == NULL){
        printf("没找到");
        return ;
      }
      if(cur == *pL){
        //刚好在第一个结点
        *pL = cur->next;
        free(cur);
        cur = NULL;
        return ;
      }
      pLinklist p = *pL;
      while(p->next != cur){
        p = p->next;
      }
      p->next = cur->next;
      free(cur);
      cur = NULL;
    }

10.删除每一个数据都是data的结点

  1. void RemoveAllLinklist(pLinklist *pL,LDataType data){

  assert(pL != NULL); //删除每一个数据域都是data的结点
  pLinklist cur = NULL;
  pLinklist p = *pL;  //pre保存要删除结点的前一个结点
  pLinklist pre = *pL;
  while(p){
    if (p->data == data && (*pL) == p){
    //第一个结点是
    pre = p;
    p = p->next;
    *pL = p;
    free(pre);
    pre = NULL;
  }
  else if(p->data == data){
    //后续结点是
    cur = p;
    p = p->next;
    pre->next = p;
    free(cur);
    cur = NULL;
  }
  else{
    //此结点不是
    pre = p;
    p = p->next;
    }
  }

}

11.打印出链表

  1. void PrintLinklist(Linklist *pL){
  2. pLinklist cur = pL; //打印链表
  3. while(cur){
  4. printf("%d--->",cur->data);
  5. cur = cur->next;
  6. }
  7. printf("NULL\n");
  8. }

12.摧毁链表

  1. void DestoryLinklist(pLinklist *pL){
  2. assert(pL != NULL); //摧毁链表
  3. pLinklist cur = *pL;
  4. pLinklist pre = NULL;
  5. if (*pL == NULL){
  6. printf("链表为空");
  7. return ;
  8. }
  9. if (cur->next = NULL){
  10. *pL = NULL;
  11. free(cur);
  12. cur = NULL;
  13. return ;
  14. }
  15. while(cur){
  16. pre = cur;
  17. cur = cur->next;
  18. free(pre);
  19. pre = NULL;
  20. }
  21. }
  • 添加到短语集

     
    • 没有此单词集:中文(简体) -> 英语...

       
    • 创建新的单词集...
  • 拷贝

不带头结点的单链表(基于c语言)的更多相关文章

  1. java编写带头结点的单链表

    最近在牛客网上练习在线编程,希望自己坚持下去,每天都坚持下去练习,给自己一个沉淀,不多说了 我遇到了一个用java实现单链表的题目,就自己在做题中将单链表完善了一下,希望大家作为参考也熟悉一下,自己 ...

  2. C/C++中创建(带头结点、不带头结点的)单链表

    1.带头结点的单链表(推荐使用带头结点的单链表)(采用尾插法) 了解单链表中节点的构成 从上图可知,节点包含数据域和指针域,因此,在对节点进行定义时,我们可以如下简单形式地定义: /* 定义链表 */ ...

  3. 链表习题(2)-一个集合用带头结点的单链表L表示,编写算法删除其值最大的结点。

    /*一个集合用带头结点的单链表L表示,编写算法删除其值最大的结点.*/ /* 算法思想:使用pre,p,premax,max四个指针,pre和p进行比较,premax和max进行最后的删除操作 通过遍 ...

  4. 链表习题(1)-设计一个递归算法,删除不带头结点的单链表L中所有值为x的结点

    /*设计一个递归算法,删除不带头结点的单链表L中所有值为x的结点*/ /* 算法思想:设f(L,x)的功能是删除以L为首结点指针的单链表中所有值等于x的结点, 则显然有f(L->next,x)的 ...

  5. c语言实现--不带头结点的单链表操作

    1,不带头结点的单链表操作中,除了InitList(),GetElem(),ListInsert(),ListDelete()操作与带头结点的单链表有差别外,其它的操作基本上一样. 2,不带头结点单链 ...

  6. 有一个线性表,采用带头结点的单链表L来存储,设计一个算法将其逆置,且不能建立新节点,只能通过表中已有的节点的重新组合来完成。

    有一个线性表,采用带头结点的单链表L来存储,设计一个算法将其逆置,且不能建立新节点,只能通过表中已有的节点的重新组合来完成. 分析:线性表中关于逆序的问题,就是用建立链表的头插法.而本题要求不能建立新 ...

  7. 不带头结点的单链表------C语言实现

    File name:no_head_link.c Author:SimonKly Version:0.1 Date: 2017.5.20 Description:不带头节点的单链表 Funcion L ...

  8. 无头结点的单链表(C语言)

    1.单链表: 在顺序表中,用一组地址连续的存储单元来一次存放线性表的结点,因此结点的逻辑顺序与物理顺序是一致的.但链表却不同,链表是用一组任意的存储单元来存放 线性表的结点,这组存储单元可以是连续的, ...

  9. Python实现不带头结点的单链表

    1 # 创建一个节点类 2 class Node: 3 def __init__(self, item): 4 self.item = item 5 self.next = None 6 7 8 # ...

随机推荐

  1. iOS block的用法 by -- 周傅琦君

    X.1 初探Block X.1.1 宣告和使用Block 我们使用「^」运算子来宣告一个block变数,而且在block的定义最后面要加上「;」来表示一个完整的述句(也就是将整个block定义视为前面 ...

  2. 晋升挂了!leader说不是我技术不行

    大家好,我是对白. 今天给大家分享一位朋友在互联网大厂晋升失败的故事,不是每一位校招生第一年都可以稳稳晋升的,这不仅取决于你的业务收益,还取决于你是否会包装自己的项目,以下为原文. 晋升 去年秋季,我 ...

  3. logger模块和re模块总结

    很多程序都有记录日志的需求,并且日志中包含的信息即有正常的程序访问日志,还可能有错误.警告等信息输出,python的logging模块提供了标准的日志接口,你可以通过它存储各种格式的日志,loggin ...

  4. uniapp 微信发送订阅消息

    这篇主要针对小程序进行演示,既然是发送消息,那么就有三个问题.发送什么内容,给谁发送,怎么发送!往下一条一条解决. 发送什么消息内容 - 通过微信公众号平台 选择对应的消息模板 选择以后在我的模板里面 ...

  5. Spring Boot内置Tomcat

    Spring Boot默认支持Tomcat/Jetty/Undertow作为底层容器.在之前实战相关的文章中,可以看到引入spring-boot-starter-web就默认使用tomcat容器,这是 ...

  6. jenkins持续集成go应用

    上文讲到使用supervisor管理我们的终端应用,这次讲一下使用jenkins持续集成 下面分别讲一下pipeline里每一个段落的含义 agent any 使用任意节点构建 parameters ...

  7. gdb调试小技巧

    1.进入gdb,需要源码,然后gdb+可执行文件,如果要看代码一起的就gdb+可执行文件+tui 2.设置参数 set args +参数 3.设置断点,可以b +行数或者b+函数名字 4.r就是一直跑 ...

  8. [题解]hihoCoder挑战赛18——题目1 神奇字符串

    题目地址:http://hihocoder.com/problemset/problem/1264 时间限制:20000ms 单点时限:1000ms 内存限制:256MB 描述 我们说两个字符串是非常 ...

  9. Tabluea、Smartbi可视化仪表盘创建流程图分享

    你知道Tableau.Smartbi在可视化仪表盘制作步骤上有何差异吗?下面一起来了解吧~ 根据上面的流程图我们可以了解到,不同于Smartbi是在同一界面即可完成的,Tableau是由很多个工作表组 ...

  10. Dell服务器通过IDRAC9收集TSR日志排查故障

    登陆IDRAC9 WEB管理界面,在菜单栏< 维护>下选择  在联网的情况下推荐完成SupportAssist的注册,根据提示安装ISM并进行信息登记.如暂不注册,则点击取消继续. 进入S ...