问答题
【说明】本程序将两个从小到大的有序链表合成一个新的从小到大的有序链表。链表的每一项由类Node描述,而链表由类List描述。类List的成员函数有以下几个。
①createList():创建从小到大的有序链表。
②multiplyList(List L1,List L2):将链表L1和链表L2合并。
③print();打印链表。
# include <iostream.h>
class List;
class Node {
friend class List;
public:
Node(int data)
{{{U}} (1) {{/U}}; }
private:
int data;
Node *next;
};
class List {
public:
List( ) {list = NULL;}
void multiplyList(List L1, List L2);
void createList( );
void print( );
private:
Node *list;
};
void List::createList( )
{ Node *p, *u, *pm;
int data;
list = NULL;
while (1)
{ cout<<"输入链表的一项: (小于零,结束链表)"<<end1;
cin >> data;
if(data<0)break; //小于零,结束输入
p = list;
while (p != NULL && data > p->data) //查找插入点
{ pre = p;
p = p->next;
}
u={{U}} (2) {{/U}}:
if(p==list)
list = u;
else
pre->next = u;
{{U}}(3) {{/U}}:
}
void List::multiplyList (List L1, List L2)
{ Node *pL1, *pL2, *pL, *u;
list = NULL;
pL1 = L1.list;
pL2 = L2.1ist;
while (pL1 != NULL && pL2!= NULL)
{
if (pL1->data < pL2->data)
{ u = new Node (pL1->data);
pL1 = pL1 ->next;
}
else
{ u = new Node (pL2->data));
pL2 = pL2->next;
}
if (list==NULL)
list={{U}} (4) {{/U}};
else
{ pL->next = u;
pL =u;
}
}
pL1 = (pL1 != NULL) ? pL1:pL2;
while (pL1 != NULL)
{ u ={{U}} (5) {{/U}};
pL1 = pL1->next;
if (list==NULL)
list=pL=u;
else
{ pL->next = u;
pL = u;
}
}
}
void List::print( )
{ Node *p;
p = list;
while (p != NULL)
{ cout << p->data << "/t";
p = p->next;
}
cout << end1;
}
void main ( )
{ List L1, L2, L;
cout << "创建第一个链表/n"; L1.createList ( );
cout << "创建第二个链表/n"; L2.createList ( );
L1.print ( ); L2.print ( );
L.multiplyList (L1, L2);
L.print ( );
}
【正确答案】
【答案解析】[解析]
(1)this->data=data,next=NULL
Node构造函数给成员data和next赋初值。
(2)new Node(data)
动态构造一个Node对象,赋初值为data。
(3)u->next=p
将p结点作为u的下一个结点,连在链表中。
(4)pL=u
若list为空,也就是新表为空,则让新表头指针pL指向u。
(5)new Node(pL1->data)
若pL1 !=NULL,则用表中结点的值pL1->data作为初值生成一个新的Node对象。