第一次写博客,记录一下自己在学习过程中遇到的一些问题,也算是自己的成长记录吧。
首先说一些自己遇到的问题吧。最近在练习单链表,可是在遍历输出链表的过程中遇到了循环不结束的情况,上代码:
#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); //初始化线性表