whitevil 2021-09-20 22:54 采纳率: 100%

# 关于新链表创建的具体问题

List Merge( List L1, List L2 );

typedef struct Node PtrToNode;
struct Node {
ElementType Data; /

PtrToNode Next; /

};
typedef PtrToNode List; /

L1和L2是给定的带头结点的单链表，其结点存储的数据是递增有序的；函数Merge要将L1和L2合并为一个非递减的整数序列。应直接使用原序列中的结点，返回归并后的带头结点的链表头指针。

``````#include <stdio.h>
#include <stdlib.h>

typedef int ElementType;
typedef struct Node *PtrToNode;
struct Node {
ElementType Data;
PtrToNode   Next;
};
typedef PtrToNode List;

void Print( List L ); /* 细节在此不表；空链表将输出NULL */

List Merge( List L1, List L2 );

int main()
{
List L1, L2, L;
L = Merge(L1, L2);
Print(L);
Print(L1);
Print(L2);
return 0;
}
``````

``````int cmpfunc (const void * a, const void * b)
{
return ( *(int*)a - *(int*)b );
}

List Merge( List L1, List L2 )
{
List p,q,s,L;

L=(List)malloc(sizeof(List));
int i=0,num=1;
int a[10000];

//临时变量yyds
p=L1,q=L2;
s=L;

while(p->Next!=NULL)
{
a[i++]=p->Data;
p=p->Next;
num++;
}

p->Next=q;

while(q->Next!=NULL)
{
a[i++]=q->Data;
q=q->Next;
num++;
}

qsort(a,num,sizeof(int),cmpfunc);

for(i=0;i<num;i++)
{
L->Data=a[i];
//      L->Next=(List)malloc(sizeof(List));
L=L->Next;
}

L1->Next=NULL;
L2->Next=NULL;

return s;
}

``````

• 写回答

#### 3条回答默认 最新

• qzjhjxj 2021-09-22 15:13
关注

题目里给出的条件是：L1和L2是给定的带头结点的单链表，List Merge( List L1, List L2 ); 函数里的操作要注意，修改如下，供参考：

``````#include <stdio.h>
#include <stdlib.h>
#include <time.h>
typedef int ElementType;
typedef struct Node* PtrToNode;
struct Node {
ElementType Data;
PtrToNode   Next;
};
typedef PtrToNode List;
void Print(List L); /* 细节在此不表；空链表将输出NULL */
List Merge(List L1, List L2);
int main()
{
List L1 = nullptr, L2 = nullptr, L;
srand((unsigned int)time(NULL));
L = Merge(L1, L2);
Print(L);
Print(L1);
Print(L2);
return 0;
}

{
List p, q, tmp;
int i, n;
p = q = (List)malloc(sizeof(struct Node));
p->Next = NULL;
printf("请输入链表的长度:");
scanf("%d", &n);
for (i = 0; i < n; i++)
{
tmp = (List)malloc(sizeof(struct Node));
tmp->Next = NULL;
tmp->Data = rand() % 100 + 1;

p->Next = tmp;
p = tmp;
}
return q;
}

void Print(List L)
{
List p = L->Next;
while (p)
{
printf("%d ", p->Data);
p = p->Next;
}
printf("\n");
}

int cmpfunc(const void* a, const void* b)
{
return (*(int*)a - *(int*)b);
}

List Merge(List L1, List L2)
{
List p, q, s, L;
//L = (List)malloc(sizeof(List));
int i = 0, num = 0;
int a[10000] = {0};
//临时变量yyds
p = L1->Next, q = L2->Next;
//s = L;
while (p != NULL)   //while (p->Next != NULL)
{
a[i++] = p->Data;
p = p->Next;
num++;
}
//p->Next = q;
while (q != NULL)  //while (q->Next != NULL)
{
a[i++] = q->Data;
q = q->Next;
num++;
}
qsort(a, num, sizeof(int), cmpfunc);

s = L = (List)malloc(sizeof(struct Node));
L->Next = NULL;
for (i = 0; i < num; i++)
{
L->Next=(List)malloc(sizeof(struct Node));//L->Next=(List)malloc(sizeof(List));
L->Next->Data = a[i];
L->Next->Next = NULL;
L = L->Next;
}
//L1->Next = NULL;
//L2->Next = NULL;
return s;
}

``````
本回答被题主选为最佳回答 , 对您是否有帮助呢?
评论

• 系统已结题 9月30日
• 已采纳回答 9月22日
• 创建了问题 9月20日

#### 悬赏问题

• ¥15 ecplise在连接数据库时显示加载驱动成功但是数据库连接失败
• ¥15 visionmaster启动失败，提示为“机器不满足授权而被禁用”
• ¥50 用logisim设计16位单时钟周期cpu
• ¥15 IDEA中圈复杂度如何具体设置
• ¥50 labview采集不了数据
• ¥15 Multisim红外倒车雷达仿真中距离问题
• ¥15 请上面代码做什么处理或什么混淆
• ¥15 英雄联盟自定义房间置顶
• ¥15 W5500网线插上无反应
• ¥15 如何用字典的Key，显示在WPF的xaml中