c语言数据结构之线性表链式存储

不同于数组存储,链表存储有以下特点: 

//不要求逻辑上相邻的元素物理上也相邻

//插入,删除不需要移动数据元素,只需改变改变链

以下是代码,代码里有详细注释哦

#include <stdio.h>

//不要求逻辑上相邻的元素物理上也相邻
//插入,删除不需要移动数据元素,只需改变改变链

typedef struct LNode* list;
struct LNode
{
    int Data;//以int类的数据为例
    list Next;//指针
};


//1.求表长
int Length(list ptrl)
{
    list p=ptrl;/*p指向链表第一个结点*/
    int j=0;//记录长度
    while(p)
    {
        p=p->Next;
        j++;
    }
    return j;
}

//2.查找
//2.1按序号查找
list FindKth(int k,list ptrl)//k是第几个的意思,不是下标
{
    list p=ptrl;
    int i=1;
    while(p!=NULL&&i<k)//循环结束说明两个条件有一个被破坏了
    {
        p=p->Next;
        i++;
    }

    if(i==k) return p;//找到第k个了
    else return NULL;
}

//2.2按值查找
list Find(int X,list ptrl)//X是要找的值,最后返回指向它的指针
{
    list p=ptrl;
    while(p!=NULL&&p->Data!=X)
    {
        p=p->Next;
    }
    return p;//若是返回的p是NULL,说明没找着
}

//3.插入

list Insert(int X,int i,list ptrl)//X是插入的值,i是位置(第几个)
{
    list p,s;
    if(i==1)//则新结点插入在表头
    {
      s=(list)malloc(sizeof(struct LNode));/*申请,填装结点*/
      s->Data=X;
      s->Next=ptrl;
      return s;
    }

    p=FindKth(i-1,ptrl);//如果不是在表头插入,先查找第i-1个结点存不存在
    if(p==NULL){
        printf("参数i错误,不存在i-1这个位置");
        return NULL;
    }else{
        s=(list)malloc(sizeof(struct LNode));/*申请结点*/
        s->Data=X;
        s->Next=p->Next;/*新结点插入在第i-1个结点的后面*/
        p->Next=s;
        return ptrl;
    }
}

//4.删除结点
list Delete(int i,list ptrl)
{
    list p,s;
    if(i==1)//若要删除第一个结点
    {
      s=ptrl;
      if(ptrl!=NULL) ptrl=ptrl->Next;
      else return NULL;
      free(s);
      return ptrl;
    }


    p=FindKth(i-1,ptrl);
    if(p==NULL)
    {
        printf("第%d个结点不存在",i-1);
        return NULL;
    }else if(p->Next==NULL)
    {
        printf("第%d个结点不存在",i);
        return NULL;
    }else{
        s=p->Next;//s就是要删除的结点
        p->Next=s->Next;
        free(s);//删除该结点
        return ptrl;
    }
}



int main()
{
    struct LNode L;
    list ptrl;
}


加油哦!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

76博ding

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

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

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

打赏作者

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

抵扣说明:

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

余额充值