一、要求
设指针la和lb分别指向两个无头结点单链表中的首元结点,试设计从表la中删除自第i个元素起共len个元素,并将它们插入到表lb的第j个元素之后的算法。
二、代码
#include<stdio.h>
#include<stdlib.h>
typedef struct LNode{
int data;
struct LNode *next;
}LNode,*LinkList;
//*********链表初始化**********//
void InitLinkList(LinkList &L){
L = (LinkList)malloc(sizeof(LNode));
if(!L)
return ;
L = NULL; //无头结点
}
//**********链表的建立(首元结点单独输入)**********//
void CreateLinkList_Tail(LinkList &L,int n){
int i;
LinkList pre,p;
printf("请输入首元结点的数据值:");
L = (LinkList)malloc(sizeof(LNode));
scanf("%d",&L->data); //首元结点的值
pre = L;
printf("请输入剩余%d个结点的数据值:\n",n-1);
for(i=0;i<n-1;i++){
p = (LinkList)malloc(sizeof(LNode));
scanf("%d",&p->data);
pre->next = p; //尾插法建立链表
pre = p;
}
pre->next = NULL;
}
//*********链表遍历显示***********//
void show(LinkList L){
LinkList p;
p = L;
while(p){
printf("%5d",p->data);
p = p->next;
}
printf("\n");
}
//********求取链表长度**********//
int ListLength(LinkList L){
int count;
LinkList p;
count = 0;
p = L;
while(p){
count++;
p = p->next;
}
return count;
}
//******从链表La中删除自第i个元素起共len个元素,并将删除元素赋到空链表Lc中*****//
void ListDelete(LinkList &La,LinkList &Lc,int i,int len)
{
int j,k;
k=j=0;
LinkList p,s,l;
p = La;
while(p->next && j<i-2){ //查找第i-1个结点,因无头结点,故j<i-2
j++;
p = p->next;
}
if(!p->next || j>i-1) //i值非法
return ;
s = p; //用s记住删除前的p位置
Lc = p->next; //将所要删除的元素添加到链表Lc中,此处为第一个
l = Lc;
while(k<len-1){
p= p->next; //Lc共添加len个元素,此处有len-1个
l= l->next;
k++;
}
s->next = l->next; //执行删除操作后,将链表La与所删除元素的后面连接起来
l->next = NULL; //Lc添加删除元素完毕后,将Lc最后一个结点的指针域置空
printf("所要删除的链表元素有:\n");
show(Lc);
}
//*******Lc插入到表lb的第i个元素之后*********//
void ListInsert(LinkList &Lb,LinkList &Lc,int i,int len){
int j;
LinkList p,m;
j = 0;
p = Lb;
while(p && j<i-1){ //查找第i-1个结点,因无头结点,故j<i-2
j++;
p = p->next;
}
if(!p || j>i)
return ;
m = p->next; //记录Lb第i个元素之后的结点位置
p->next = Lc; //Lb第i个元素之前的元素之后连接Lc
while(Lc->next)
Lc = Lc->next;
Lc->next = m; //Lc再连接之前断开的Lb剩余元素
show(Lb);
}
int main(){
int m,n,k;
LinkList La,Lb,Lc;
InitLinkList(La);
InitLinkList(Lb);
InitLinkList(Lc);
CreateLinkList_Tail(La,10); //建立含10个元素的链表La
CreateLinkList_Tail(Lb,10); //建立含10个元素的链表Lb
printf("链表La为:\n");
show(La);
printf("链表Lb为:\n");
show(Lb);
printf("请输入从La的第几个元素起开始删除:\n");
scanf("%d",&m);
printf("请输入共删除几个元素:\n");
scanf("%d",&n);
if(n>ListLength(La)-m){ //len值非法
printf("所需删除链表的长度len有错误,请重新输入!\n");
return 0;
}
else{
ListDelete(La,Lc,m,n); //删除操作
printf("链表La删除元素后为:\n");
show(La);
printf("请输入从Lb的第几个元素之后插入:\n");
scanf("%d",&k);
printf("将删除的La链表元素插入到Lb中后,Lb为:\n");
ListInsert(Lb,Lc,k,n); //插入操作
return 0;
}
}
三、结果
Direction:
代码仅代表本人初识数据结构时思路。