回 帖 发 新 帖 刷新版面

主题:关于线性表的题目

题目是:
       函数DelA_insB(LinkedList La,LinkedList Lb,int key1,int key2,int len)的功能是:将线形表A中关键码为Key1的结点开始的len个结点,按原顺序移至线形表B中关键码为Key2的结点之前,若移动成功,则返回0,否则返回-1。线形表的存储结构为带头结点的单链表,La为表A的头指针,Lb为表B的头指针。单链表结点的类型定义为:
typedef struct node {
int key;
struct node *next;
}*Linkedlist;

函数

int DelA_InsB(LinkedList La,LinkedList Lb,int key1,int key2,int len){
LinkdeList p,q,s,prep,pres;
int k;
if(!La->next || !Lb->next || len<=0) return -1;
p=La->next;prep=La;
while(p&&p->key!=key1){      /*查找表A中键值key1的结点*/
prep=p;p=p->next;
}
if(!p)return -1;         /*在表A中不存在键值为key1的结点*/
q=p;k=1;
while(q&&k<len){        /*在表A中找出待删除的len个结点*/                     
q=q->next,k++;
}
if(!q) return -1;       /*表A中不存在要被删除的len个结点*/
s=Lb->next;
while(s&&s->key!=key2){     /*查找表B中键值key2的结点*/
pres=s;s=s->next;
}
if(!s) return -1;       /*表B中不存在键值为key2的结点*/
prep->next=q->next;      /*将表A中的len个结点删除*/
q->next=s;
pres->next=p;          /*将len个结点移动至表B*/[color=FF0000](这行看不懂)[/color]
return 0;
}
那行我的理解是:那把线形表Lb的头结点的指针域指向P,这样一来,那么原来线形表Lb中关键码为key2的结点之前的结点不是全被删除了吗?而题目只要求我们插入,并没有要我们删除啊.

回复列表 (共1个回复)

沙发

prep->next=q->next;      /*将表A中的len个结点删除*/
q->next=s;
pres->next=p;          /*将len个结点移动至表B*/(这行看不懂)


举个例子好了

2 3 6 5 4 7 8 6
比如把4 7 8 6(prep->next=q->next;)这一段拿过来
      |     |
      p     q

然后要放到  
3 6 8            4 7 8 9
    |            |
   pres          s
要放到8和4之间

然后把断的两跟线连上
pres->p
q->s
就是8->4  6->4
够清楚了吧

我来回复

您尚未登录,请登录后再回复。点此登录或注册