链表 总结

单向链表

建立节点

typedef struct  node 
{
   ElemType data;
   struct  node *next;
}node ;
typedef node * LinkList;

读取链表的值

Status getElem(LinkList L,int i,ElemType *e )//读取链表
{
    int j;
    LinkList p;
    p=L->next;//跳过头节点
    j=1;
    while(p&&j<i)//找到的i个位置的节点
    {
        p=p->next;
        ++j;
    }
    if(!p||j>i)//i的位置不符合要求
    return ERROR;
    *e=p->data;//找到节点的值
    return OK;


}

插入节点

Status linkinsert(LinkList L,int i,ElemType e)//节点的插入
{
    int j;
    LinkList p,s;
    p=L->next;
    j=1;
    while(p&&j<i)//找到插入的位置
    {
        p=p->next;
        j++;

    }
    if(!p||j>i)//位置不符合要求
    return ERROR;
    s=(LinkList)malloc(sizeof (node));//创建节点
    s->data=e;//给节点赋值
    s->next=p->next;//插入节点
    p->next=s;
    return OK;
}

节点的删除,注意从p->next开始

Status linkdelte(LinkList L,int i,ElemType *e)//删除节点
{
    int j;
    LinkList p,q;
    p=L->next;
    while(p->next&&j<i)
    {
        p=p->next;
        j++;
    }
    if(!(p->next)||j>i)//元素不存在
    return ERROR;
   q=p->next;
   p->next=q->next;
   *e=q->data;
   free(q);//释放内存
    
}

头尾插法建立单向链表

Status linkinsertwei(LinkList L,int a[],int n)//尾插法
{
    LinkList s,t;
    L=(LinkList)malloc(sizeof(LinkList));//创建空间
    L->next=NULL;
    t=L;
    for(int i=0;i<n;i++)
    {
       s=(LinkList)malloc(sizeof(LinkList)); //为新加入的元素开辟空间
       s->data=a[i]; 
       s->next=t;
       t=s;
    }
  

}
Status linkinserttou(LinkList L,int a[],int n)//头插法建立单向链表
{
    LinkList s;//插入节点
    
    L=(LinkList)malloc(sizeof(LinkList));//创建空间
    L->next=NULL;
    for(int i=0;i<n;i++)
    {
       s=(LinkList)malloc(sizeof(LinkList)); //为新加入的元素开辟空间
       s->data=a[i];
       s->next=NULL;
       L->next=s;//加入链表
     
    }
}

双向链表的头尾插法

Status llinktou(linkList L,int a[],int n)//双向链表头插法
{
    linkList s;
    L=(linkList)malloc(sizeof(LinkList));//开辟空间
    L->next=L->pre=NULL;
    for(int i=0;i<n;i++)
    {
        s=(linkList)malloc(sizeof(LinkList));//为元素开辟空间
        s->data=a[i];
        s->next=L->next;
        if(L->next!=NULL)//链表不为空时
        {
            L->next->pre=s;//链表的前驱指向新节点
        }
        L->next=s;//L刷新位置
        s->pre=L;//新节点指向头节点
    }

Status llinkwei(linkList L, int a[],int n)//双向链表尾插法
{
    linkList s,t;
    L=(linkList)malloc(sizeof(LinkList));//开辟空间
    L->next=L->pre=NULL;
    t=L;
    for(int i=0;i<n;i++)
    {
      s=(linkList)malloc(sizeof(LinkList));//开辟空间
      s->data=a[i];
      t->next=s;//尾指针指向新节点
      s->pre=t;//新节点的前驱指向链表的尾指针
      t=s;//尾指针移到下一个节点
    }
    t->next=L->next;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值