# 两个按元素值递增有序的单链表A和B,编一程序将单链表A和B归并成一个新的递增有序的单链表C

``````
//设有两个按元素值递增有序的单链表A和B(单链表A和B)，
//编一程序将单链表A和B归并成一个新的递增有序的单链表C
//(值相同的元素均保留在单链表C中)。
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>

typedef int ElemType;
typedef struct node
{
ElemType data;
struct node* next;

{
LNode* s, * r;
ElemType x;
int i;
r = L;
printf("输入结点:\n");
for (i = n; i > 0; i--)
{
scanf_s("%d", &x);
s = (LNode*)malloc(sizeof(LNode));
s->next = NULL;
s->data = x;
r->next = s;
r = s;
}
}

void OutPut(LNode* L)
{
LNode* p;
p = L;
while (p != NULL)
{
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}

LNode* guibing(LNode* La, LNode* Lb)
{
LNode* pc = (LNode*)malloc(sizeof(LNode));
LNode* p, * linshit = pc;

p = La->next;
while (p != NULL)
{
LNode* r = (LNode*)malloc(sizeof(LNode));
r->data = p->data;
p = p->next;
linshit->next = r;
linshit = r;
}

linshit = pc;
p = Lb->next;
while (linshit->next != NULL)
{
linshit = linshit->next;
}

while (p != NULL)
{
LNode* s = (LNode*)malloc(sizeof(LNode));
s->data = p->data;
p = p->next;
linshit->next = s;
linshit = s;
}
return pc;
}
LNode* p = L->next;
int len = 0;
while (p) {
p = p->next;
len++;
}
return len;
}

{
LNode* p, * q;
int len = list_count(L);

for (int i = 0; i < len; i++)
{
p = L;
for (int j = 0; j < len - i - 1; j++)
{
if (!p->next) break;
if (!p->next->next) break;
if (p->next->data > p->next->next->data)
{
q = p->next;
p->next = q->next;
q->next = q->next->next;
p->next->next = q;
}
p = p->next;
}
}
}

void main()
{
int n, m;
printf("请输入La的结点个数:\n");
scanf_s("%d", &n);
La->next = NULL;
printf("带头结点头插法--输出建立后的La单链表:\n");
OutPut(La->next);

printf("请输入Lb的结点个数:\n");
scanf_s("%d", &m);
Lb->next = NULL;
printf("带头结点头插法--输出建立后的Lb单链表:\n");
OutPut(Lb->next);

Lc->next = NULL;

printf("输出归并后的Lc单链表:\n");
Lc = guibing(La, Lb);
list_bubble_sort(Lc);
OutPut(Lc);
}
``````
``````//在vs2022中运行，到这里就报错了
while (linshit->next != NULL)
{
linshit = linshit->next;
}

//引发了异常: 读取访问权限冲突。
//**linshit** 是 0xFFFFFFFFFFFFFFF7。
``````
• 写回答

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

• qzjhjxj 2022-03-26 18:06
关注

修改处见注释，供参考：

``````//设有两个按元素值递增有序的单链表A和B(单链表A和B)，
//编一程序将单链表A和B归并成一个新的递增有序的单链表C
//(值相同的元素均保留在单链表C中)。
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>

typedef int ElemType;
typedef struct node
{
ElemType data;
struct node* next;

{
LNode* s, * r;
ElemType x;
int i;
r = L;
printf("输入结点:\n");
for (i = n; i > 0; i--)
{
scanf_s("%d", &x);
s = (LNode*)malloc(sizeof(LNode));
s->next = NULL;
s->data = x;
r->next = s;
r = s;
}
}

void OutPut(LNode* L)
{
LNode* p;
p = L;
while (p != NULL)
{
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}

LNode* guibing(LNode* La, LNode* Lb)
{
LNode* pc = (LNode*)malloc(sizeof(LNode));
LNode* p, *q, * linshit = pc; //修改

p = La->next; q = Lb->next;   //修改
while (p != NULL && q != NULL)//修改
{
LNode* r = (LNode*)malloc(sizeof(LNode));//Lc 的新结点
r->next =NULL;           //修改
if (p->data <= q->data){
r->data = p->data;
p = p->next;
}
else{
r->data = q->data;
q = q->next;
}
linshit->next = r;  //将新结点链入 Lc
linshit = r;
//r->data = p->data;  修改
//p = p->next;
//linshit->next = r;
//linshit = r;
}
if (p){
while(p){
LNode* r = (LNode*)malloc(sizeof(LNode));
r->next =NULL;
r->data = p->data;
linshit->next = r;
linshit = r;
p = p->next;
}
}
else{
while(q){
LNode* r = (LNode*)malloc(sizeof(LNode));
r->next =NULL;
r->data = q->data;
linshit->next = r;
linshit = r;
q = q->next;
}
}
//linshit = pc;        修改
//p = Lb->next;
//while (linshit->next != NULL)
//{
//    linshit = linshit->next;
//}
//
//while (p != NULL)
//{
//    LNode* s = (LNode*)malloc(sizeof(LNode));
//    s->data = p->data;
//    p = p->next;
//    linshit->next = s;
//    linshit = s;
//}
return pc;
}
LNode* p = L->next;
int len = 0;
while (p) {
p = p->next;
len++;
}
return len;
}

//{
//    LNode* p, * q;
//    int len = list_count(L);

//    for (int i = 0; i < len; i++)
//    {
//        p = L;
//        for (int j = 0; j < len - i - 1; j++)
//        {
//            if (!p->next) break;
//            if (!p->next->next) break;
//            if (p->next->data > p->next->next->data)
//            {
//                q = p->next;
//                p->next = q->next;
//                q->next = q->next->next;
//                p->next->next = q;
//            }
//            p = p->next;
//        }
//    }
//}

void main()
{
int n, m;
printf("请输入La的结点个数:\n");
scanf_s("%d", &n);
La->next = NULL;
printf("带头结点头插法--输出建立后的La单链表:\n");
OutPut(La->next);

printf("请输入Lb的结点个数:\n");
scanf_s("%d", &m);
Lb->next = NULL;
printf("带头结点头插法--输出建立后的Lb单链表:\n");
OutPut(Lb->next);

Lc->next = NULL;

printf("输出归并后的Lc单链表:\n");
Lc = guibing(La, Lb);
//list_bubble_sort(Lc);   修改
OutPut(Lc->next);  //OutPut(Lc); 修改

}

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

• 系统已结题 4月15日
• 已采纳回答 4月7日
• 创建了问题 3月26日

#### 悬赏问题

• ¥15 阿拉蕾的可能性人看胜利项目
• ¥20 cesm的气溶胶排放文件
• ¥30 关于#wpf# devexpress的问题：选中时是黑色未选中是白色字体，想要更改未选中时字体的颜色(语言-c#)
• ¥15 逐月累计，月份不连续，补齐月份
• ¥15 应用简单的Python代码完成一个学生成绩管理系统
• ¥15 用matlab求微分方程初值问题
• ¥15 vscode下编写第三方库opencv与pcl代码时没有代码提示
• ¥15 能够跑通不报错，如何解决？(标签-matlab)
• ¥15 MOS在RDS较大，频率高时开关波形异常
• ¥15 SCENIC分析报错求解答