传值和传指针,其实都是传值
今天在完成数据结构作业时,一直无法给链表(带头结点)插入新节点,一度以为是ListInsert函数写错了,最后在leetcode群里提问才知道,原来是InitList函数的问题
#include <stdio.h>
#include <malloc.h>
typedef int ElemType;
typedef struct LNode{
ElemType data;
struct LNode *next;
}LinkList;
LinkList * InitList(LinkList *L){
L=(LinkList *)malloc(sizeof(LinkList));
L->next=NULL;
return L;
}
LinkList * ListInsert(LinkList *L,int n,ElemType e){
LinkList *temp=L;
int i;
for(i=1;i<n;i++){
if(temp==NULL){
printf("插入位置无效\n");
return L;
}
temp=temp->next;
}
LinkList *s=(LinkList *)malloc(sizeof(LinkList));
s->data=e;
s->next=temp->next;
temp->next=s;
return L;
}
void DispList(LinkList *L){
LinkList *p=L->next;
while(p!=NULL){
printf("%d",p->data);
p=p->next;
}
}
int main()
{
LinkList *L;
printf("单链表的基本运算如下:\n");
printf(" (1)初始化单链表L\n");
L=InitList(L);
printf(" (2)依次插入10,20,30,40,50元素\n");
L=ListInsert(L,1,10);
L=ListInsert(L,2,20);
L=ListInsert(L,3,30);
L=ListInsert(L,4,40);
L=ListInsert(L,5,50);
printf(" (3)输出单链表L:");
DispList(L);
}
错误写法
void InitList(LinkList *L){
L=(LinkList *)malloc(sizeof(LinkList));
L->next=NULL;
}
int main()
{
LinkList *L; //定义指针变量
InitList(L); //传入指针的值
}
分析:
- 传值和传指针,其实都是传值,因此InitList(L)中‘L’指的是结构体指针L的值,既结构体L的地址。
- 指针本身也是一个变量类型,无论变量如何,都应该使用地址传参,使用取地址符:
&
- 如果实参类型是指针,那么形参应该是指向指针的指针
写法一:曲线救国,通过函数返回指针
LinkList * InitList(LinkList *L){
L=(LinkList *)malloc(sizeof(LinkList));
L->next=NULL;
return L;
}
int main()
{
LinkList *L;
L=InitList(L);
}
写法二:向函数传递指针变量的地址,通过函数修改其指向的内容
void InitList(LinkList **L){
*L=(LinkList *)malloc(sizeof(LinkList));
(*L)->next=NULL;
}
int main()
{
LinkList *L;
InitList(&L);
}