数据结构初始化链表时,一定要用&符吗

#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
typedef int Elemtype;
typedef struct Lnode{
Elemtype data;
struct Lnode *next;
}Lnode,*Linklist;
int InitList_Sq(Linklist L){ // 构造一个空的线性表L
L=(Linklist)malloc(sizeof(struct Lnode));
if(!L)exit(0);
L->next=NULL;
return 1;
}

int ListInsert_L(Linklist L,int i,Elemtype e){
Linklist p;
Lnode *s;
p=L;
int j=0;
while(p&&j<i-1){
p=p->next;
j++;
}
if(!p||j>i-1) return -1;
s=(Linklist)malloc(sizeof(struct Lnode));
s->data=e;
s->next=p->next;
p->next=s;
return 0;
}

int Input(Linklist L){
L=L->next;
printf("链表L为:");
while(L){
printf("%d ",L->data);
L=L->next;
}
}
int main(){
Linklist L;
int i,j;
InitList_Sq(L);
for(i=1;i<=5;i++){
ListInsert_L(L,1,i);
}
Input(L);
}
这个程序结果运行出错。

下面一个正确:

#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
typedef int Elemtype;
typedef struct Lnode{
Elemtype data;
struct Lnode *next;
}Lnode,*Linklist;
int InitList_Sq(Linklist *L){ // 构造一个空的线性表L
(*L)=(Linklist)malloc(sizeof(struct Lnode));
if(!(*L))exit(0);
(*L)->next=NULL;
return 1;
}
int ListInsert_L(Linklist L,int i,Elemtype e){
Linklist p;
Lnode *s;
p=L;
int j=0;
while(p&&j<i-1){
p=p->next;
j++;
}
if(!p||j>i-1) return -1;
s=(Linklist)malloc(sizeof(struct Lnode));
s->data=e;
s->next=p->next;
p->next=s;
return 0;
}

int Input(Linklist L){
L=L->next;
printf("链表L为:");
while(L){
printf("%d ",L->data);
L=L->next;
}
}
int main(){
Linklist L;
int i,j;
InitList_Sq(&L);
for(i=1;i<=5;i++){
ListInsert_L(L,1,i);
}
Input(L);
}
个人觉得第一个程序逻辑上也没有出错,是我对&的理解不深刻吗,贵请大神指教。

第1个回答  2013-03-30
是对指针和LinkList的理解不对,
{
Linklist L;
int i,j;
InitList_Sq(L);
}
时,会把L的赋值给形参。
而你的函数里L=(Linklist)malloc(sizeof(struct Lnode));重新开辟了空间。函数里的L改变了,而main函数里的L没有改变。
有三种解决方法。
1.你下面的程序
2.在c++里可以用传递引用来改变
3.把L返回,
Linklist InitList_Sq(){ // 构造一个空的线性表L
Linklist L;
(*L)=(Linklist)malloc(sizeof(struct Lnode));
if(!(*L))exit(0);
(*L)->next=NULL;
return L;
}
main()
{
Linklist L = InitList();
}本回答被提问者采纳
相似回答