创建一个静态链表并输出,在创建链表的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);
}