已知指针la和lb分别指向两个无头结点的单链表的首个节点。编写程序完成从la中删除第j个元素开始的len个元素,并将这len个元素查入到表lb中的第j个元素之前

C语言实现如下

#include <stdio.h>
typedef int Elemtype;
typedef struct Linknode
{
    Elemtype data;
    struct Linknode *next;
}Linknode,*Linklist;

//插入节点,创建链表(带有头节点)

void creatTable(Linklist *L)
{
    *L=(Linklist )malloc(sizeof(Linknode));
    (*L)->next=NULL;
    Elemtype data;
    scanf("%d",&data);
    Linknode * lnode=(Linknode *)malloc(sizeof(Linknode));
    lnode->data=data;
    lnode->next=(*L)->next;
    (*L)->next=lnode;
    while(data!=9999)
    {
        scanf("%d",&data);
        Linknode * node=(Linknode *)malloc(sizeof(Linknode));
        node->data=data;
        node->next=(*L)->next;
        (*L)->next=node;
    }
}

//创建无头结点的链表
void createNoheadTable(Linklist *head)
{
    *head = (Linklist )malloc(sizeof(Linknode));
    Elemtype data;
    scanf("%d",&data);
    (*head)->data=data;
    Linknode *tail=*head;
    while(data!=9999 && tail)
    {
        scanf("%d",&data);
        Linknode *temp=(Linknode *)malloc(sizeof(Linknode));
        temp->data=data;
        temp->next=NULL;
        tail->next=temp;
        tail=tail->next;
    }
}


void getItemNode(Linklist head,Linknode **prenode,Linknode**pnode,int index)
{
    if(head==NULL)
        return ;
    if(index<=0)
        return ;
    Linknode *lnode=head;
    Linknode *pmove=NULL;
    //printNoheadTable(lnode);
    int cnt=1;
    while(lnode&&(cnt<index))
    {
        pmove=lnode;
        lnode=lnode->next;
        cnt++;
    }

    *prenode=pmove;
    *pnode=lnode;
}

//删除la表元素,并插入lb表中,la与lb链表无头结点
void operateLinlist(int j,int len,Linklist *la,Linklist *lb)
{
    Linknode *prejnodela=NULL;
    Linknode *pjnodela=NULL;

    getItemNode(*la,&prejnodela,&pjnodela,j);

    
    //printf("%d\n",prejnodela->data);
    //printf("%d\n",pjnodela->data);

    int cnt=1;
    //Linknode *headtemp=Linklist )malloc(sizeof(Linknode));
    Linknode *insertTail=(Linklist )malloc(sizeof(Linknode));
    insertTail->next=NULL;
    Linknode *tail=insertTail;
    //headtemp->next=insertTail;
    while(pjnodela&&(cnt<=len))
    {
        Linknode *tempt = pjnodela;
        pjnodela=pjnodela->next;
        tempt->next=NULL;
        tail->next=tempt;
        tail=tail->next;
        cnt++;
    }
  
    //printNoheadTable(prejnodela);
    //插入到lb链表中
    Linknode *prejnodelb=NULL;
    Linknode *pjnodelb=NULL;
    getItemNode(*lb,&prejnodelb,&pjnodelb,j);


    tail->next=pjnodelb;
    prejnodelb->next=prejnodela->next;

    //删除la表中的元素
    prejnodela->next=pjnodela;

}
//打印无头结点链表
void printNoheadTable(Linklist head)
{
    if(head==NULL)
        return;
    Linknode *lnode=head;
    while(lnode)
    {
        printf("%d\n",lnode->data);
        lnode=lnode->next;
    }
}
//打印链表
void print(Linklist L)
{
    if(L==NULL)
    {
        return ;
    }
    Linknode *lnode=L->next;
    while(lnode)
    {
        printf("%d\n",lnode->data);
        lnode=lnode->next;
    }
}
int main()
{
    Linklist LA;
    createNoheadTable(&LA);

    Linklist LB;
    createNoheadTable(&LB);

    Linknode *prenode=NULL;
    Linknode *pnode=NULL;
    int index=3;
    getItemNode(LA,&prenode,&pnode,index);
   // printf("%d\n",prenode->data);
    //printf("%d\n",pnode->data);

    operateLinlist(index,5,&LA,&LB);
    printNoheadTable(LB);
	printNoheadTable(LA);
}

如果删除的是从头结点开始,插入也是从头结点开始则这几行代码需要改变

	tail->next=pjnodelb;
    prejnodelb->next=prejnodela->next;

    //删除la表中的元素
    prejnodela->next=pjnodela;

  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
可以按照以下步骤编写算法: 1. 用p和q分别指向LA的第i-1个元素LB的第j-1个元素; 2. 用r指向LA的第i个元素; 3. 将p的next指针指向r的后面第len个元素,即LA删除的那些元素的下一个元素; 4. 将r的指针保存到temp,然后将r的next指针指向q的后面,即r插入到LB第j个元素之前; 5. 将q的next指针指向temp,即将LA删除的那些元素插入到LB第j个元素之前。 下面是具体的实现代码: ```python def delete_and_insert(LA, LB, i, j, length): # 用p和q分别指向LA的第i-1个元素LB的第j-1个元素 p = LA for k in range(i-1): p = p.next q = LB for k in range(j-1): q = q.next # 用r指向LA的第i个元素 r = p.next # 将p的next指针指向r的后面第len个元素 for k in range(length): r = r.next p.next = r # 将r插入到LB第j个元素之前 temp = r.next r.next = q.next q.next = r # 将LA删除的那些元素插入到LB第j个元素之前 while r.next != temp: r = r.next q = q.next q.next = r q = q.next q.next = temp ``` 其,变量p和q初始化为LALB首元结点,分别通过循环找到第i-1和第j-1个元素。变量r初始化为p的下一个元素,即第i个元素。接下来,通过循环将r指向删除的那些元素的下一个元素,然后将p的next指针指向r的后面第len个元素。将r插入到LB第j个元素之前,需要用temp保存r的指针,然后将r的next指针指向q的后面,即r插入到LB第j个元素之前。最后,通过循环将LA删除的那些元素插入到LB第j个元素之前
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值