月秋快乐 2022-03-06 12:42 采纳率: 0%
浏览 16

构造及输出两个单链表

我是想创造两个链表,然后输出来着,但是输出好像是其他的数字,链表一长就有问题了

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

#define TRUE 1            //预定义常量 
#define FALSE 0
#define OK 1
#define ERROR 0

typedef struct LNode
{
    int num;
    LNode *next;
}LNode, *LinkList;
 
int InitList(LNode *L)
{
    L=(LNode*)malloc(sizeof(LNode));
    L->next=NULL;
    return OK;
}

int ListInsert(LNode *L,int i,int e)
{
    LinkList p=L,s;int j=0;
    while(p && (j<i-1))
    {
        p=p->next;++j; 
    }
    if(!p||j>1) return ERROR;
    s=(LNode*)malloc(sizeof(LNode));
    s->num=e;
    s->next=p->next;
    p->next=s;
    return OK; 
}

int ListDelete(LNode *L,int i)
{
    LinkList p=L,q;int j=0;
    while(p && (j<i-1))
    {
        p=p->next;++j; 
    }
    if(!p->next||j>i-1) return ERROR;
    q=p->next;
    p->next=q->next;
    free(q);
}

int print(LNode *L,int length)
{
    LNode *p=L;
    int i;
    for(i=0;i<length;i++)
    {
        p=p->next;
        printf("%d ",p->num);        
    }
    printf("\n");
    return OK;
} 

int CreateLinkList(LNode *L,int length)
{
    int i,data;
    printf("输入链表中的数据:");
    for(i=0;i<length;i++)
    {
        scanf("%d",&data); 
        ListInsert(L,i+1,data);
    }
    return OK;
}

int main()
{
    int m,n,i,data;
    LNode a,b,*A=&a,*B=&b,*p;
    InitList(A);InitList(B);
    printf("输入A,B链表的长度:");
    scanf("%d %d",&m,&n);
    CreateLinkList(A,m);
    CreateLinkList(B,n);
                                            
    print(A,m);
    print(B,n);
}


![img](https://img-mid.csdnimg.cn/release/static/image/mid/ask/81707514564619.jpg "#left")


  • 写回答

1条回答 默认 最新

  • CSDN专家-link 2022-03-06 13:30
    关注

    初始化函数写法错误,这么初始化是不能修改外部A和B指针的指向的,如果用指针为参数,应该用指针的指针作为参数,或者返回值是指针,修改如下:(修改处已加注释)

    #include<stdio.h>
    #include<stdlib.h>
     
    #define TRUE 1            //预定义常量 
    #define FALSE 0
    #define OK 1
    #define ERROR 0
     
    typedef struct LNode
    {
        int num;
        LNode *next;
    }LNode, *LinkList;
     
    int InitList(LNode **L)   //将参数改为指针的指针
    {
        *L=(LNode*)malloc(sizeof(LNode));      //L改为*L
        (*L)->next=NULL;            //L改为*L
        return OK;
    }
     
    int ListInsert(LNode *L,int i,int e)
    {
        LinkList p=L,s;int j=0;
        while(p && (j<i-1))
        {
            p=p->next;++j; 
        }
        if(!p) return ERROR;    //去掉 j>1条件,只要p不为空就可以了啊
        s=(LNode*)malloc(sizeof(LNode));
        s->num=e;
        s->next=p->next;
        p->next=s;
        return OK; 
    }
     
    int ListDelete(LNode *L,int i)
    {
        LinkList p=L,q;int j=0;
        while(p && (j<i-1))
        {
            p=p->next;++j; 
        }
        if(!p->next||j>i-1) return ERROR;
        q=p->next;
        p->next=q->next;
        free(q);
    }
     
    int print(LNode *L,int length)
    {
        LNode *p=L;
        int i;
        for(i=0;i<length;i++)
        {
            p=p->next;
            printf("%d ",p->num);        
        }
        printf("\n");
        return OK;
    } 
     
    int CreateLinkList(LNode *L,int length)
    {
        int i,data;
        printf("输入链表中的数据:");
        for(i=0;i<length;i++)
        {
            scanf("%d",&data); 
            ListInsert(L,i+1,data);
        }
        return OK;
    }
     
    int main()
    {
        int m,n,i,data;
        LNode a,b,*A=&a,*B=&b,*p; 
        InitList(&A);InitList(&B);        //参数改为A和B的地址 
        printf("输入A,B链表的长度:");
        scanf("%d %d",&m,&n);
        CreateLinkList(A,m);
        CreateLinkList(B,n);
                                                
        print(A,m);
        print(B,n);
        system("pause");
        return 0;
    }
    
    
    
    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 3月6日