选作内容:
两个线性表合并算法的实现。已知顺序表LA和LB中的数据元素按值非递减有序排列,现要将LA和LB归并为一个新的顺序表LC,且LC中的数据元素仍按值非递减有序排序。例如:LA=(3,5,8,11) LB=(2,6,9,15,20)。
实验代码:
#include<stdio.h> #include<stdlib.h> #define OK 1 #define FALSE 0 typedef int Status; typedef float ElemType; typedef struct LNode { ElemType data; struct LNode *next; } LNode,* LinkList; LinkList s,r,P; Status i; //创建单链表 尾插法 void CreatListTail(LinkList &L,Status n) { r=L=(LinkList)malloc(sizeof(LNode)); L->next=NULL; for(i=1;i<=n;++i) { s=(LinkList)malloc(sizeof(LNode)); scanf("%f",&s->data); s->next=NULL; r->next=s; r=s; } } //插入 ElemType ListInsert(LinkList &L,int i,ElemType e) { i=i+1; Status j; P=L; j=1; while(P&&j<i-1) { P=P->next; ++j; } if(!P||j>i-1) { return FALSE; } s=(LinkList)malloc(sizeof(LNode)); s->data=e; s->next=P->next; P->next=s; return OK; } //查找 ElemType GetElem(LinkList &L,Status i) { i=i+1; LinkList P; Status j; P=L; j=1; while(P&&j<i) { P=P->next; j++; } return P->data; } //打印 void print(LinkList &L) { LinkList P; P=L->next; while(P!=NULL) { printf("%.2f ",P->data); P=P->next; } printf("\n"); } //合并 void MergeLisT_L(LinkList &La,LinkList &Lb,LinkList &Lc) { LinkList pa,pb,pc; pa=La->next; pb=Lb->next; Lc=pc=La; 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() { Status n,m; LinkList La,Lb,Lc,P; printf("请输入线性表La节点个数:"); scanf("%d",&n); printf("创建单链表La(输入每个结点的数据域):"); CreatListTail(La,n); printf("请输入线性表Lb节点个数:"); scanf("%d",&m); printf("创建单链表Lb(输入每个结点的数据域):"); CreatListTail(Lb,m); MergeLisT_L(La,Lb,Lc); printf("线性表La和Lb合并得到Lc:"); print(Lc); return 0; }
控制台: