请写出在头指针为La,Lb的两个递减有序的单链表合并为一个递减有序的单链表的算法
发布网友
发布时间:2022-07-21 19:28
我来回答
共1个回答
热心网友
时间:2023-10-31 21:47
#include <stdio.h>
#include <stdlib.h>
typedef int Elemtype;
typedef struct node {
Elemtype data;
struct node *next;
}NODE,*LinkList,*pNode;
LinkList GetNewList() {
pNode head = (pNode)malloc(sizeof(NODE));
if(head == NULL) return NULL;
head->data = 0;
head->next = NULL;
return head;
}
LinkList merge(LinkList LA,LinkList LB) {
pNode a,b,c,head;
a = LA;
b = LB;
c = head = GetNewList();
head->data = LA->data + LB->data;
while(a->next && b->next) {
c->next = (pNode)malloc(sizeof(NODE));
if(c->next == NULL) {
printf("内存分配失败!\n");
return NULL;
}
if(a->next->data >= b->next->data) {
c->next->data = a->next->data;
a = a->next;
}
else {
c->next->data = b->next->data;
b = b->next;
}
c = c->next;
}
while(a->next) {
c->next = (pNode)malloc(sizeof(NODE));
if(c->next == NULL) {
printf("内存分配失败!\n");
return NULL;
}
c->next->data = a->next->data;
a = a->next;
c = c->next;
}
while(b->next) {
c->next = (pNode)malloc(sizeof(NODE));
if(c->next == NULL) {
printf("内存分配失败!\n");
return NULL;
}
c->next->data = b->next->data;
b = b->next;
c = c->next;
}
c->next = NULL;
return head;
}
LinkList Creat(LinkList head,int a[],int n) {
int i;
pNode p = head;
head->data = n;
for(i = 0; i < n; ++i) {
p->next = (pNode)malloc(sizeof(NODE));
if(p->next == NULL) {
printf("内存分配失败!\n");
return NULL;
}
p->next->data = a[i];
p = p->next;
}
p->next = NULL;
return head;
}
void Show(LinkList head) {
pNode p = head->next;
while(p) {
printf("%d ",p->data);
p = p->next;
}
printf("\n");
}
int main( ) {
Elemtypea[] = {98,89,86,80,76,69,68,54,50,29};
int m = sizeof(a)/sizeof(a[0]);
Elemtype b[] = {96,85,74,69,68,67,65,60,58};
int n = sizeof(b)/sizeof(b[0]);
LinkList LA = GetNewList();
LA = Creat(LA,a,m);
LinkList LB = GetNewList();
LB = Creat(LB,b,n);
LinkList LC;
printf("LA: ");
Show(LA);
printf("LB: ");
Show(LB);
LC = merge(LA,LB);
printf("LC: ");
Show(LC);
return 0;
}
请写出在头指针为La,Lb的两个递减有序的单链表合并为一个递减有序的单...
b = b->next; } c = c->next; } while(a->next)
...LA、LB,编写一个算法,将两个循环单链表合并为一个循环单链表_百度知 ...
编写好的算法实现将这两个链表合并为新的带有头结点的链表 lc ,使得 lc 的元素仍然是非递增有序排列的序列,如果遇到 la 与 lb 中元素相同,则只取 la 中的元素,去掉 lb 中的元素。已知 la 的元素个数 为 m , lb 的元素个数为 n。循环单链表是单链表的另一种形式,其结构特点链表中最后...
编写算法将两个递增单链表合并成一个递减的线性表
结点链入链表中,同时后移工作指针。由于结果链表是递减的,故使用头插法建立新链表。比较结束后,可能会有一个链表非空,此时用头插法将剩下的结点依次插入新链表中即可。/ void Union_List(LinkList& La,LinkList& Lb){ LNode *r, *pa = La->next, *pb = Lb->next; //pa,pb分别...
C语言 有两个单链表LA和LB,其元素均为非递减有序排列,编写一个算法。将...
*LinkList,*pNode;LinkList GetNewList() {pNode head = (pNode)malloc(sizeof(NODE));if(head == NULL) return NULL;head->data = 0;head->next = NULL;return head;
设计一个算法,将两个递增链表La、Lb合并成一个递增链表Lc。
//设计一个算法,将两个递增链表La、Lb合并成一个递增链表Lc;La,Lb,Lc均为带头结点的链表 include<stdio.h> typedef int datatype;struct PNode { datatype data; //定义链表中结点的数据域,DATATYPE为数据类型 struct PNode *next; //定义链表中结点的指针域 };typedef struct PNode ...
合并两个有序链表【递归、迭代】
将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。示例:输入:1->2->4, 1->3->4 输出:1->1->2->3->4->4 我们可以递归地定义在两个链表上进行合并(merge)操作的结果,如下所示(在不考虑空列表的情况下):也就是说,我们取两个列表...
数据结构单链表之合并两个已排序的链表
例如如果第一个链表a是5->10->15而另一个链表b是2->3->20,那么SortedMerge()应该返回一个指向合并链表2->头节点的指针3->5->10->15->20。有很多情况需要处理:a或b可能为空,在处理过程中a或b可能先用完,最后出现结果列表开始为空,构建的问题它在经历'a'和'b'时向上。方法一(使用...
单链表和循环链表操作用什么不一样?
设有两个链表La=(a1,a2,…,an)和Lb=(b1,b2,…bm),讨论如下问题:(1)La、Lb都是带头指针的单链表,如何实现将Lb接在La之后?时间复杂度是多少?解答:先从La的头结点开始把指针移动到单链表的最后一个结点,即移动了La长度的结点数目,最后把Lb接在La之后,因此时间复杂度是O(n)...
单链表的运算之建立单链表
② 具体算法实现 LinkList CreatListR(void) {//返回单链表的头指针 char ch; LinkList head;//头指针 ListNode *s *r; //工作指针 head=NULL; //链表开始为空 r=NULL;//尾指针初值为空 ch=getchar(); //读入第 个字符 while(ch!= \n ){ s=(L...
数据结构作业
void Length2(int L) { int i=0, p=nodepool[L].next; while(p) { i++; p=nodepool[p].next; } nodepool[L].data=i; } 2.8 假设有两个按元素值递增有序排列的线性表A和B,均以单链表①作存储结构,试编写算法将A表和B表归并成一个按元素值递减有序(即非递增有序,允许值相同)排列的线性表C...