数据结构——链表

头插法建立单链表

LinkList Creat_LinkList1()  //头插法建立单链表
{  Linklist H=(Linklist)malloc(sizeof(LNode));
   H->next=NULL;
   LNode *s;
   int x;
   scanf("%d",&x);
   while(x!=-1)
    {    s=(LinkList)malloc(sizeof(LNode));
         s->data=x;
         s-next=H->next; // s和H指向同一个节点;
         H->next=s;  //H指向s,s在H后面;
         scanf("%d");
    }
    return 0;
}

尾插法建立单链表

LinkList creat_Linklist2)
{
    Linklist H=(Linklist)malloc(sizeof(LNode));//生成头节点
    H->next=NULL;//空表
    LNone * s,* r=H;
    int x;
    scanf("%d",&x);
    while(x!=-1)
    {
        s=(LinkList)malloc(sizeof(LNone));
        s->data=x;
        r->next=s;
        r=s;       //r指向新的尾结点
        scanf("%d",&x);
    }
    r->next=NULL;
    return H;
}

求单链表的表长

int Length_LinkList(LinkList H)
{    LNode * p=H;   //p指向头节点
    int j=0;
    while(p->next!=NULL)
    {    p=p->next;
         j++;
    }
return j;
}

单链表中按序号查找

LinkList Get_LinkList(LinkList H,int k)
{
    LNode * p=H;
    int j=0;
    while(p->next!=NULL && j<k)
    {
     p=p->next;
     j++;
}
if(j==k) return p ;
else return NULL:
}

单链表中按值查找

LNode * Locate(LinkList H,DataType x)
{    LNode *p=H->next;
     while(p!=NULL && p->data!=x)
       p=p->next;
     return p;

}

单链表的插入

int Insert_LinkList(LinkList H,int i,DataType x)
{    LNode * p, * s;
     p=Get_LinkList(H,i-1);  //查找第i-1个结点
     if(p==NULL)    //节点不村子,不能插入
     {
        printf("插入位置i错");
        return ERROR;
     }
     else
     {    s=(LinkList)malloc(sizeof(LNode));//申请新结点
          s->data=x;
          s->next=p->next;//新结点插入第i-1个结点后
          p->next=s;
          return TRUE;
     }
}

单链表的删除

int Del_LinkList(LinkList H,int i)
{    LinkList p,q;
     p=Get_LinkList(H,i-1);
     if(p==NULL)
     {    printf("第i-1个结点不存在");return ERROR;}
     else { if(p->next==NULL)
            { printf("第i个结点不存在");return EARROR;}
     else
     {
        q=p->next;
        p->next=q->next;
        free(q);
        return TRUE;
     }
}

单链表的逆置

void Reveres(LinkList H)
{
    LNode * p,* q;
    p=H->next;
    H->next=NULL;
    while(1)
    {
        q=p;
        p=p->next;
        q->next=H->next;
        H->next=q;
    }

}

 单链表中重复删除重复结点

void pur_LinkList(LinkList H)
{
    LNode * p, * q, * r;
    p=H->next;
    if(p!=NULL)
      while(p->next)
      {
        q=p;
        while(q->next)
        {
            if(q->next->data=p->data)
            {
              r=q->next;
              r->next=q->next;
              free(r):

            }
            else q=q->next;
            

        }
            p=p->next;
          
      }
    
}

两个集合的差集

void Difference(LinkList LA,LinkList LB)
{    Node * pre, * p, * r;
     pre=LA;
     p=LA->next;
     while(p!=NULL)
    {
        q=LB->next;
        while(q!=NULL&&q->data!=p->data)
            q=q->next;
        if(q!=NULL)
      {    r=p;
        pre->next=P->next;
        p=p->next;
        free(r);

      } 
    else
        {
        pre=p;
        p=p->next;
        }
    } 

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值