/* 问题描述:A和B是两个单链表(带头结点) 其中元素递增有序,设计一个算法,将A,B归并成一个按元素值非递减有序的链表C C由A,B中的结点构成 */ #include<stdio.h> #include<malloc.h> typedef struct LNode{ int data; struct LNode* next; }LNode,*LinkList; //头插法构建单链表(输出时与创建顺序相反) void init1(LinkList &L){ //一定要给L动态开辟空间,并且让 L->next = NULL; L = (LinkList)malloc(sizeof(LinkList)); L->next = NULL; LinkList s; int x; scanf("%d",&x); while(x!=-1){ s = (LinkList)malloc(sizeof(LinkList)); s->data = x; s->next = L->next; L->next = s; scanf("%d",&x); } } //尾插法构建单链表 void init2(LinkList &L){ L = (LinkList)malloc(sizeof(LinkList)); L->next = NULL; LinkList s,r; r = L; int x; scanf("%d",&x); while(x!=-1){ s = (LinkList)malloc(sizeof(LinkList)); s->data = x; r->next = s; r = s; scanf("%d",&x); } s->next = NULL; } void merge(LinkList a,LinkList b,LinkList &c){ LinkList p = a->next; LinkList q = b->next; LinkList r; c = a; c->next = NULL; free(b); r = c; while(p!=NULL&&q!=NULL){ if(p->data<=q->data){ r->next = p; p = p->next; r = r->next; }else{ r->next = q; q = q->next; r = r->next; } } r->next = NULL; if(p!=NULL){ r->next = p; } if(q!=NULL){ r->next = q; } } //输出链表中的元素 void show(LinkList L){ LinkList p = L->next; while(p){ printf("%d ",p->data); p = p->next; } } int main(){ LinkList a,b,c; printf("请输入链表a的元素:"); init2(a); printf("\n"); printf("请输入链表b的元素:"); init2(b); printf("\n"); merge(a,b,c); show(c); return 0; }
数据结构-归并链表方法二
猜你喜欢
转载自www.cnblogs.com/nnyst/p/11121507.html
今日推荐
周排行