愿你 发表于 2018-4-18 19:29:11

我的unionlist哪里错了?为什么执行不出来??

# include<stdio.h>
# include<stdlib.h>
typedef struct Node{
        int data;
        struct Node* next;
}Node,*linklist;

void initlist(linklist *L)
{
        (*L)=(linklist)malloc(sizeof(Node));
        if(!(*L))
        {
                printf("对不起,初始化失败。\n");
        }
        else
        {
                (*L)->next=NULL;
                printf("初始化成功。\n");
        }
}

void creatlist(linklist L) //尾插法建立单链表
{
        int num,i;
        linklist r,q;
        r=L;
        printf("请问你想要建立几个元素的单链表:\n");
        scanf("%d",&num);
        for(i=0;i<num;i++)
        {
                q=(linklist)malloc(sizeof(Node));
                if(!q)
                {
                        printf("对不起,存储空间分配失败。\n");
                }
                else
                {
                        printf("请输入第%d个元素:",i+1);
                        scanf("%d",&q->data);
                        q->next=NULL;
                        r->next=q;
                        r=q;
                }
        }
        printf("单链表创建完毕。\n");
}

void printlist(linklist L)
{
        linklist p;
        p=L->next;
        while(p!=NULL)
        {
                printf("%d ",p->data);
                p=p->next;
        }
        printf("单链表打印完毕。\n");
}

linklist unionlist(linklist L1,linklist L2,linklist L3)
{
        linklist p1,p2,p3;
        L3=L1;
        p1=L1->next;
        p2=L2->next;
       
        while(p1&&p2)
        {
                if(p1->data<=p2->data)
                {
                        p3->next=p1;
                        p3=p1;
                        p1=p1->next;
                }
                else
                {
                        p3->next=p2;
                        p3=p2;
                        p2=p2->next;
                }
        }
        p3->next=p1?p1:p2;
        free(L2);
        return L3;
}



int main()
{
        linklist L1,L2,L3;
        printf("请创建第一个链表:");
        initlist(&L1);
        creatlist(L1);        printlist(L1);
        printf("请创建第二个链表:");
        initlist(&L2);
        creatlist(L2);        printlist(L2);
        printf("合并两个链表:");
        unionlist(L1,L2,L3);
        printlist(L3);
        return 0;
}@人造人

人造人 发表于 2018-4-18 19:41:20

有些警告是有意义的

愿你 发表于 2018-4-18 21:12:42

人造人 发表于 2018-4-18 19:41
有些警告是有意义的

可是我L3已经定义了它的类型啊,我只需要让它在unionlist中指向L1就好了啊,这样不通吗?

溯影 发表于 2018-4-20 08:57:19

楼上说的有道理,定义了类型还要进行空间的分配哇,要初始化,
楼主要理解指向结点的指针和结点的区别,结点要分配空间的,
你在main函数里定义了L3,要分配给L3链表的空间,也就是要初始化一下
还有你的unionlist函数有返回值,在main函数里就是L3 = unionlist(L1,L2,L3);
还有unionlist里的p3指针要进行初始化,否则就是野指针,
具体见程序注释,我调试过,应该没有错,楼主也可以实验一下
# include<stdio.h>
# include<stdlib.h>
typedef struct Node{
        int data;
        struct Node* next;
}Node, *linklist;

void initlist(linklist *L)
{
        (*L) = (linklist)malloc(sizeof(Node));
        if (!(*L))
        {
                printf("对不起,初始化失败。\n");
        }
        else
        {
                (*L)->next = NULL;
                printf("初始化成功。\n");
        }
}

void creatlist(linklist L) //尾插法建立单链表
{
        int num, i;
        linklist r, q;
        r = L;
        printf("请问你想要建立几个元素的单链表:\n");
        scanf("%d", &num);
        for (i = 0; i<num; i++)
        {
                q = (linklist)malloc(sizeof(Node));
                if (!q)
                {
                        printf("对不起,存储空间分配失败。\n");
                }
                else
                {
                        printf("请输入第%d个元素:", i + 1);
                        scanf("%d", &q->data);
                        q->next = NULL;
                        r->next = q;
                        r = q;
                }
        }
        printf("单链表创建完毕。\n");
}

void printlist(linklist L)
{
        linklist p;
        p = L->next;
        while (p != NULL)
        {
                printf("%d ", p->data);
                p = p->next;
        }
        printf("单链表打印完毕。\n");
}

linklist unionlist(linklist L1, linklist L2, linklist L3)
{
        linklist p1, p2, p3;
        p3 = L3 = L1;//p3这里的指针要初始化,要不就是野指针
        p1 = L1->next;
        p2 = L2->next;

        while (p1&&p2)
        {
                if (p1->data <= p2->data)
                {
                        p3->next = p1;
                        p3 = p1;
                        p1 = p1->next;
                }
                else
                {
                        p3->next = p2;
                        p3 = p2;
                        p2 = p2->next;
                }
        }
        p3->next = p1 ? p1 : p2;
        free(L2);
        return L3;
}



int main()
{
        linklist L1, L2, L3;
        printf("请创建第一个链表:");
        initlist(&L1);
        creatlist(L1);      printlist(L1);
        printf("请创建第二个链表:");
        initlist(&L2);
        creatlist(L2);      printlist(L2);
        initlist(&L3);//这句要写上,因为楼上说的有道理的,这里要新建一个链表,分配空间,初始化
        printf("合并两个链表:");
        L3 = unionlist(L1, L2, L3);//这里记得要有返回值。。。
        printlist(L3);
        return 0;
}

愿你 发表于 2018-4-20 23:18:41

溯影 发表于 2018-4-20 08:57
楼上说的有道理,定义了类型还要进行空间的分配哇,要初始化,
楼主要理解指向结点的指针和结点的区别,结 ...

哇谢谢你!!!!!我明天参考你的程序调试看看~
谢谢!!!!!{:10_298:}

愿你 发表于 2018-4-23 10:31:45

溯影 发表于 2018-4-20 08:57
楼上说的有道理,定义了类型还要进行空间的分配哇,要初始化,
楼主要理解指向结点的指针和结点的区别,结 ...

我按照你给我的提示然后我自己也运行出来啦~{:10_298:}
但是我就是有点不太明白“initlist(&L3);//这句要写上,因为楼上说的有道理的,这里要新建一个链表,分配空间,初始化” 这句语句

我如果理解:我只是要定义一个和L1指向同一个结点的头指针,L1这个头结点已经初始化了,我只是再定义一个类型和它一样的头指针而已,为什么还要再将L3初始化??

溯影 发表于 2018-4-23 11:59:40

因为你函数写的是一个返回一个结点型的指针,在函数里面又是写了一个L3的结构体,这个结构体是要存储结点的,当然要分配空间啦,但是你看你的那个unionlist的函数里一开始声明的那个结点型指针p1,p2,这个就不用分配空间,因为他只是起到指向的作用,并不充当结点

溯影 发表于 2018-4-23 12:00:28

愿你 发表于 2018-4-23 10:31
我按照你给我的提示然后我自己也运行出来啦~
但是我就是有点不太明白“initlist(&L3);//这句 ...

因为你函数写的是一个返回一个结点型的指针,在函数里面又是写了一个L3的结构体,这个结构体是要存储结点的,当然要分配空间啦,但是你看你的那个unionlist的函数里一开始声明的那个结点型指针p1,p2,这个就不用分配空间,因为他只是起到指向的作用,并不充当结点

愿你 发表于 2018-4-23 16:16:21

溯影 发表于 2018-4-23 12:00
因为你函数写的是一个返回一个结点型的指针,在函数里面又是写了一个L3的结构体,这个结构体是要存储结点 ...

那我不能理解成L3也只是一个我索引到L1吗{:7_112:}{:10_277:}
页: [1]
查看完整版本: 我的unionlist哪里错了?为什么执行不出来??