C语言链表的转接

发布网友 发布时间:2022-04-23 06:59

我来回答

2个回答

热心网友 时间:2022-06-17 03:50

#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
int key;
struct node *next;
}Linked,*LinkedList;
LinkedList creat(LinkedList &La)//这个函数写一次就可以了,可以两次调用的
{
LinkedList r,s;
int x;
La=(LinkedList)malloc(sizeof(Linked));
r=La;
printf("请输入数据,以0结束:\n");
scanf("%d",&x);
while(x!=0)
{
s=(LinkedList)malloc(sizeof(Linked));
s->key=x;
r->next=s;
r=s;
scanf("%d",&x);
}
r->next=NULL;
return La;
}
int Delllnsb(LinkedList La,LinkedList Lb,int key1,int key2,int len)
{
int k;
LinkedList p,q,s,pres,prep,q1;
if(!(La->next)||!(Lb->next)||len<=0)//这边用if就可以了,用不着whille不过其实用while也没有错,还有点,貌似!要放外面,优先级比较高
{
return -1;
}
p=La->next;
prep=La;
while(p && p->key!=key1) //查找key1
{
prep=p;
p=p->next;
}
if(!p)
{
return -1;
}
q=p;
q1=prep;
k=1;
while(q && k<=len) //在A中找出要删除的len个结点,要包含等于吧,顺便加入前一个结点的寻找,后面用得到
{
q1=q;
q=q->next;
k++;
}
if(!q && k<len) //A中不存在要删除的len个结点,要是刚好呢,所以加一个k< len
{
return -1;
}
s=Lb->next;
pres=Lb;
while(s && s->key!=key2) // 查找B中Key2
{
pres=s;
s=s->next;
}
if(!s) //B中不存在key2
{
return -1;
}
prep->next=q;
//q->next; ??
//pres->next; ??
/* pres->next=p; 将len个结点移至B 你这么做的话,b表中的后面一节找不到了,因为地址给你刷了
prep->next=q->next;
pres->next=p;
q->next=s;*/
q=pres->next; //记录key2的地址
pres->next=p; //将len个结点移至B
q1->next=q;//将key2及其后面的结点加回链表中
return 0;
}

int main()
{
LinkedList r,La,Lb;
int key1,key2,len,l;//把datatype改成int了,要不编译不过的
printf("请输入数据1的内容:\n");
creat(La);//这边你采用的是反回值 的形式,你不能这么写的啊,改成引用 还可以,返回值的要有量做为左值 。。。。。。楼主初学者吧
printf("请输入数据2的内容:\n");
creat(Lb);
printf("请输入单链表A的关键码key1:\n");
scanf("%d",&key1);
printf("请输入单链表B的关键码key2:\n");
scanf("%d",&key2);
printf("请输入要移动的节点数:\n");
scanf("%d",&len);
l=Delllnsb(La,Lb,key1,key2,len);
printf("%d\n",l);
r=Lb->next;
while(r)
{
printf("%3d",r->key);
r=r->next;
}
printf("\n");
return 0;
}

楼主看看吧,我调试过了,过的,我帮你改了一些格式,还有一些注解,你自己看看,还有好多的不对的,我都帮你改了,好辛苦啊,看了好久,一边要理解你的想法,哎哎,不懂再问我吧,楼主应该是初学者吧。。。。。好好加油哇

热心网友 时间:2022-06-17 03:50

#include <stdio.h>
#include <stdlib.h>
typedef int datatype;
typedef struct node
{
datatype key;
struct node *next;
}Linked,*LinkedList;
LinkedList creat(LinkedList *La)
{
LinkedList r,s;
datatype x;
*La=(LinkedList)malloc(sizeof(Linked));
r=*La;
printf("请输入数据,以0结束:\n");
scanf("%d",&x);
while(x!=0)
{
s=(LinkedList)malloc(sizeof(Linked));
s->key=x;
r->next=s;
r=s;
printf("请输入数据,以0结束:\n");
scanf("%d",&x);
}
r->next=NULL;
return *La;
}
datatype Delllnsb(LinkedList La,LinkedList Lb,int key1,int key2,int len)
{
int k;
LinkedList p,q,s,prep,pres;
while((!La->next)||(!Lb->next)||len<=0)
{
return -1;
}
p=La->next;
prep=La;
while(p&&p->key!=key1) //查找key1
{
prep=p;
p=p->next;
}
if(!p)
{
return -1;
}
q=p;
k=1;
while(q&&k<len) //在A中找出要删除的len个结点
{
q=q->next;
k++;
}
if(!q) //A中不存在要删除的len个结点
{
return -1;
}
s=Lb->next;
pres=Lb;
while(s&&s->key!=key2) // 查找B中Key2
{
pres=s;
s=s->next;
}
if(!s) //B中不存在key2
{
return -1;
}
prep->next=q;
q->next;
q->next;
pres->next;
pres->next=p; //将len个结点移至B
prep->next=q->next;
pres->next=p;
q->next=s;
return 0;
}
int main()
{
LinkedList r,La,Lb;
datatype key1,key2,len,l;
printf("请输入数据1的内容:\n");
creat(&La);
printf("请输入数据2的内容:\n");
creat(&Lb);
printf("请输入单链表A的关键码key1:\n");
scanf("%d",&key1);
printf("请输入单链表B的关键码key2:\n");
scanf("%d",&key2);
printf("请输入要移动的节点数:\n");
scanf("%d",&len);
l=Delllnsb(La,Lb,key1,key2,len);
printf("%d",l);
r=Lb->next;
while(r)
{
printf("%8d",r->key);
r=r->next;
}
return 0;
}

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com