typedef struct LNode{ int data; struct LNode *next; }LNode,*LinkList;
// 前插法创建链表
void createList_H(LinkList &L,int n) { L = (LinkList)malloc(sizeof(LNode)); L->next = NULL; for(int i = 1; i <= n; i++) { // 让p作为L(头结点)指向的第一个结点, 实现前插 LinkList p = (LinkList)malloc(sizeof(LNode)); // 创建一个p结点 scanf("%d",&p->data); // 为结点赋值 p->next = L->next; // p指向L->next(尾部) L->next = p; // L(头结点)指向p } }
// 后插法创建链表
void createList_T(LinkList &L,int n) { L = (LinkList)malloc(sizeof(LNode)); L->next = NULL; LinkList r = L; for(int i = 1; i <= n; i++) { LinkList p = (LinkList)malloc(sizeof(LNode)); scanf("%d",&p->data); p->next = NULL; // p指向空,这样就可以作为尾结点 r->next = p; // 尾结点指向p r = p; // 插入后的p作为尾结点 } }
// 合并有序链表
void MergeLinkList(LinkList &LA,LinkList &LB,LinkList &LC) { LinkList pa = LA->next; LinkList pb = LB->next; LC = LA; LinkList pc = LC; // 当有一个链表到空时结束 /* LA,LB两条链表所指向的第一个结点的值作比较,哪个更小,哪个就作为LC的下一个结点 ,当一条链表的第一个结点作为LC的新结点时,它则指向下一个它的下一个结点 */ while(pa && pb) { if(pa->data <= pb->data) { pc->next = pa; pc = pa; pa = pa->next; } else { pc->next = pb; pc = pb; pb = pb->next; } } pc->next = pa?pa:pb; free(LB); }
// 测试
int main() { LinkList LA; LinkList LB; LinkList LC; createList_T(LA,4); LinkList qa = LA->next; while(qa) { printf("%d ",qa->data); qa = qa->next; } createList_T(LB,7); MergeLinkList(LA,LB,LC); LinkList p = LC->next; while(p) { printf("%d ",p->data); p = p->next; } return 0; }