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;