单链表头插、尾插、求表长---C语言实现


个人主页:我的主页

小白一枚,欢迎指教👏

一、按位查找: GetElem(L,i)

  • 获取表L中的第i个位置的元素的值
  • 思想:从单链表中第一个结点出发,顺着指着next逐渐往下搜索,知道找到第i个结点为止,否则返回NULL。
//按位查找,返回第i个元素(带头结点)
LNode* GetElem(LinkList L, int i){
   if(i<0)
      return NULL;
  LNode *p; //指针p指向当前扫描到的结点
  int j=0;  //L指向头结点,头结点是第0个结点,没有数据
  p=L;
  while(p!NULL && j<i) {
    p=p->next;
    j++''
  }
  return p;
}

二、按值查找 LoocateElem(L,e):

  • 按值查找,找到数据域==e的结点
  • 思想:从单链表第一个结点开始,依次往后比较表中各结点数据域的值,若某结点数据域的值=e,则返回该结点的指针,若没有这样的结点,则返回NULL。
LNode*LocateElem(LinkList L,ElemType e){
  LNode *p=L->next; //从第1个结点开始查找数据域为e的结点 
  while(p!=NULL&&p->data!=e)
      p=p->next;
  return p;  //找到后返回该结点指针,否则返回NULL
  
}

三、求表长操作Length(L):

  • 思想:计算单链表中数据结点(不含头结点个数)的个数,从第一个结点开始,顺序依次访问表中的每个结点,要设置一个计数器变量,每访问一个结点计数器就加一,知道访问的空结点为止。
int Length(LinkList L){
  int len =0;  //统计表长
  LNode *p=L;
  while (p->next !=NULL){
    p=p->next;
    len++;
  }
  return len;
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ERAUEKRo-1651385679634)(/Users/wuxin/Library/Containers/com.tencent.qq/Data/Library/Caches/Images/5B6FECF776F244105BCF851E9A1FFB48.jpg)]

四、单链表的建立:尾插法/头插法

  • Q:如果给你很多个数据元素(ElemType),要把它们存到一个单链表里边,怎么办呢?

    step:先初始化一个单链表,每次取一个元素,插入到表尾/表头 (带头结点的情况)

// 尾插法建立单链表
LinkList List_Taillnesert(LinkList &L){ //正向建立单链表
  int x;    //设ElemType为整型
  L=(LinkList)malloc(sizeof(LNode));  //建立头结点
  LNode *s,*r=L;     //r为尾指针
  scanf("%d",&x);    //输入结点的值
  while(x!=9999){    //输入9999表示结束
     s=(LNode *)malloc(sizeof(LNode));
    s->data=x;
    r->next=s;
    r=s;             //r指向心的表尾结点
    scanf("%d",&x);
  }
    r->next=NULL;   //尾结点指针置空
  return L;     //返回头指针
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8IReVsm9-1651385679636)(/Users/wuxin/Library/Containers/com.tencent.qq/Data/Library/Caches/Images/1A018C19B5376EDCB152C2D9F1E30878.jpg)]

  • 头插法建立单链表
LinkList List_HeadInsert(LinkList &L){  //逆向建立单链表
  LNode *s;
  int x;
  L=(LinkList)malloc(sizeof(LNode)); //创建头结点
  L->next=NULL;    //初始为空链表
  scanf("%d",&x);   //输入结点的值
  while(x!=9999){       //输入9999表示结束
    s=(LNode*)malloc(sizeof(LNode));  //创建新结点
    s->data=x;
    s->next=L->next;
    L->next=s;      //将新结点插入表中,L为头指针
    scanf("%d",&x);
  }
     return L;
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-c7BCOjf8-1651385679637)(/Users/wuxin/Library/Containers/com.tencent.qq/Data/Library/Caches/Images/6CE33B4AB7EADEE5DCCBB4A584EC16A9.jpg)]

  • (注意重要的应用:单链表的逆置)按照头插法,那么数据的位置应该是这样的情况:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KO5tSbhV-1651385679637)(/Users/wuxin/Library/Containers/com.tencent.qq/Data/Library/Application Support/QQ/Users/1498040013/QQ/Temp.db/AB1F60A4-E340-4142-879F-20EEC377E941.png)]

  • TIPS:如果要求逆置一个单链表,只需要设置一个指针,按顺序扫描数据,将扫描的数据再用头插法插入即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

无心er

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值