在创建链表的方法里输出正常,但是调用Print方法输出链表异常。 请问哪里写错了呢?


创建一个静态链表并输出,在创建链表的CreateLianBiao方法里输出正常,但是出了该方法后,调用Print方法输出链表异常。 请问高人,我哪里写错了呢?

三个文件: main.c, c2.h, c2.c 完整代码如下:

一.文件:main.c

#include <stdio.h>
#include "stdlib.h"
#include "string.h"
#include "c2.h"

int main()
{
   struct LinkList *head1;

   //创建静态链表正常
   head1 = CreateLianBiao();
   //打印异常
   Print(head1);

   return 0;
}

二.文件:c2.h

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

struct LinkList * CreateLianBiao(void);
void Print(struct LinkList * head);

三.文件:c2.c

#include <stdio.h>
#include "stdlib.h"
#include "string.h"
#include "c2.h"

struct LinkList * CreateLianBiao(void)
{
    int i=0;
    struct LinkList list0,list1,list2,list3,list4,list5, *head, *p;

    list0.data = 0;
    list0.next = &list1;

    list1.data = 1;
    list1.next = &list2;

    list2.data = 2;
    list2.next = &list3;

    list3.data = 3;
    list3.next = &list4;

    list4.data = 4;
    list4.next = &list5;

    list5.data = 5;
                list5.next = NULL;

    head = &list0;

                //在这里打印正常
    p=head;
    do
                {
       printf("%d ",p->data);    
        i=i+1;
        p = p->next;
                }
               while (p!=NULL);

    return head;
}

void Print(struct LinkList * head)
{
    int i=0;
    struct LinkList *p;
    p = head;
    if (head!=NULL)
    {
        do
        {
             printf("%d ",p->data);
             i=i+1;
             p=p->next;
        }
        while (p!=NULL);
    }
    printf("\n\nlength is %d \n\n",i);    
}

点断点看哪里空指针。

没有发生空指针问题。

把局部变量改成全局变量,就可以实现题主的想法,供参考:

//二.文件:c2.h
#include <stdio.h>
#include "stdlib.h"
#include "string.h"
struct LinkList {
    int    data;
    struct LinkList* next;
};
struct LinkList* CreateLianBiao(void);
void   Print(struct LinkList* head);


//一.文件:main.c
//#include <stdio.h>
//#include "stdlib.h"
//#include "string.h"
//#include "c2.h"

 //把这些变量设置为全局变量,就可以实现题主的想法
struct LinkList list0, list1, list2, list3, list4, list5;

int main()
{
    struct LinkList* head1;
    //创建静态链表正常
    head1 = CreateLianBiao();
    //打印异常
    Print(head1);
   
    return 0;
}


//三.文件:c2.c
//#include <stdio.h>
//#include "stdlib.h"
//#include "string.h"
//#include "c2.h"
struct LinkList* CreateLianBiao(void)
{
    int i = 0;
    struct LinkList * head=NULL, * p;

    list0.data = 0;
    list0.next = &list1;
    list1.data = 1;
    list1.next = &list2;
    list2.data = 2;
    list2.next = &list3;
    list3.data = 3;
    list3.next = &list4;
    list4.data = 4;
    list4.next = &list5;
    list5.data = 5;
    list5.next = NULL;
    head = &list0;
    //在这里打印正常
    p = head;
    do
    {
        printf("%d ", p->data);
        i = i + 1;
        p = p->next;
    } while (p != NULL);
    return head;
}
void Print(struct LinkList* head)
{
    int i = 0;
    struct LinkList* p;
    p = head;
    if (head != NULL)
    {
        do
        {
            printf("%d ", p->data);
            i = i + 1;
            p = p->next;
        } while (p != NULL);
    }
    printf("\n\nlength is %d \n\n", i);
}

供参考:

//二.文件:c2.h
#include <stdio.h>
#include "stdlib.h"
#include "string.h"

struct LinkList {
    int    data;
    struct LinkList* next;
};

struct LinkList* CreateLianBiao(void);
void   Print(struct LinkList* head);
    //一.文件:main.c
//#include <stdio.h>
//#include "stdlib.h"
//#include "string.h"
//#include "c2.h"
int main()
{
    struct LinkList* head1;
    //创建静态链表正常
    head1 = CreateLianBiao();
    //打印异常
    Print(head1);
    return 0;
}

//三.文件:c2.c
//#include <stdio.h>
//#include "stdlib.h"
//#include "string.h"
//#include "c2.h"
struct LinkList* CreateLianBiao(void)
{
    int i = 0;
    struct LinkList list0, list1, list2, list3, list4, list5, * head=NULL, * p;
    while(i<5){
         p = (struct LinkList*)malloc(sizeof(struct LinkList));
         p->data = i + 1;
         if (head == NULL) {
             head = p;
             head->next = NULL ;
         }else{
            p->next = head;
            head = p;
         }
         i++;
    }
    /*list0.data = 0;//这里定义list0 list 1...都是变量,他们的作用域仅限在函数体内,退出函数这些变量就销毁了。
    list0.next = &list1;
    list1.data = 1;
    list1.next = &list2;
    list2.data = 2;
    list2.next = &list3;
    list3.data = 3;
    list3.next = &list4;
    list4.data = 4;
    list4.next = &list5;
    list5.data = 5;
    list5.next = NULL;
    head = &list0;*/
    //在这里打印正常
    p = head;
    do
    {
        printf("%d ", p->data);
        //i = i + 1;
        p = p->next;
    } while (p != NULL);
    return head;
}
void Print(struct LinkList* head)
{
    int i = 0;
    struct LinkList* p;
    p = head;
    if (head != NULL)
    {
        do
        {
            printf("%d ", p->data);
            i = i + 1;
            p = p->next;
        } while (p != NULL);
    }
    printf("\n\nlength is %d \n\n", i);
}