这段代码到底哪里错了啊,为什么输出为空啊?

题目为:实现两个有序表合并后仍然有序的功能
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef int Status;
typedef int ElemType;

struct LNode
{
    ElemType data;
    struct LNode *next;
};
typedef struct LNode*LinkList;

LinkList Create_Link()/*创建链表的函数,返回的是头指针*/
{
    char ch;
    struct LNode *head=NULL,*p1,*p2;
    while(1)
    {
        p1=(struct LNode*)malloc(sizeof(struct LNode));
        p1->next=NULL;
        scanf("%d%c",&p1->data,&ch);
        if(head==NULL)
        {
            head=p1;
            p2=p1;
        }
        else
        {
            p2->next=p1;
            p2=p1;
        }
        if(ch=='\n')
            break;
    }
    return (head);
}

Status ListLength(LinkList L)/*计算链表长度的函数*/
{
    int length=0;
    struct LNode *p1;
    p1=L;
    while(p1!=NULL)
    {
        length++;
        p1=p1->next;
    }
    return length;
}

Status GetElem(LinkList L,int i,ElemType*e)/*该函数取第i个元素赋给e,e用于后续比较*/
{
    int j=1;
    LinkList p=L;
    while(p&&j<i)/*while(p!=NULL&&j<i),找到第i个数据*/
    {
        p=p->next;
        j++;
    }
    if(!p||j>i)/*if(p=NULL||j>i),如果已经退出了循环,说明在循环中没有找到数据*/
        return ERROR;
    *e=p->data;
    return OK;
}

void ListInsert(LinkList **L,int j,ElemType e)/*在链表中插入数据*/
{
    int i=0;
    struct LNode *p1,*p2,*p;
    p1=**L;
    p2=**L;
    p=(struct LNode*)malloc(sizeof(struct LNode));
    p->next=NULL;
    p->data=e;
    if(j==ListLength(**L)+1)
    {
        while(p1!=NULL)
        {
            p2=p1;
            p1=p1->next;
        }
        p2->next=p;
    }
    else
    {
        if(j-1==0)
        {
            p->next=p1;
            **L=p;
        }
        else
        {
            while(i<j)
            {
                p2=p1;
                p1=p1->next;
            }
            p->next=p1;
            p2->next=p;
        }
    }
}

Status ListEmpty(LinkList L)/*判断是否为空表*/
{
    if(L->next)
        return FALSE;
    else
        return TRUE;
}

void MergeList (LinkList La,LinkList Lb,LinkList *Lc)
{
    int i=1,j=1,k=0;
    int La_len,Lb_len;
    int a,b;
    La_len=ListLength(La);
    Lb_len=ListLength(Lb);
    while(i<=La_len&&j<=Lb_len)
    {
        GetElem(La,i,&a);
        GetElem(Lb,j,&b);
        if(a<=b)
        {
            ListInsert(&Lc,++k,a);
            ++i;
        }
        else
        {
            ListInsert(&Lc,++k,b);
            ++j;
        }
    }
    while(i<=La_len)
    {
        GetElem(La,i++,&a);
        ListInsert(&Lc,++k,a);
    }
    while(j<=Lb_len)
    {
        GetElem(Lb,j++,&b);
        ListInsert(&Lc,++k,b);
    }
}

int main()
{
    struct LNode *p1;
    LinkList La,Lb,Lc;
    La=Create_Link();
    Lb=Create_Link();
    if(!ListEmpty(La)&&!ListEmpty(Lb))
    {
        MergeList(La,Lb,&Lc);
    }
    p1=La;
    while(p1!=NULL)
    {
        printf("%d ",p1->data);
        p1=p1->next;
    }
    return 0;
} 

参考GPT和自己的思路:该代码中的问题在于,在主函数中打印链表La的元素时,没有将指针p1指向链表Lc,而是仍然指向了链表La,因此输出为空。解决方法是将指针p1指向链表Lc。修改后的代码如下:

int main()
{
    struct LNode *p1;
    LinkList La,Lb,Lc;
    La=Create_Link();
    Lb=Create_Link();
    if(!ListEmpty(La)&&!ListEmpty(Lb))
    {
        MergeList(La,Lb,&Lc);
    }
    p1=Lc; // 将指针p1指向链表Lc
    while(p1!=NULL)
    {
        printf("%d ",p1->data);
        p1=p1->next;
    }
    return 0;
}

链式顺序表合并,void MergeList (LinkList La,LinkList Lb,LinkList *Lc) 函数写的不对,以下是有序链表(非递减)序列合并的代码,供参考:

#include <stdio.h>
#include <stdlib.h>
typedef int ElementType;
typedef struct Node* PtrToNode;
struct Node {         //定义结点
    ElementType data;//结点数据域
    PtrToNode   Next;//结点指针域
};
typedef PtrToNode List;
 
void creatList(List* L)
{
    ElementType x;
    PtrToNode pt = NULL, pL = NULL ;
    while (1){
        scanf("%d", &x);
        if (x == -1)  break;        // 输入 -1 时,结束链表输入。
        pt = (List)malloc(sizeof(struct Node));
        pt->Next = NULL;
        pt->data = x;
        if (!(*L))
            (*L) = pt;
        else
            pL->Next = pt;
        pL = pt;
    }
}
void MergeList_L(List* L1, List* L2, List* L3)
{
    List  p1 = (*L1),  p2 = (*L2), p3 = (*L3);
    while (p1 && p2) {
        if (p1->data<= p2->data)
        {
            if (!(*L3))
                (*L3) = p1;
            else
                p3->Next = p1;
            p3 = p1;
            p1 = p1->Next;
        }
        else
        {
            if (!(*L3))
                (*L3) = p2;
            else
                p3->Next = p2;
            p3 = p2;
            p2 = p2->Next;
        }
    }
    if (!(*L3))
        (*L3) = p1 ? p1 : p2;
    else
        p3->Next = p1 ? p1 : p2;
    (*L1) = NULL;
    (*L2) = NULL;
}
 
void PrintList(List L)
{
    if (!L)
        printf("NULL");
    else{
        List p = L;
        while (p)
        {
            printf(p == L ? "%d" : " %d", p->data);
            p = p->Next;
        }
    }
}
int main()
{
    List La = NULL, Lb = NULL, Lc = NULL;
    creatList(&La);
    creatList(&Lb);
    MergeList_L(&La, &Lb, &Lc);
    PrintList(Lc);
 
    return 0;
}
 

运行如:

img

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/730826
  • 这篇博客你也可以参考下:可编程电源输出过冲怎么办?解决方案在这里
  • 除此之外, 这篇博客: 硬件的噪声从哪里来?中的 如何衡量器件内噪声? 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    1、电阻噪声
    电阻的噪声主要由三部分组成: 热噪声Thermal noise、接触噪声Contact noise、散粒噪声shot noise。

    • 热噪声
      在高于绝对0°(-273℃或Ok)的任何温度下,物质中的电子都在持续地热运动。由于其运动方向是随机的,任何短时电流都不相关,因此没有可检测到的电流。但是连续的随机运动序列可以导致Johnson噪声或热噪声。电阻热噪声的幅度和其阻值有下列关系;
      V2n=4KbTBR(以V2/Hz为单位) V^2{_n}=4{K_b}TBR (以V^2/Hz为单位)V2n=4KbTBR(V2/Hz)
      式中,
      Vn是噪声电压,以V为单位;Kb是玻尔兹曼常数,1.38×10(-23)J/K;T是温度,以K为单位;
      R是电阻,以Ω为单位;B是带宽,以Hz为单位。

    上面的公式显示噪声的大小与电阻值的平方根成正比。因此用两个半值电阻计算的结果和用1个电阻的计算结果相同。通常,任何相连的被动元件的噪声等同于总阻值产生的噪声。减小此类噪声的方法是:减少电阻的阻值。这也是输入部分不用大电阻的原因。

    • 接触噪声

    • 接触噪声与电阻的材料和尺寸有关。

    • shot噪声

    Shot噪音与电流有关系,越多的直流电流流经电阻,噪音越大。为了减少这个噪音,应该尽量减少直流电流。

    噪声模型
    为了便于计算,可以将电阻R看作一个噪声电压源和一个理想无噪声电阻串联,或者看做一个噪声电流源和一个理想无噪声电阻并联。
    在这里插入图片描述当实际电路中包含多个电阻时,每个电阻都将引入一个噪声源。若有多个电阻并联,总噪声电流等于各个点到所产生的噪声电流的均方值相加;若有多个电阻串联,总噪声电压等于各个电阻所产生的噪声电压的均方值相加。
    在这里插入图片描述
    重要公式
    在这里插入图片描述
    在这里插入图片描述
    2、晶体管噪声
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    3.运算放大器噪声

    在这里插入图片描述
    在这里插入图片描述
    如图40,噪声密度曲线由两部分噪声源相加构成,低频段的1/f噪声,高频段的白噪声。

    PSPICE仿真见文档。挖个坑,以后再仔细分析。

  • 您还可以看一下 传智老师的多角度带你编写更规范的黑盒测试用例课程中的 等价类设计测试用例的步骤小节, 巩固相关知识点

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^