兔子不恰胡萝卜 2022-03-26 17:12 采纳率: 75%
浏览 1155
已结题

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

在vs2022中运行,到下面那段代码就报错了,不清楚怎么回事,希望有人可以解释一下,顺便优化一下代码,还请注释一下,毕竟你修改之后我未必能看懂。


//设有两个按元素值递增有序的单链表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, * LinkList;

void CreLinkListTail(LinkList L, int n)
{
    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;
}
int list_count(LinkList L) {
    LNode* p = L->next;
    int len = 0;
    while (p) {
        p = p->next;
        len++;
    }
    return len;
}

void list_bubble_sort(LinkList L)
{
    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);
    LinkList La = (LinkList)malloc(sizeof(LNode));
    La->next = NULL;
    CreLinkListTail(La, n);
    printf("带头结点头插法--输出建立后的La单链表:\n");
    OutPut(La->next);

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

    LinkList Lc = (LinkList)malloc(sizeof(LNode));
    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, * LinkList;
    
    void CreLinkListTail(LinkList L, int n)
    {
        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;
    }
    int list_count(LinkList L) {
        LNode* p = L->next;
        int len = 0;
        while (p) {
            p = p->next;
            len++;
        }
        return len;
    }
    
    //void list_bubble_sort(LinkList L)  修改 这个函数不需要
    //{
    //    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);
        LinkList La = (LinkList)malloc(sizeof(LNode));
        La->next = NULL;
        CreLinkListTail(La, n);
        printf("带头结点头插法--输出建立后的La单链表:\n");
        OutPut(La->next);
     
        printf("请输入Lb的结点个数:\n");
        scanf_s("%d", &m);
        LinkList Lb = (LinkList)malloc(sizeof(LNode));
        Lb->next = NULL;
        CreLinkListTail(Lb, m); //CreLinkListTail(Lb, n); 修改
        printf("带头结点头插法--输出建立后的Lb单链表:\n");
        OutPut(Lb->next);
    
        LinkList Lc = (LinkList)malloc(sizeof(LNode));
        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分析报错求解答