今天遇到一个问题:
#define true 1
#define false 0
#define ok 1
#define error 0
#define infeasible -1
#define overflow -2
#include<stdio.h>
#include<malloc.h>
typedef char ElemType;
typedef int Status;
typedef struct LNode
{
ElemType data;
struct LNode * next;
} LNode,*LinkList;
void CreateList_HeadInsert(LinkList L)//头插法
{
//建立带表头结点的单链表线性表L.
LinkList p;
char ch;
ch=getchar();
while(ch!='\n')
{
p=(LinkList)malloc(sizeof(LNode));
p->data=ch;
p->next=L->next;//插入第一个结点的时候L->next为null;
L->next=p;
ch=getchar();
}
}
void InitList(LinkList L)//初始化,创建头结点;
{
L=(LinkList)malloc(sizeof(LNode));//头指针指向刚分配的地址;
L->next=NULL;//创建一个带头结点的单链表;
}
void main()
{
LinkList L;
InitList(L);//初始化单链表;
CreateList_HeadInsert(L);//头插法建单链表
// p=L->next;
while(L->next!=NULL)
{
printf("%c",L->next->data);
L=L->next;
}
}
函数执行到creat函数,L->next=p;时,发生段错误。怎么修改也没找到错误原因;
后看到回复:函数调用是传值调用,初始化函数中重新分配内存,导致形参的值和实参的值不一致,也就是main函数中的L->next没有被设置为NULL.去掉内存分配后,实参的next和形参的next指向同一位置,形参的next的变化同时导致实参的next的变化.
恍然大悟:在initlist初始化函数中,把指针L作为形参传到函数中的只是指针L的值,在函数中只能调用,但是不能修改。
malloc申请内存,即修改了指针的值,指向了别处,对指针L操作不在起左右,以后要避免这样的错误;
修改函数如下:
#include<stdio.h>
#include<malloc.h>
#include <string.h>
#include <stdlib.h>
#define true 1
#define false 0
#define ok 1
#define error 0
#define infeasible -1
#define overflow -2
typedef char ElemType;
typedef int Status;
typedef struct LNode
{
ElemType data;
struct LNode * next;
} LNode,*LinkList;
LinkList head; //定义头指针
void CreateList_HeadInsert(LinkList L)//头插法
{
//建立带表头结点的单链表线性表L.
LinkList p;
char ch;
ch=getchar();
while(ch!='\n')
{
p=(LinkList)malloc(sizeof(LNode));
p->data=ch;
//p->next=L->next;//插入第一个结点的时候L->next为null;
p->next = NULL;
L->next=p;
L = p;
getchar();//注意,此处添加getchar()吸收回车符;
ch=getchar();
}
}
/*
*函数调用是传值调用,初始化函数中重新分配内存,导致形参的值和实参的值不一致
void InitList(LinkList L)//初始化,创建头结点;
{
L=(LinkList)malloc(sizeof(LNode));//头指针指向刚分配的地址;
L->next=NULL;//创建一个带头结点的单链表;
}
*/
void main()
{
LinkList L;
L=(LinkList)malloc(sizeof(LNode));//头指针指向刚分配的地址;
L->next=NULL;//创建一个带头结点的单链表;
head = L;
// InitList(L);//初始化单链表;
CreateList_HeadInsert(L);//头插法建单链表
// p=L->next;
while(L->next!=NULL)
{
printf("%c",L->next->data);
L=L->next;
}
putchar('\n');
}
执行:
[root@bogon home]# ./t5
q
w
e
r
t
qwert