中国大学MOOC-陈越、何钦铭-数据结构-2017春
02-线性结构1 两个有序链表序列的合并 (15分)
https://pta.patest.cn/pta/test/3512/exam/3/question/62612
本题要求实现一个函数,将两个链表表示的递增整数序列合并为一个非递减的整数序列。
其中List
结构定义如下:
typedef struct Node *PtrToNode;
struct Node {
ElementType Data; /* 存储结点数据 */
PtrToNode Next; /* 指向下一个结点的指针 */
};
typedef PtrToNode List; /* 定义单链表类型 */
L1
和L2
是给定的带头结点的单链表,其结点存储的数据是递增有序的;函数Merge
要将L1
和L2
合并为一个非递减的整数序列。应直接使用原序列中的结点,返回归并后的链表头指针。
正确代码:
List Merge( List L1, List L2 ) { List front,p,q,rear; p=L1->Next; q=L2->Next; front=(List)malloc(sizeof(struct Node)); front->Next=NULL; rear=front; while(p&&q) { if(p->Data>q->Data) { rear->Next=q; q=q->Next; } else { rear->Next=p; p=p->Next; } rear=rear->Next; } rear->Next=p?p:q; L1->Next=NULL; L2->Next=NULL; return front; }
错误代码:
List Merge( List L1, List L2 ) { List front,p,q,temp; p=L1; q=L2->Next; front=(List)malloc(sizeof(struct Node)); front->Next=p->Next; // front=p;是错误的,输出NULL(后面有L1->Next=NULL;) while(p->Next&&q) { if(p->Next->Data>q->Data) { temp=q->Next; q->Next=p->Next; p->Next=q; q=temp; p=p->Next; } else p=p->Next; } if(q) p->Next=q; L1->Next=NULL; L2->Next=NULL; return front; }
front=p;是错误的。 //是没理解不光结构体有内存,指向结构体的指针也是有内存的,对于32位环境来说,所有指针变量类型都是4个字节。当然因此还产生了其他错误~~