#include<stdio.h> #include <stdlib.h> #define OK 1 #define ERROR -1 #define OVERFLOW -2 typedef int Status; typedef struct LNode { int data; struct LNode *next; } LNode, *LinkList; Status InitList(LinkList &L,int n) //逆位序输入n个值,建立带头结点的单链线性表L { int i; LNode *p, *pos, *nxt; L=(LinkList)malloc(sizeof(LNode)); L->next=NULL; for(i=n; i>=1; i--) { p=(LinkList)malloc(sizeof(LNode)); if(!p) exit(OVERFLOW); scanf("%d",&p->data); //Insert 插入到表里合适的位置,使表依然一直有序。 //从小到大 pos = L; while(true) { nxt = pos->next; //链表中当前位置的下一个 if(nxt==NULL) { //到表尾了,说明还没有找到合适的位置。则只要把要加入的元素放到表尾即可。 pos->next = p; p->next = NULL; break; } if(nxt->data > p->data) { //插入,如果下一个元素比要插入的元素大,则把要插入的元素加到nxt前面即可,即pos的后面。 p->next = pos->next; pos->next = p; break; } pos = nxt; } } return 1; } Status MergeList(LinkList &La ,LinkList &Lb ,LinkList &Lc ) { LinkList pa,pb,pc; pa = La->next; pb = Lb->next; pc = Lc = La;//用La的头结点为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); return OK; } int main() { LinkList La,Lb,Lc; LinkList p; int n2,n1; scanf("%d",&n1); InitList(La, n1); scanf("%d",&n2); InitList(Lb, n2); /* 输入数据时就可以使La,Lb表有序, 只要每次添加元素到表里合适的位置, 类似于插入排序的思想。 */ MergeList(La ,Lb ,Lc ); p=Lc->next; int c=0; while(p) { printf(c++?" %d":"%d",p->data); p=p->next; } return 0; }
链表排序
最新推荐文章于 2024-04-28 22:49:45 发布