题目14:归并链表,递减排列。两链表递增排列,要求利用原来节点存放归并后的单链表
void merge_ByDesc(Node *&a, Node *&b, Node *&n){
//新链表递减排列,故可以采用头插法-假设均带头节点
Node *p=a->next, *q=b->next, *r, *m;
r=n=a;
r->next = NULL;
free(b);
while(p!=NULL and q!=NULL){
if(p->num<q->num){
m = p->next;
p->next = r->next;
r->next = p;
p = m;
}else{
m = q->next;
q->next = r->next;
r->next = q;
q = m;
}
}
while(p!=NULL){
m = p->next;
p->next = r->next;
r->next = p;
p = m;
}
while(q!=NULL){
m = q->next;
q->next = r->next;
r->next = q;
q = m;
}
}
主函数:
主函数中,不需要定义具体的头节点,有指针指向就可以了,void merge_ByDesc(Node *&a, Node *&b, Node *&n)函数中传入的是该指针的地址,故而可以修改其内容。
题目15:两链表,值相等的元素产生新链表,其中两链表递增有序
void find_SameNode(Node *a, Node *b, Node *&n){
Node *p=n=(Node*)malloc(sizeof(Node)), *q;
p->next = NULL;
a = a->next;
b = b->next;
while(a!=NULL){ //这里的写法错误
if(a->num<b->num){
a = a->next;
}else if(a->num>b->num){
b = b->next;
}else{
q=(Node*)malloc(sizeof(Node));
q->num = a->num;
q->next = p->next;
p->next = q;
p = q;
a = a->next;
b = b->next;
}
}
}
错误的原因:如果数据是:a={100,200,300} b={1,2,3}那么循环就会一直执行,所以这里的逻辑错误。应该是:while(a!=NULL and b!=NULL){}
题目16:链表AB,求交集,其中两链表递增有序,结果放入A中
交集的结果存放在a中:
小技巧:算法不宜直接使用一个指向a的指针,直接和b中的每个元素去判断,然后去删除不满足条件元素。而是采用定义一个新的逻辑的指针r为(虚拟第三个)新链表的头节点,然后去完成删除、加链操作。这样代码逻辑简单,不宜出错。编程的关键是理清代码的逻辑,然后表达。
void find_SameNode(Node *&a, Node *b){
Node *p, *q, *r;
r = a;
p = a->next;
r->next = NULL;
b = b->next;
while(b!=NULL and p!=NULL){
if(p->num<b->num){
q = p;
p = p->next;
free(q);
}else if(p->num>b->num){
b = b->next;
}else{
q = p;
p = p->next;
q->next = r->next;
r->next = q;
r = q;
b = b->next;
}
}
while(p!=NULL){
q = p;
p = p->next;
free(q);
}
r->next = NULL;
}
作者:无涯明月
志:将懒惰归结于迷茫,将不思进取归结为安于现状;是可悲还是可笑,亦或是可怕。
发文时间:2018-10-21