自己关于C语言链表部分的一些误解。

自己在写链表尾插代码的时候,出现了一个逻辑上的错误,还是请教大佬才理解了这个问题,最后还是感谢大佬给我的帮助。

代码如下:

#include<stdio.h>
#include<stdlib.h>

typedef struct node
{
int ID;
char name[10];//数据域

struct node* next;//指针域

}NODE,*PNODE;

void print(PNODE head)//打印函数
{
PNODE p;
p = head;
if (head->next == NULL)
{
printf("链表无数据\n");
}
while ((p->next) != NULL)
{
printf("内部数据,ID:%d\t名字:%s\n", (p->next)->ID, (p->next)->name);
p = p->next;
}

}

void insertNode(PNODE head)//增加结点
{
PNODE temp = (PNODE)malloc(sizeof(NODE));//申请堆空间
printf_s("请输入学号,名字\n");
scanf_s("%d %s", &temp->ID, temp->name, 10);
getchar();
temp->next = NULL;
PNODE p;
p = head;
while (p != NULL)
{
p = p->next;
}
p= temp;//没有链接到结点


//PNODE p;
//p = head;
//while ((p->next) != NULL)
//{
// p = p->next;
//}
//p->next = temp;//链接到结点

}

int main()
{
PNODE head = (PNODE)malloc(sizeof(NODE));//创建头指针
head->next = NULL;
for (int i = 0; i < 1; i++)
{
insertNode(head);
}
print(head);
getchar();
return 0;

}

注意红色字体代码的部分,这个就是我自己在写代码写出的错误代码。

我自己以为将新定义的结构体p指针指向链表的head(头指针)的next(指针域),就是可以将p指向链表的第一个结点,然后在写循环找到最后一个结点的时候把循环条件写成了p!=NULL;虽然这样看起来是正确的,但是经不起仔细思考,因为链表在链接结点的时候是将p的地址存放在p->next中,这样会使循环跳出时p==NULL;然后在下面赋值的时候无论是赋值p=temp(新增结点的首地址);还是p->next=temp;都会出现错误。

p=temp这个写出的肯定是错的,这个就是自己没有理解清楚的地方,因为增加结点只能将新增结点的首地址存放在前一个结点的指针域中,应该写成p->next=temp;这样写才是链表在增加结点的正确写法。

但是在我自己写的代码中p->next=temp;也是会出错,刚才已经提到,在跳出循环的时候p==NULL;所以下面赋值语句的时候p就不可能去引用p的next,p里面是空的,所以这个会出现一个nullptr错误;下面是两种错误截图;






所以这个代码在写的时候逻辑就是有问题的,正确的写法应该是红色字体下面的注释部分;


这是我自己的一些理解,有错误的地方希望大佬们不吝指教。感谢!


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值