链表的查找,增删和合并(C语言)

1.链表的定义
typedef struct LNode{
ElemType data; //数据域
struct LNode *next; //指针域
}LNode,*LinkList; // LinkList为指向结构体LNode的指针类型
2.链表的查找
在带头结点的单链表L中获取第i个元素的值赋给e,i的取值范围[1,n]
//算法:用一个计数器j记录,用while循环实现链表的遍历

void LL_GetAt(LinkList L, int i, ElemType &e)
{
int j=1;
LNode *p;
p=L->next;
while(p!=NULL&&j<i)
{
p=p->next;
j++;
}
e=p->data;
}

在带头结点的单链表L中查找第一个值为e的元素,找到则将该元素在链表中的位置赋给i,并返回该结点指针,否则i赋值为0并返回空指针
//算法:与上题相同

LNode *LL_FindValue(LinkList L, ElemType e,int &i)
{
LNode *p;
int j=1;
p=L->next;
while(p!=NULL&&P->data!=e)
{p=p->next;
j++;
}
if(p!=NULL)
{i=j;
return p;}
else{
i=0;
return NULL;}
}

3.链表的增删(两个节点)
在带头结点的单链表L中第i个位置插入值为e的新元素,i的取值范围[1,n+1]
//算法:先查找后插入s->data=e;s->next=p->next;p->next=s;

void LL_DelAt(LinkList L,int i)
{
LNode *p,*s;
    int j=1;
    p=L;
    while(p!=NULL&&j<i)
    {
       p=p->next;
       j++;
    }//定位
    if(p!=NULL){
        s=(LNode *)malloc(sizeof(LNode)); 
        s->data=e;
        s->next=p->next;
        p->next=s;
        }
}

在带头结点的单链表L中,删除第i个元素,i的取值范围[1,n]
//算法:先查找后删除s=p->next;x=s->data;p->next=s->next;free(s);

void LL_DelAt(LinkList L,int i)
{
LNode *p,*s;
    int j=1;
 p=L;
    ElemType x;
    while(p!=NULL&&j<i)
    {
        p=p->next;
        j++;
    }
    if(p!=NULL)
    {   s=p->next;
        x=s->data;
        p->next=s->next;
        free(s);
    }
}

删除第一个值为e的数据元素
//算法:先查找后删除p->next=s->next

void LL_DelValue(LinkList L, ElemType e)
{LNode *p,*s;
    
    ElemType x;
    p=L;s=p->next;
    
while(s!=NULL&&s->data!=e)
{   p=s;
    s=s->next;
    
}
  
if(s!=NULL)
{
    p->next=s->next;
}
}

4.链表的合并
已知单链表LA和LB的元素按值非递减排列,归并LA和LB得到新的单链表LC,LC的元素也按值非递减排列
//算法:三个结点指针,相当于构建链表

void MergeList_L(LinkList LA,LinkList LB,LinkList &LC)
{LNode *p,*r,*t;
    LC=(LinkList)malloc(sizeof(LinkList));
    LC->next=NULL;
    t=LC;
    
    p=LA->next;r=LB->next;
    
    while(p!=NULL&&r!=NULL)
    {
        if(p->data<r->data)
        {
            t->next=p;
            t=t->next;
            p=p->next;
        }
        else{
           t->next=r;
           t=t->next;
           r=r->next; 
        }
    }
        
    if(p!=NULL){t->next=p;}
    if(r!=NULL){t->next=r;}
    
    
}
  • 9
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

尾迹双冒号

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

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

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

打赏作者

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

抵扣说明:

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

余额充值