问答题 已知两个单链表A和B,其头指针分别为heada和headb,编写一个过程从单链表A中删除自第i个元素起的共len个元素,然后将单链表A插入到单链表B的第j个元素之前。【中国矿业大学2000年】
【正确答案】正确答案:算法的基本设计思想:从第一个元素起开始计数,记到第i个时开始数len个,然后将第i一1个元素的后继指针指向第i+len个结点,实现了在A链表中删除自第i个起的len个结点。再查B链表的第J个元素,将A链表插入之。算法的代码: LinkList DelInsert(LinkList heada,LinkList headb,int i,int J,int len){ if(i<1||len<1 ||J<1) { //参数错误,退出算法 printf("参数错误\n"); return NULL; } p:heada; //p为链表A的工作指针,初始化为A的头指针 //查到第i个元素时,P指向第i一1个元素 k=0; //计数 while(p!=NULL&&knext; } if(p==NULL) //i太大,退出算法 { printf(u给的%d太大\n”,i); retUrn NULL ; } q=p一>next; //q为工作指针,初始指向A链表第一个被删除结点 k=0; while(q!=NULL&&knext ; free(U); } if(k<1en) { printf(”给的%d太大\n”,len); return NULL; } p->next=q; //A链表删除了len个元素 if(heada一>next!=NULL) { //heada一>next=NULL说明链表中结点均删除,无需往B表插入 while(P一>next!=NULL) p=p->next; //找A的尾结点 q=headb; //q为链表B的工作指针 k=0; //计数 while(q!=NULL&&knext ; } if(q==NULL) { printf(”给的%d太大\n”,J); return NULL; } p->next=q->next, //将A链表链入 q一>next=heada一>next ; //A的第一元素结点链在B的第J一1个结点之后 }//if free(heada); //释放A表头结点 return headb; }//DelInsert
【答案解析】