多单链表删除操作遇到问题
题目描述:本关任务:已知A、B和C为3个递增有序的线性表,现要求对A表做如下操作,删除那些既在B中出现,也在C中出现的元素。以带表头结点的单链表作为线性表的物理结构,编写实现上述操作的算法。
函数原型:voidTriLinkList(LinkListA,LinkListB,LinkListC);
我的代码:
void TriLinkList(LinkList A, LinkList B, LinkList C) {
LinkList p1 ,p2,p3 ,prior = A;
int sign = 0;
for(p1 = A->next;p1!=NULL ;){
for(p2 = B->next ;p2 != NULL ;p2= p2->next){
if(p2->data==p1->data){//查找B中是否有该元素
for(p3 = C->next ; p3!=NULL ;p3 =p3->next){//查找C中是否有该元素
if(p3->data==p1->data){
prior->next = p1->next;//删除节点操作
free(p1);
p1=prior -> next;
sign = 1;//表示已删除一个节点
break;
}
}
}
if(sign==1){
sign = 0;
break;
}
}
if (sign == 0) {
prior=prior -> next;//查找下一个节点
p1=prior -> next;
}
}
}
测试出现错误的数据:
输入:
1113252729303642500
39101113 30 42 0
3679 111342 500
预期输出:
25 27 29 30 36 50
实际输出:
13 25 27 29 30 36 50
实在不知道是哪里的问题,求指点!感谢! 本帖最后由 jhq999 于 2023-3-8 22:54 编辑
/*1113252729303642500
39101113 30 42 0
3679 111342 500*/
void TriLinkList(LinkList A, LinkList B, LinkList C) {
LinkList p1 ,p2,p3 ,prior = A;
int sign = 0;
for(p1 = A->next;p1!=NULL ;){/////////////////////////p1->data=11
for(p2 = B->next ;p2 != NULL ;p2= p2->next){
if(p2->data==p1->data){//查找B中是否有该元素
for(p3 = C->next ; p3!=NULL ;p3 =p3->next){//查找C中是否有该元素
if(p3->data==p1->data){
prior->next = p1->next;//删除节点操作////////// prior->next->data=13
free(p1);
p1=prior -> next;///////////////p1->data=13
sign = 1;//表示已删除一个节点/////////
break;
}
}
}
if(sign==1){
sign = 0;//////////
break;
}
}
if (sign == 0) {
prior=prior -> next;//查找下一个节点////////prior->data=13
p1=prior -> next;///////p1->data=25。这里跳过了13
}
}
}
void TriLinkList(LinkList A, LinkList B, LinkList C) {
LinkList p1 ,p2,p3 ,prior = A;
int sign = 0;
for(p1 = A->next;p1!=NULL ;){
for(p2 = B->next ;p2 != NULL ;p2= p2->next){
if(p2->data==p1->data){//查找B中是否有该元素
for(p3 = C->next ; p3!=NULL ;p3 =p3->next){//查找C中是否有该元素
if(p3->data==p1->data){
prior->next = p1->next;//删除节点操作
free(p1);
p1=prior -> next;
sign = 1;//表示已删除一个节点
break;
}
}
}
if(sign==1){
//////// sign = 0;///////////////////////这里删除
break;
}
}
if (sign == 0) {
prior=prior -> next;//查找下一个节点
p1=prior -> next;
}
}
}
本帖最后由 jhq999 于 2023-3-9 10:02 编辑
void TriLinkList(LinkList A, LinkList B, LinkList C) {
LinkList p1 ,p2,p3 ,prior = A,b,c;
int sign = 0;
for(p1 = A->next,b = B->next,c = C->next;p1!=NULL ;){
for(p2=b ;p2 != NULL ;p2= p2->next){//////////////////
if(p2->data==p1->data){//查找B中是否有该元素
for( p3=c; p3!=NULL ;p3 =p3->next){//查找C中是否有该元素////////////////
if(p3->data==p1->data){
prior->next = p1->next;//删除节点操作
free(p1);
p1=prior -> next;
sign = 1;//表示已删除一个节点
b=p2;/////////////
c=p3;////////////因为顺序表的原因表B表C不用从开头搜索,例如13搜索完成后,3个表在13的位置前面没有比13大的了所以没有必要收前面
break;
}
}
}
if(sign==1){
break;
}
}
if (sign == 0) {
prior=prior -> next;//查找下一个节点
p1=prior -> next;
}
}
}
页:
[1]