C语言:给函数传值和传指针

本文详细解析了C语言中链表的初始化及插入操作,包括常见错误与正确实现方式。通过具体代码示例,解释了传值与传指针的区别,并提供了两种正确的链表初始化方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

传值和传指针,其实都是传值

今天在完成数据结构作业时,一直无法给链表(带头结点)插入新节点,一度以为是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);     //传入指针的值
}

分析:

  1. 传值和传指针,其实都是传值,因此InitList(L)中‘L’指的是结构体指针L的值,既结构体L的地址。
  2. 指针本身也是一个变量类型,无论变量如何,都应该使用地址传参,使用取地址符&
  3. 如果实参类型是指针,那么形参应该是指向指针的指针

写法一:曲线救国,通过函数返回指针

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);    
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值