c函数调用中指针传递问题

第一次写博客,记录一下自己在学习过程中遇到的一些问题,也算是自己的成长记录吧。

首先说一些自己遇到的问题吧。最近在练习单链表,可是在遍历输出链表的过程中遇到了循环不结束的情况,上代码:

#include<stdio.h>
#include<stdlib.h>
//定义单链表节点类型
typedef struct LNode
{
	int data;
	struct LNode *next;						//指针指向后继结点
} SLink;

//初始化线性表,即将表头结点的表头指针指向为空(NULL)
void InitLink(SLink *head)
{
	s = (SLink *) malloc (sizeof(SLink));	//分配空间,类型强制转化为结构指针
	head->next = NULL;
	//printf("%d\n",s->next);
	printf("初始化成功!\n");
}

//建立线性表,输入n个int型变量
void CreateLink(SLink *head,int n)
{
	SLink *tmp;								//创建临时变量
	//SLink *l;
	//l = (SLink *) malloc(sizeof(SLink));
	//l = head;
	for( ; n > 0; n --){
		tmp = (SLink *) malloc(sizeof(SLink));
		if(tmp == NULL){
			exit(0);						//如果申请失败就停止程序
		}

		printf("请输入第%d个数据:",(6-n));
		scanf("%d",&(tmp->data));
		//tmp->next = l->next;				//顺序输入
		//l->next = tmp;
		//l = tmp;

        tmp->next = head->next;				//逆序输入
        head->next = tmp;
	}

	printf("建立线性表成功!\n");
}

//打印线性表,链表的遍历
void PrintLink(SLink *head)
{
	SLink *l;
	l = head->next;
	while(l != NULL){
		printf("%d,%d\n",l->data,l);
		l = l->next;
	}

	printf("打印线性表成功!\n");
}

int main()
{
	SLink *head;							//定义头结点(结构指针)
	InitLink(head);							//初始化线性表

	CreateLink(head,5);						//建立线性表

	PrintLink(head);						//打印线性表
	return 0;
}
怎么也没有发现问题出在哪里,后来经过同学的帮助,终于发现问题出在哪里了,原来是在初始化头结点上出现了问题。


初始化函数:

//初始化线性表,即将表头结点的表头指针指向为空(NULL)
void InitLink(SLink *head)
{
	head = (SLink *) malloc (sizeof(SLink));	//分配空间,类型强制转化为结构指针
	head->next = NULL;
	//printf("%d\n",head->next);
	printf("初始化成功!\n");
}


调用函数的语句:

SLink *head;							//定义头结点(结构指针)
InitLink(head);							//初始化线性表
其实函数调用过程中,实参传递的指针的值,在函数接受到实参的值后会将实参的值赋给形参,这也就说实参和形参是两个不同的变量。

可是我的初始化函数中,分配空间后将空间的地址的赋给了形参head,也就是说形参的值发生了改变,可是实参的值没有发生改变,实参的地址还是NULL的地址,那么此次初始化也就没有成功,所以在遍历输出的过程中出现了循环不结束的场景。


解决方案:将申请空间的地址返回,这样才真正的进行了初始化。

初始化函数代码:

//初始化线性表,即将表头结点的表头指针指向为空(NULL)
SLink * InitLink(SLink *head)
{
	head = (SLink *) malloc(sizeof(SLink));	//分配空间,类型强制转化为结构指针
	head->next = NULL;
	printf("初始化成功!\n");
	return head;
}


调用代码:

SLink *head;							//定义头结点(结构指针)
head = NULL;
head = InitLink(head);							//初始化线性表






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值